Chcę, aby wygenerować nazwane funkcje z fn i zwrócić je z makra, próbowałem następujący przykład:Clojure fn nazwy wycieka poza jej zakresem gdy kompilowany na przodzie-of-time
(defmacro getfn
[namestr children]
`(fn fn-name# []
(println "Recursing" ~namestr)
(doall (map (fn [child#] (child#)) ~children))))
(def foo (getfn "foo" []))
(def bar (getfn "bar" [foo]))
(defn -main [& args]
(bar))
Wynikiem jest zazwyczaj zgodnie z oczekiwaniami:
Recursing bar
Recursing foo
jednak gdy uruchamiam ten opracowano na przodzie-of-time (AOT) uzyskać:
Recursing bar
Recursing bar
...
Recursing bar
Recursing bar
Exception in thread "main" java.lang.StackOverflowError
Uważam, że to dość dziwne, że pasek ciągle nazywa się sobą zamiast foo, jedynym sensownym powodem jest to, że wygenerowany symbol wycieka poza jego zasięg. Czy jest to błąd w Clojure lub w zamierzonym działaniu?
Aktualizacja: Dla jasności należy wspomnieć, że usunięcie fn-name#
symbol i co funkcja anonimowa poprawki ten problem. Jednak w moim prawdziwym kodzie muszę czasem wywoływać go rekurencyjnie, więc nazwanie go jest konieczne.
Problem związany z rozwiązaniem problemu: http://dev.clojure.org/jira/browse/CLJ-1330 –