【发布时间】:2019-01-28 05:57:28
【问题描述】:
我终于在学习 Box2D(使用 cljbox2d port)。在我的“hello world 测试”中,我发现需要一个函数来检查框列表,销毁并从列表中删除超出范围的框。
我写的处理这个的基本函数是*:
(defn handle-out-of-bounds! [boxes]
(filterv (fn [{:keys [body]}]
(when-not (inbounds? (bc/position body))
(bc/destroy! body)))
boxes))
这里需要注意的是destroy!,顾名思义,会产生副作用。
我决定检查一下filterv 的来源,因为我实际上从未有过,并注意到文档字符串有警告:
。 . . pred 必须没有副作用。
为什么? filter 我可以看到。它是惰性的,因此除非您明确强制评估,否则您无法保证谓词实际上会在任何给定点运行。 filterv 是对列表的严格缩减;内部使用瞬态向量。唯一值得怀疑的是使用瞬变,但我看不出这会产生什么影响。
有没有实际上在filterv的谓词中不执行副作用的有效理由,或者仅仅是一个概念上的理由?
* 写完才发现我的逻辑不对,这个函数实际上已经坏掉了,不过这不是重点。我也可以分别处理销毁和删除,但同样,这不是问题。
【问题讨论】:
标签: clojure side-effects