函數(shù)是一組一起執(zhí)行任務(wù)的語句。
可以把代碼放到單獨(dú)的函數(shù)。如何劃分代碼之前不同的功能,但在邏輯上劃分通常是這樣每個(gè)函數(shù)執(zhí)行特定的任務(wù)。
命名函數(shù)defun宏用于定義函數(shù)。該函數(shù)的defun宏需要三個(gè)參數(shù):
函數(shù)名稱
函數(shù)的參數(shù)
函數(shù)的體
defun語法是:
(defun name (parameter-list) "Optional documentation string." body)
讓我們舉例說明概念,簡單的例子。
例子 1
讓我們編寫了一個(gè)名為averagenum,將打印四個(gè)數(shù)字的平均值的函數(shù)。我們將會(huì)把這些數(shù)字作為參數(shù)。
創(chuàng)建一個(gè)名為main.lisp一個(gè)新的源代碼文件,并在其中輸入如下代碼:
(defun averagenum (n1 n2 n3 n4) (/ ( + n1 n2 n3 n4) 4)) (write(averagenum 10 20 30 40))
當(dāng)執(zhí)行的代碼,它返回以下結(jié)果:
25
示例 2
讓我們定義和調(diào)用函數(shù),將計(jì)算出的圓的面積,圓的半徑被指定作為參數(shù)的函數(shù)。
創(chuàng)建一個(gè)名為main.lisp一個(gè)新的源代碼文件,并在其中輸入如下代碼:
(defun area-circle(rad) "Calculates area of a circle with given radius" (terpri) (format t "Radius: ~5f" rad) (format t "~%Area: ~10f" (* 3.141592 rad rad))) (area-circle 10)
當(dāng)執(zhí)行的代碼,它返回以下結(jié)果:
請(qǐng)注意:
可以提供一個(gè)空的列表作為參數(shù),這意味著函數(shù)沒有參數(shù),該列表是空的,表示為()。
LISP還允許可選,多個(gè)和關(guān)鍵字參數(shù)。
文檔字符串描述了函數(shù)的目的。它與函數(shù)名相關(guān)聯(lián),并且可以使用文檔函數(shù)來獲得。
函數(shù)的主體可以包含任意數(shù)量的Lisp表達(dá)式。
在主體內(nèi)的最后一個(gè)表達(dá)式的值返回函數(shù)的值。
還可以使用返回 - 從特殊的運(yùn)算符函數(shù)返回一個(gè)值。
讓我們討論在簡要上述概念。點(diǎn)擊以下鏈接,了解詳細(xì)信息:
可以使用可選參數(shù)定義一個(gè)函數(shù)。要做到這一點(diǎn),需要把符號(hào)與可選的可選參數(shù)的名稱之前。
我們將只是顯示它接收的參數(shù)的函數(shù)。
示例
創(chuàng)建一個(gè)名為main.lisp一個(gè)新的源代碼文件,并在其中輸入如下代碼:
(defun show-members (a b &optional c d) (write (list a b c d))) (show-members 1 2 3) (terpri) (show-members 'a 'b 'c 'd) (terpri) (show-members 'a 'b) (terpri) (show-members 1 2 3 4)
當(dāng)執(zhí)行代碼,它返回以下結(jié)果:
(1 2 3 NIL) (A B C D) (A B NIL NIL) (1 2 3 4)
請(qǐng)注意,參數(shù)c和d是在上面的例子中,是可選參數(shù)。
有些函數(shù)需要采用可變數(shù)目的參數(shù)。
例如,我們使用格式化函數(shù)需要兩個(gè)必需的參數(shù),數(shù)據(jù)流和控制字符串。然而,該字符串后,它需要一個(gè)可變數(shù)目的取決于要顯示的字符串中的值的數(shù)目的參數(shù)。
同樣,+ 函數(shù),或 * 函數(shù)也可以采取一個(gè)可變數(shù)目的參數(shù)。
可以提供這種可變數(shù)目的使用符號(hào)與其余參數(shù)。
下面的例子說明了這個(gè)概念:
示例
創(chuàng)建一個(gè)名為main.lisp一個(gè)新的源代碼文件,并在其中輸入如下代碼:
(defun show-members (a b &rest values) (write (list a b values))) (show-members 1 2 3) (terpri) (show-members 'a 'b 'c 'd) (terpri) (show-members 'a 'b) (terpri) (show-members 1 2 3 4) (terpri) (show-members 1 2 3 4 5 6 7 8 9)
當(dāng)執(zhí)行代碼,它返回以下結(jié)果:
(1 2 (3)) (A B (C D)) (A B NIL) (1 2 (3 4)) (1 2 (3 4 5 6 7 8 9))
關(guān)鍵字參數(shù)允許指定哪個(gè)值與特定的參數(shù)。
它使用的是 &key 符號(hào)表示。
當(dāng)發(fā)送的值到該函數(shù)必須先于值 :parameter-name.
下面的例子說明了這個(gè)概念。
例子
創(chuàng)建一個(gè)名為main.lisp一個(gè)新的源代碼文件,并在其中輸入如下代碼:
(defun show-members (&key a b c d ) (write (list a b c d))) (show-members :a 1 :c 2 :d 3) (terpri) (show-members :a 'p :b 'q :c 'r :d 's) (terpri) (show-members :a 'p :d 'q) (terpri上一篇:LISP - 輸入和輸出下一篇:LISP - 數(shù)組