一.函数声明
使用defun宏创建函数,一个典型函数的格式如下:
(defun name (parameter)
"function document."
functionbody)
我们可以定义一个实现两个数相加的函数:
#!/usr/bin/env clisp
(defun verbose-sum (x y)
;函数的document
"Sum two numbers."
(format t "Sum ~d and ~d.~%" x y)
(+ x y))
我们可以通过documentation函数获取函数的document,函数的最后一个表达式将作为返回值返回。
(print (documentation 'verbose-sum 'function))
二.函数参数
1.可选形参
在函数列表中将可选的形参放在&optional实现,例子如下
#!/usr/bin/env clisp
(defun foo (a b &optional c d)
(list a b c d))
;传递四个参数
(print (foo 1 2 3 4))
;传递两个参数
(print (foo 1 2))
一定要注意,在使用&optional的情况下,如果传递的参数个数超过函数参数列表中的参数个数,将会报错
当然我们也可以使用默认参数值,例子如下:
#!/usr/bin/env clisp
(defun foo (a &optional (b 10))
(list a b))
;传递b的情况
(print (foo 1 2))
;不传递b的情况,将使用默认值10
(print (foo 1))
2.剩余参数
使用可选参数时,如果传递的参数个数大于参数列表参数个数将会报错,而使用剩余参数则不会,剩余参数使用&rest定义,例子如下:
#!/usr/bin/env clisp
(defun foo (a b &rest values)
(list a b values))
;rest后的参数将构成一个新的列表
(print (foo 1 2 3 4))
内置函数中一个典型的例子就是format函数。
3.关键字参数
有时我们需要通过关键字从一个列表中获取或设置列表中某个索引的值,此种情况就可以用关键字参数,关键参数使用&key定义,例子如下:
#!/usr/bin/env clisp
(defun foo (&key a b c)
(list a b c))
;通过关键字从列表中获取值
(print (foo :a 1 :c 3))
三.函数返回值
函数返回值使用return-from特殊操作符号,如果不指定return-from则以函数中最后一个列表的求值作为返回值,例子如下:
#!/usr/bin/env clisp
(defun use-return(x y)
(return-from use-return (+ x y)))
(defun unuse-return(x y)
(+ x y))
;输出调用结果
(print (use-return 10 10))
;输出调用结果
(print (unuse-return 10 10))
return-from第一个参数是要返回的代码块(block)的名字,这也有点不变,大多数情况下不需要使用return-form,而是使用默认的返回形式(最后一个列表求值作为返回值)