2014-07-01 27 views

Odpowiedz

8

Teoretycznie nie powinno to nawet skompilować Kompilator powinien narzekać, że do nie może zostać rozwiązany, ponieważ jest to specjalny symbol nie w pierwszym.. stanowisko formularza.

jest to (prawdopodobnie niezamierzoną) konsekwencją przy użyciu tego samego BodyExpr parsing code zarówno dla do szczególną formę i ciało fn* specjalnym formularzu. Podczas kompilowania do specjalny formularz, wiodący do jest usuwany, a pozostałe formularze kompilowane. Korzystanie z tego samego analizatora składni dla funkcji oznacza, że ​​pojedynczy nagi do może pojawić się jako pierwszy.

public static class BodyExpr implements Expr, MaybePrimitiveExpr{ 

    ... 

    public Expr parse(C context, Object frms) { 
     ISeq forms = (ISeq) frms; 
     if(Util.equals(RT.first(forms), DO)) 
      forms = RT.next(forms); 

    .... 

Zauważysz, że jeśli do powtarza, to

(defn g [] do do (println 10) (println 20)) 
;=> CompilerException java.lang.RuntimeException: 
     Unable to resolve symbol: do in this context ... 

robi nie kompilacji, jak oczekiwano.

+0

Dzięki. Więc jest wyraźnie zakodowany wyjątek. Każdy pomysł, dlaczego? – Tim

+0

@Tim Zobacz edycję. Jest to konsekwencja (prawdopodobnie niezamierzona) użycia tego samego parsera zarówno w przypadku specjalnej formy "do", jak i treści specjalnej formy funkcji, "fn *". –

+0

Jak dziwnie ... oczekiwałbym czegoś takiego: '=> ((fn [] println println)) ;; # ', ale ten wyjątek zdaje się dotyczyć wszystkich specjalnych formularzy. '((fn [] if))', na przykład, zgłasza ten sam RTE. – dsm

Powiązane problemy