2016-09-23 2 views
0

Я новичок в clojure. Попробуйте упражнение из «Clojure for Brave and True».Являются ли эти два подхода к созданию функций одинаковыми?

Цель состоит в том, чтобы сделать функцию dec9, которая может использоваться как: (dec9 10) будет вычитать 10 на 9 и вернуть результат.

Не могли бы вы прокомментировать, какой «производитель декментора» вы напишете, если бы вы были?

Я включаю в себя два стиля и их результат ответа.

(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) и создать новую функцию для каждого использования 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. – rowingRower