Lisp 入门/第六章 定义函数
< Lisp 入門
第六章 自己定义函数
编辑DEFUN 操作符
编辑DEFUN操作符用来自定义函数,形式如下
(defun 函数名原子 参数名列表 执行列表)
比如
(defun 2nd (x)
(car (cdr x))
)
这样,我们就定义了一个函数,就像我们之前接触的很多操作符一样。这个函数的名称是 2nd,而它的作用就是 返回一个列表的第二个元素。
这个函数的名称后面是一个列表 (x) ,表示这个函数只接受一个x作为参数。紧接着是另一个列表 (car (cdr x)),表示这个函数作用于 x 身上就如同这个表达式的作用一样,返回值也是这个表达式作用于 x 之后的值。
让我们应用一下这个元素。
(2nd '(1 2 3))
会返回 2
函数的定义式中,有个x,是函数的参数,上面的这个函数的执行过程就相当于
(car (cdr '(1 2 3)))
参数
编辑参数就是我们第一个定义中的x,参数的个数是没有限制的。比如
(defun lianjie (x y)
(append x y)
)
这个函数的作用是连接两个表,因为它执行的是append函数。
系统自带的函数
编辑系统自带了很多函数,比如下面这两个函数:
First函数
编辑(first '(1 2 3))
1
返回参数列表的第一个所组成的值。
Last函数
编辑(last '(1 2 3))
(3)
没错,last函数的作用就是返回参数列表的最后一个所组成的表。注意,返回的是一个列表而不是一个原子。
第一个自定义函数
编辑我们将要定义一个函数 ends,它的作用是返回参数列表的头尾两个元素组成的列表。
如何实现呢,我们首先取出参数列表的第一个元素,然后取出最后一个元素,再将两者连在一起就行了。这要用到我们之前提到的 first 函数和 last 函数。
(defun ends (x)
(cons (first x) (last x))
)
这样,我们就定义完成了这个函数。分析一下定义体中的 (cons (first x) (last x)) 这是要连接两个元素,第一个元素是 x 的第一个元素,第二个元素是 last 函数所取出的表。其结果自然就是x的头和尾两个元素所组成的列表。
我们来试验一下:
(ends '(1 2 3))
(1 3)
上面的这个例子中,关键的一步相当于 (cons 1 '(3)) 。