状態を保持するためだけに一時変数を作成している let で、このようなコードになることがよくあります。それを行うより良い方法は何ですか?
e は一時的なものですが、連続する let 形式で c と d が必要なため、thrush 演算子は役に立ちません。
(let [[c d] (sum [a b])
e (if (even? c) c 0)
f (+ s e)]
.....
)
状態を保持するためだけに一時変数を作成している let で、このようなコードになることがよくあります。それを行うより良い方法は何ですか?
e は一時的なものですが、連続する let 形式で c と d が必要なため、thrush 演算子は役に立ちません。
(let [[c d] (sum [a b])
e (if (even? c) c 0)
f (+ s e)]
.....
)
これは私にはうまく見えます。「状態」は実際には状態ではありません - 関連する副作用はありません。に多くのバインディングがありlet
、それらの依存関係を追跡するのが難しくなると、問題が発生する可能性がありますが、それは複雑なコードの一般的な特性であり (duh)、このパターンに固有のものではありません。
このパターンには問題はありません。この場合、さまざまな操作を直接構成できないため、一時変数を作成する必要があります。したがって、一時変数を使用してそれらを機能させます。
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]))))]
...)
私の観点からは、これはかなり明確な「関数型」コードのように見えます。名前が少し短いことを除けば、何も問題はないと思います;-)
おそらくより多くの文脈が建設的な提案につながるでしょうか?