我经常在这样的代码中结束,我在其中创建临时变量只是为了保持状态。有什么更好的方法呢?
画眉运算符无济于事,因为尽管 e 是临时的,但我仍然需要 c 和 d 在连续的 let 形式中。
(let [[c d] (sum [a b])
e (if (even? c) c 0)
f (+ s e)]
.....
)
我经常在这样的代码中结束,我在其中创建临时变量只是为了保持状态。有什么更好的方法呢?
画眉运算符无济于事,因为尽管 e 是临时的,但我仍然需要 c 和 d 在连续的 let 形式中。
(let [[c d] (sum [a b])
e (if (even? c) c 0)
f (+ s e)]
.....
)
这对我来说看起来不错。“状态”并不是真正的状态——没有任何副作用。如果其中有很多绑定let
并且它们的依赖关系变得难以追踪,那可能会变得很糟糕,但这是复杂代码的一般属性(duh),而不是特定于这种模式。
我认为这种模式没有任何问题。在这种情况下,您需要创建临时变量,因为各种操作不能直接组合,因此您使用临时变量来使它们工作。
我看到了几种可以重组它的方法。我不认为客观上比你写的更好,但我会发布它作为思考的食物。
(let [c (first (sum [a b]))
f (+ s (if (even? c) c 0))]
...)
或这个
(defn evenz [n]
(if (even? n) n 0))
(let [f (+ s (evenz (first (sum [a b]))))]
...)
从我的角度来看,这看起来像是相当清晰的“功能风格”代码。我认为它没有任何问题,只是名称有点短;-)
也许更多的背景会导致建设性的建议?