我认为 {{:when}} 的意义可能会存在设计上的模糊性。特别是,在以下人为编造的例子中
(for [n nat
v (vec (return n))
:let [sum (reduce + v)]
:when (pos? sum)]
v)
In my default design this can hang, for the same reason that this code can hang
In my default design this can hang, for the same reason that this code can hang
(绑定 nat
(fn [n]
(such-that
(fn [v] (pos? (reduce + v)))
(vector (return n)))))
但它也可以这样写
(such-that
(fn [v] (pos? (reduce + v)))
(bind nat (fn [n] (vector (return n)))))
所以问题在于是对前面的生成器仅应用 {{:when}} 过滤器,还是对所有的前面生成器都应用。我有一个模糊的概念,认为后者在某些情况下可能效率更低,但我不太确定具体是什么。因此,我认为我们的选择是
# 决定始终以一种方式或另一种方式执行
提供第三个关键字 ({{:when-all}}?),具有不同的行为
不编写这个宏,因为它太难以理解
我个人倾向于选择选项 1,只对前面的生成器应用 :when。