4

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

画眉运算符无济于事,因为尽管 e 是临时的,但我仍然需要 c 和 d 在连续的 let 形式中。

(let [[c d] (sum [a b])
      e     (if (even? c) c 0)
      f     (+ s e)]
   .....
  )
4

4 回答 4

3

这对我来说看起来不错。“状态”并不是真正的状态——没有任何副作用。如果其中有很多绑定let并且它们的依赖关系变得难以追踪,那可能会变得很糟糕,但这是复杂代码的一般属性(duh),而不是特定于这种模式。

于 2012-06-21T09:37:42.333 回答
2

我认为这种模式没有任何问题。在这种情况下,您需要创建临时变量,因为各种操作不能直接组合,因此您使用临时变量来使它们工作。

于 2012-06-21T05:49:02.913 回答
1

我看到了几种可以重组它的方法。我不认为客观上比你写的更好,但我会发布它作为思考的食物。

(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]))))]
  ...)
于 2012-06-21T13:42:10.003 回答
1

从我的角度来看,这看起来像是相当清晰的“功能风格”代码。我认为它没有任何问题,只是名称有点短;-)

  • 用 let 给所有东西命名可能会使代码更大,虽然更容易学习
  • 即使在 clojure 源代码中,在 let 中使用条件也很常见
  • let 语句的格式是正常的。

也许更多的背景会导致建设性的建议?

于 2012-06-21T21:50:20.303 回答