这两种功能创建方法是否相同?

时间:2016-09-23 19:20:16

标签: clojure

我是clojure的新手。尝试“勇敢和真实的Clojure”练习。

目的是制作一个dec9函数,可用作:(dec9 10) 它将减去10乘以9并返回结果。

如果是你,你可以评论一下你会写的“减量制造者”吗?

我包括两个样式及其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 个答案:

答案 0 :(得分: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"