5

次の s-exp が与えられます。

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

算術演算をインライン化できるという事実を無視すると、tempこのような再バインドは Clojure で好ましくないのでしょうか? なぜ/なぜしないのですか?

4

3 に答える 3

8

これは、例の条件付きスレッド マクロの定義で core.clj で使用されます。値の構成をセグメントに分割することで、人間が使用できることが明確になる場合、これはこのパターンの優れた使用法であると自信を持って言えます。

多くの Clojurians が「再結合」という言葉を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は、多くの場合、スレッド化マクロの 1 つを使用して表現できます。次の式は、質問の式と同等です。

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

この特定の式は明らかにさらに単純化できますが、多くの->場合->>、シンボルの再利用 (再バインド) による読みやすさと、ネスト (再バインドを巨大なネストされた式に置き換えた場合に発生) による読みづらさの間の適切な場所に到達します。

于 2013-05-24T19:43:29.377 に答える