Clojure let的这种用法有代码气味吗
在let中,我经常以这样的代码结束,在这里我创建临时变量只是为了保存状态。有什么更好的方法 画眉操作符不会有帮助,因为虽然e是临时的,但我仍然需要连续let表单中的c和dClojure let的这种用法有代码气味吗,clojure,Clojure,在let中,我经常以这样的代码结束,在这里我创建临时变量只是为了保存状态。有什么更好的方法 画眉操作符不会有帮助,因为虽然e是临时的,但我仍然需要连续let表单中的c和d (let [[c d] (sum [a b]) e (if (even? c) c 0) f (+ s e)] ..... ) 我认为这种模式没有任何问题。在这种情况下,您需要创建临时变量,因为各种操作不能直接组合,因此您需要使用临时变量使它们工作。我觉得这很好。“状态”并不
(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]))))]
...)
从我的角度来看,这看起来像是相当清晰的“函数式”代码。我看不出有什么不对,只是名字有点短;-)
- 用let给所有东西命名可能会使代码更大,但更容易学习
- 即使在clojure源代码中,在let中使用条件也是很常见的
- let语句的格式是正常的李>
也许更多的上下文会带来建设性的建议?闻起来好像是无效的clojure;)