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返回空列表。

深入挖掘后,发现在懒惰序列上移除:once元数据后,我将获得预期的行为,即第二个prn也会抛出。

1 个答案

+2

关于这个问题过去的讨论版本是这样的。一般建议是:我们不保证在实现懒惰序列时抛出会做什么。如果你在你的懒惰序列中做有副作用的事情,可以考虑使用run!、loop/recur等。

请参见https://clojure.atlassian.net/browse/CLJ-2069,一个类似的条目。

...