Dlaczego ten kod działa?Dlaczego ten kod działa, mimo że nie ma otwartego klamry?
(defn g []
do (println 10) (println 20))
Uwaga: Nie ma (przed zrobienia
Dlaczego ten kod działa?Dlaczego ten kod działa, mimo że nie ma otwartego klamry?
(defn g []
do (println 10) (println 20))
Uwaga: Nie ma (przed zrobienia
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.
Dzięki. Więc jest wyraźnie zakodowany wyjątek. Każdy pomysł, dlaczego? – Tim
@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 *". –
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