4

状態を保持するためだけに一時変数を作成している let で、このようなコードになることがよくあります。それを行うより良い方法は何ですか?

e は一時的なものですが、連続する let 形式で c と d が必要なため、thrush 演算子は役に立ちません。

(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

I see a couple of ways you could reorganize it. I don't think either is objectively better than what you wrote though, but I will post it as food for thought.

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

Or this

(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 のソースでも、lets で条件を使用するのは一般的です。
  • let ステートメントの書式設定は正常です。

おそらくより多くの文脈が建設的な提案につながるでしょうか?

于 2012-06-21T21:50:20.303 に答える