【发布时间】:2015-11-10 15:27:38
【问题描述】:
我对@987654322@ 的行为有点疑惑。以下代码工作正常:
(if true
(let [x "whatever"]
(println "TRUE 1")
(println "TRUE 2")))
返回:
TRUE 1
TRUE 2
nil
但如果let 表达式被删除:
(if true
(
(println "TRUE 1")
(println "TRUE 2")))
它也返回一个NullPointerException:
TRUE 1
TRUE 2
NullPointerException user/eval8051 (NO_SOURCE_FILE:4)
我怀疑这是由于println 返回了nil。但是,为什么在引入 let 时它会起作用?有一个更好的方法吗?
【问题讨论】:
-
关于术语或发生的事情的一些技术点值得弄清楚:第一个表达式不返回
"TRUE 1"和"TRUE 2";它打印它们,并返回nil。由于您在 REPL 中执行此操作,因此也会打印返回值:"nil"会被打印。那么,您可能会认为,在第二个表达式中,只返回了NullPointerException,但这并不完全正确。例外不是if表达式的值;这是一个例外。它中断了表达式的计算。由于没有捕获,所以打印出来了。
标签: clojure