鍍金池/ 教程/ Java/ LISP - 函數(shù)
LISP - 樹
LISP - 錯(cuò)誤處理
LISP - 謂詞
LISP - 決策
LISP - 變量
LISP - 數(shù)組
LISP - 對(duì)象系統(tǒng)(CLOS)
LISP - 輸入和輸出
Lisp教程
LISP - 數(shù)字
LISP - 循環(huán)
LISP - 常量
LISP - 集合
LISP - 字符
LISP - 程序結(jié)構(gòu)
LISP - 文件I/O
LISP - 哈希表
LISP - 宏
LISP - 數(shù)據(jù)類型
LISP - 包
LISP - 符號(hào)
LISP - 運(yùn)算符
LISP - 基本語法
LISP - 函數(shù)
LISP - 向量
LISP - 結(jié)構(gòu)
LISP - 概述介紹

LISP - 函數(shù)

函數(shù)是一組一起執(zhí)行任務(wù)的語句。

可以把代碼放到單獨(dú)的函數(shù)。如何劃分代碼之前不同的功能,但在邏輯上劃分通常是這樣每個(gè)函數(shù)執(zhí)行特定的任務(wù)。

LISP函數(shù)定義

命名函數(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ù)

可以使用可選參數(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ù)。

例如,我們使用格式化函數(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ù)

關(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