我刚开始玩 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
导致崩溃?