Clojure函数的四种方式

228 阅读2分钟

Perl可能创造了TMTOWTDI(有不止一种方法),但Clojure采用了这一想法,并在这方面走得很远。

今天,我想快速向你展示在Clojure中创建一个函数的四种方法。

每个代码块将定义一个doubler ,该函数只是将其给定的整数参数加倍。

defn

这基本上是在Clojure中定义一个函数的标准方式:名称、args、函数体:

(defn doubler [n] (* 2 n))

def 和 fn

(def doubler (fn [n] (* 2 n)))

这是对defn 的一种粗略的变体,本质上是defn 在幕后所做的事情。这里我们有一个匿名函数(fn 绑定到一个名字上的def )。

函数字面意义

Clojure还允许用比fn 更短的语法来定义函数。# 字符可以定义函数字面。使用这种语法,你不能有命名的参数,而是得到位置引用,例如%1 %2 %3

(def doubler #(* 2 %1))

使用局部

现在它变得有趣了。Clojure提供了最奇妙和优秀的partial 函数。partial 函数接受一个函数和一些参数,并返回一个新的函数,该函数用最初给定的参数加上任何剩余的必要参数来调用原始函数。

啊,这很难解释,所以我将展示一下:这是doubler ,使用partial

(def doubler (partial * 2))

那里发生了什么?

def doubler 只是简单地分配了名称,所以让我们忽略它。

真正有趣的地方是

(partial * 2)

partial 的调用接受了一个函数* 和一个参数2 ,并返回一个新的函数,该函数将接受更多的参数来提供给(* 2) 的调用。

这个新函数接受它所给的任何参数,并将它们提供给(* 2) ,就像我们直接调用它一样。

(def doubler (partial * 2))

(doubler 10)  ; => 20 == (* 2 10)
(doubler 3 4) ; => 24 == (* 2 3 4)

你可以看到它与前两个doubler 函数不太一样,因为它接受任何数量的参数。这就是partial 的力量和灵活性。