【发布时间】:2011-01-24 14:28:36
【问题描述】:
我刚开始玩 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 会导致崩溃?
【问题讨论】: