2017-06-10 15 views
2

は、私は、次のコードを持っている:テスト結果とcondの結果の両方でどのように結果を使用できますか?

(cond 
    (case-1? (compute-1 x)) (compute-1 x) 
    (case-2? (compute-2 x)) (compute-2 x) 
    (case-3? (compute-3 x)) (compute-3 x)) 

は私がcompute-1compute-2、およびcompute-3の繰り返し計算を避けたいです。 1つのオプションは次のとおりです。

(let [result-1 (compute-1 x) 
     result-2 (compute-2 x) 
     result-3 (compute-3 x)] 
    (cond 
    (case-1? result-1) result-1 
    (case-2? result-2) result-2 
    (case-3? result-3) result-3)) 

は今、私は計算を繰り返すことではないんだけど、今(case-1? result-1)がtrueと評価代わり場合、result-2result-3は理由もなく計算しました。

(let [result-1 (compute-1 x)] 
    (if (case-1? result-1) 
    result-1 
    (let [result-2 (compute-2 x)] 
     (if (case-2? result-2) 
     result-2 
     (let [result-3 (compute-3 x)] 
      (if (case-3? result-3) 
      result-3)))))) 

しかし、このコードは明らかに急速に管理不能になってきている。
行動的には、私はこのような何かをしたいです。この問題の解決策はありますか?

+0

マクロまたは外部depを必要としない場合は、計算を避けるために 'delay'を使用できます。 – ClojureMostly

答えて

3

better condと呼ばれるライブラリがあり、その問題をマクロで正確に解決しています。

それはこのように使われています:あなたの最後の例と同様のコードにマクロ展開されますスニペット

(ns foo.core 
    (:require 
    [better-cond.core :as b])) 

(b/cond 
    :let [result-1 (compute-1 x)] 
    (case-1? result-1) result-1 

    :let [result-2 (compute-2 x)] 
    (case-2? result-2) result-2 

    :let [result-3 (compute-3 x)] 
    (case-3? result-3) result-3) 

関連する問題