Clojure let的这种用法有代码气味吗

Clojure let的这种用法有代码气味吗,clojure,Clojure,在let中,我经常以这样的代码结束,在这里我创建临时变量只是为了保存状态。有什么更好的方法 画眉操作符不会有帮助,因为虽然e是临时的,但我仍然需要连续let表单中的c和d (let [[c d] (sum [a b]) e (if (even? c) c 0) f (+ s e)] ..... ) 我认为这种模式没有任何问题。在这种情况下,您需要创建临时变量,因为各种操作不能直接组合,因此您需要使用临时变量使它们工作。我觉得这很好。“状态”并不

在let中,我经常以这样的代码结束,在这里我创建临时变量只是为了保存状态。有什么更好的方法

画眉操作符不会有帮助,因为虽然e是临时的,但我仍然需要连续let表单中的c和d

(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;)