2016-09-23 8 views
0

私はclojureに新しいです。 "Clojure for Brave and True"からエクササイズを試してみる。これらの2つのアプローチは同じですか?

目的は、(dec9 10) として使用できるdec9関数を作成し、10を9で減算して結果を返します。

「デクリメントメーカ」は、あなたが書いた場合、あなたがコメントしてください。

私は2つのスタイルとreplの結果を含んでいます。

(defn dec-maker 
    [num] 
    #(- % num)) 


(def dec9 
    (dec-maker 9)) 

-- 
user> (dec9 10) 
1 
-- 

(defn dec-maker 
    [num] 
    #(- % num)) 


(defn dec9 
    [target] 
    ((dec-maker 9) target)) 

-- 
user> (dec9 10) 
1 
-- 

答えて

1
(def dec9 
    (dec-maker 9)) 

上記のコードは、その機能がdec9に結合され、同一のがdec9にすべての連続した呼び出しのために使用されていることを唯一の機能を作成します。しかし:

(defn dec9 
    [target] 
    ((dec-maker 9) target)) 

これは(dec-maker 9)を実行し、1回だけ適用されdec9を使用するたびに新しい関数を作成します。したがって、これは本当に、それはかなりのと同じですので、dec-makerが提供する機能を使用していません。

(defn dec9 [target] 
    (- 9 target)) 

特定の操作の専門バージョンを作る機能を持つというアイデアはレキシカルスコープの言語での素敵な抽象化方法です。良い例は、プロシージャにアドオンを作ることです..

(defn safe-fun [fun pred default] 
    (fn [v] 
    (if (pred v) 
     (fun v) 
     (default v)))) 

(def sfirst (safe-fun first seq? identity)) 
(sfirst '(1 2 3)) ; ==> 1 
(sfirst "abc") ; ==> "abc" 
+0

ありがとう。私は、dec9が呼び出されるたびに新しい機能を無駄に作成しているという第2のアプローチを見ることができませんでした。 – rowingRower

関連する問題