定义函数

Table of Contents

1 辅助变量(auxiliary variables)

&aux参数,类似let*:

CL-USER> (defun auto+1 (n &aux (x (1+ n))) x)
AUTO+1
CL-USER> (auto+1 1)

2 关键字参数为什么不用符号

当调用函数时使用关键字参数,而不是符号,如:

(make-hash-table :test 'equal)

而不是:

(make-hash-table 'test 'equal)

因为关键字参数在keyword命名空间中,这样任何package里的表达式都可以调用。

如下代码:

(defun noise (animal)
  (case animal
    (:dog :woof)
    (:cat :meow)
    (:pig :oink)))

如果改写成:

(defun noise (animal)
  (case animal
    ('dog :woof)
    ('cat :meow)
    ('pig :oink)))

在其他包里的代码无法正常工作,因为这个函数中的如'dog、'cat都是从当前包中取得。

3 函数多值返回

values:返回多个值

[3]> (values 1 2 3)
1 ;
2 ;
3

如果用在函数调用,是取的返回的第一个值:

[4]> (+ (values 1 2 3) 2)
3

(multiple-value-bind (symbol*) expression*):将返回的多个值绑定到符号上。

[9]> (defun foo () (values 1 2 3))
FOO
[10]> (multiple-value-bind (a b c) (foo) (print (+ a b c)))
6
6

(multiple-value-list expression):返回的多个值组合成一个列表

[11]> (multiple-value-list (foo))
(1 2 3)

(multiple-value-call function expression*):调用function,并把expression返回的多值作为参数

[5]> (defun foo () (values 1 2 3))
FOO
[6]> (multiple-value-call #'+ (foo))
6