匿名函数
一下用一个生成set的匿名函数来说明一下匿名函数的定义:
(fn [x y] ;包含参数的vector
(println "making a set ") ;函数体
#{x y} ) ;返回值表达式
所以匿名函数的调用方式
((fn [x y] (println "makding a set") #{x y}) 2 4)
使用def和defn生成具名函数
使用def生成具有名称的函数:
(def make-set (fn [x y] (println "makding a set") #{x y}))
这样是不是有点麻烦还要嵌套这么多,那么看下defn:
(defn make-set ; => 定义函数名
"take two value and make a set" ; => 一些说明文档
[x y] ; => 参数
(println "makding a set ") ;=> 函数体
#{x y}) ;=> 返回值表达式
不同参数数量的函数(暂时理解为函数的重载)具体如下:
(defn make-set
([x] #{x})
([x y] #{x y}))
这样可以根据参数的不同定义多个函数体,但是有一个问题,当输入三个参数的时候会报错,可以使用&符号:
(defn arity2+ [ first second & more]
(vector first second more))
结果:
(arity2+ 1 2) => [1 2 nil]
(arity2+ 1 2 3 4 ) => [1 2 3 4]
但是这种少了参数就会报错:
(arity2+ 1) => wrong number of args