В clojure макросы дают огромную мощность программисту. eval
также очень мощный. Между ними существуют некоторые тонкие различия. Надеюсь, что эта загадка покажет свет на эту тему.Clojure riddle: eval, макросы и пространства имен
(ns hello)
(defmacro my-eval [x] `~(read-string x))
(defn hello[] "Hello")
(defn run-stuff []
(println (hello))
(println (my-eval "(hello)"))
(println (eval (read-string "(hello)"))))
(ns main)
(try (hello/run-stuff)
(catch Exception e (println e)))
За 3 операторов внутри run-stuff
тела, что один вызывает исключение, и почему другие нет?
Я сформулировал следующую загадку после исследования этого прекрасного вопроса Clojure - (read-string String calling function. Спасибо @Matthias Benkard за разъяснения