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))