5

给定的是这个 s-exp:

(let [temp 30
      temp (* temp 9/5)
      temp (+ temp 32)]
  temp)

忽略算术可以内联的事实,这样的重新绑定temp在 Clojure 中是否会令人反感?为什么/为什么不?

4

3 回答 3

8

这用于 core.clj 中条件线程宏定义的示例。如果将值的构造拆分为多个部分可以清楚地供人类消费,那么我会自信地说这是对这种模式的一种很好的使用。

值得注意的是,许多 Clo​​jurian 会将“重新绑定”这个词解释为使用bind函数。您正在准确地使用它,尽管它也有另一个含义。

于 2013-05-24T19:32:20.587 回答
3

这不是很实用——在let每个变量中都应该有意义。我会将其重构为:

(let [celsius 30
      fahrenheit-unnormalized (* celsius 9/5)
      fahrenheit (+ fahrenheit 32)
  fahrenheit)

(我忽略了更好的解决方案:)

(+ (* temp 9/5) 32)
于 2013-05-24T19:33:57.657 回答
2

内部重新绑定let通常可以使用线程宏之一来表示。以下表达式等效于问题中的表达式:

 (-> 30 (* 9/5) (+ 32))

这个特定的表达式显然可以进一步简化,但经常->->>在由于重用符号(重新绑定)导致的不可读性和由于嵌套导致的不可读性(如果用巨大的嵌套表达式替换重新绑定时发生)之间找到一个很好的位置。

于 2013-05-24T19:43:29.377 回答