Clojure将名称定义为乘数

时间:2015-06-10 10:59:28

标签: clojure defn

有没有人可以解释为什么在下面的代码中,函数的名称在第一部分中作为*(乘数)?

(defn bar
     ([a b]   (bar a b 100))
     ([a b c] (* a b c)))

bar两个(bar 2 3) (* 2 3 100)z == 1

2 个答案:

答案 0 :(得分:5)

如果稍微重新格式化,可能更容易看到发生了什么:

(defn bar
  ([a b]   (bar a b 100))
  ([a b c] (* a b c)))

这是一个具有多个arity的函数 - 也就是说,它接受多个参数集。第一个定义接受名为ab的两个参数,第二个定义接受名为abc的三个参数。当调用函数的第一个定义时,它会转向并调用函数的第二个定义,传入给定第一个定义的ab参数,并发送常量值100作为第三个论点。 bar的第二个定义只是使用它给出的三个参数,并使用(* a b c)将它们相乘。

希望这有帮助。

答案 1 :(得分:1)

您已经定义了一个具有两个重载的函数 - 第一个接受两个参数,第二个接受三个。双参数重载只调用三参数版本,其中100作为第三个参数。