函数

定义函数
(defn 函数名 [参数] (函数体))
调用函数
(函数名 参数)

例如

user=> (defn greet  name )
#'user/greet
user=> (greet "Tom")
"Hello, Tom"

函数重载

clojure的函数可以根据函数的参数个数不同定义不同函数体

user=> (defn greet
  #=>    ([] (greet "bro"))
  #=>    (name))
#'user/greet
user=> (greet)    ;无参数调用
"Hello, bro"
user=> (greet "Tom") ;一个参数调用
"Hello, Tom"

变参函数

当不确定参数个数的时候,可以用&在可变参数前面修饰

user=> (defn hello [greeting & who]
  #_=>   (println greeting who))
#'user/hello
user=> (hello "Hello" "world" "class")
Hello (world class)

匿名函数

只要把defn替换成fn,去掉函数名就变成了匿名函数

(fn  param )

使用

user=> ((fn param)  "Hello world!")
Hello world!

匿名函数还有一个种简写形式 函数体用#()表示 参数的表示形式为 * 单参数时用%表示 * 多参数用%1, %2, %3…表示 * 变参用%&表示

user=> (#(println %)  "Hello world!") ;等价于 ((fn param)  "Hello world!")
Hello world!
#(* %1 %2) ; 等价于 (fn x y)

#(println %&) ;等价于 (fn & zs)

用apply调用函数

语法为

(apply 函数名 参数 sequence)

注意apply函数的最后一个参数必须是sequence

(apply func "hi" '("Tom" "!!!")) ;等价于(func "hi" "Tom" "!!!")