以下代码让我略感惊讶
user> (def bla (filter #(throw (Exception. %)) ["lol" "foo"]))
;; => #'user/bla
user> (prn bla)
Execution error at sun.reflect.NativeConstructorAccessorImpl/newInstance0 (NativeConstructorAccessorImpl.java:-2).
lol
(
user> (prn bla)
()
;; => nil
user>
对def
不抛出异常是可以预料的,第一个prn
抛出异常也是可以预料的。
令人意外的是,第二个prn
返回空列表。
进一步挖掘后,我发现移除lazy-seq
上的:once
元数据,我得到了预期的行为,即第二个prn
也抛出异常。