在这个let的用法中有代码味道吗?

时间:2012-06-21 05:03:49

标签: clojure

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

画眉操作员不会帮助,因为虽然e是临时的,但我仍然需要连续的let形式中的c和d。

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

4 个答案:

答案 0 :(得分:3)

这对我来说很好看。 “国家”实际上并不是一个国家 - 没有任何副作用。如果let中存在大量绑定并且它们的依赖变得难以跟踪,那么它可能会变得很糟糕,但这是复杂代码(duh)的一般属性,而不是特定于此模式。

答案 1 :(得分:2)

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

答案 2 :(得分: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]))))]
  ...)

答案 3 :(得分:1)

从我的角度看,这看起来相当清晰“功能样式”代码。我发现它没有任何问题,只是名字有点短;-)

  • 为let命名,可能会使代码更大,但更容易学习
  • 即使在clojure源中,使用条件包也很常见
  • let语句的格式化是正常的。

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