请在2024 Clojure现状调查!中分享您的想法。

欢迎!请参阅关于页面,了解更多关于其如何工作的情况。

0
序列

以下代码让我略感惊讶

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也抛出异常。

1 答案

+2

此类问题的变体曾讨论过。一般建议是:我们不会为lazy-seqs在实现时抛出异常保证任何事情。如果您在lazy-seqs中进行副作用操作,请考虑使用run!、loop/recur等。

有关类似问题,请参阅https://clojure.atlassian.net/browse/CLJ-2069

...