跳至內容

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