Я только начал играть с Clojure, и я написал небольшой скрипт, чтобы помочь мне понять некоторые функции. Она начинается так:Confused by «let» in Clojure
(def *exprs-to-test* [
"(filter #(< % 3) '(1 2 3 4 3 2 1))"
"(remove #(< % 3) '(1 2 3 4 3 2 1))"
"(distinct '(1 2 3 4 3 2 1))"
])
Затем он проходит через *exprs-to-test*
, оценивает их всех, и печатает вывод так:
(doseq [exstr *exprs-to-test*]
(do
(println "===" (first (read-string exstr)) "=========================")
(println "Code: " exstr)
(println "Eval: " (eval (read-string exstr)))
)
)
Приведенный выше код все работает нормально. Однако, (read-string exstr)
повторяется, так что я пытался использовать let
устранить повторение так:
(doseq [exstr *exprs-to-test*]
(let [ex (read-string exstr)] (
(do
(println "===" (first ex) "=========================")
(println "Code: " exstr)
(println "Eval: " (eval ex))
)
))
)
Но это работает один раз для первого элемента в *exprs-to-test*
, а затем падает с NullPointerException
. Почему добавление let
вызывает крушение?
Это исправлено. Спасибо за отступы в стиле. –