1. 程式人生 > >Lisp語言:函式的定義,呼叫以及引數的傳遞

Lisp語言:函式的定義,呼叫以及引數的傳遞

進一步瞭解一下Lisp語言中函式的使用,雖然從這篇文章才開始介紹函式,但是我們在之前的Lisp文章中已經多次接觸函數了。

函式的定義

在Lisp中函式的定義使用下面的格式:

(defun function1 ()
        (format *query-io* "in function1~%"))

其中defun是函式定義的關鍵字,function1是函式名,跟著的()是引數定義,在這裡不需要引數,所以()中間是空的,然後(format *query-io* "in function1~%")是函式體,就是呼叫函式時需要執行的程式碼。

其中的函式體可以是任意多行的語句,如下面這樣:

(defun function1 ()

        (format *query-io* "in function1 line 1~%")

        (format *query-io* "in function1 line 2~%")

        (format *query-io* "in function1 line 3~%"))

函式的呼叫

函式的呼叫比較簡單,使用括號加函式名就可以了,如(function1)。

函式的返回

在沒有加入返回語句的情況下,一個函式的最後一個語句的計算結果會被當作函式的返回值返回給呼叫者,如下面的程式碼中,main函式呼叫function1函式,而function1函式的最後一個語句計算結果是“value to return”,所以在main函式中呼叫function1函式後會將變數result賦值為“value to return”,然後通過format語句將result的結果打印出來:

(defun main ()
        (setq result (function1))
        (format *query-io* "result is: ~a~%" result)
       
)       

(defun function1 ()
        (format *query-io* "in function1~%")
        "value to return")
如果希望提前從一個函式中返回,需要用到return-from函式,如下面的程式碼中函式function1執行到第二句的時候直接呼叫return-from返回了“value returned by return-from”作為返回值,後面的語句就不執行了,main函式中result的結果就是“value returned by return-from”
(defun main ()
        (setq result (function1))
        (format *query-io* "result is: ~a~%" result)

)
        

(defun function1 ()
        (format *query-io* "in function1~%")
        (return-from function1 "value returned by return-from")
        (format *query-io* "this line will not be reached")
        "value to return")

需要注意的是return-from函式的第二個引數是函式名,從哪個函式返回就寫哪個函式的函式名,如果一個函式的函式名有修改記得修改return-from對應的函式名。

這一點多少有點令人不滿,為什麼從函式返回還要指定函式的名稱,不像Lisp簡潔的風格。

引數的定義

上面提到的函式都市沒有引數的,現實中定義和使用函式一定會需要引數,Lisp中函式的引數如何定義呢?

Lisp中函式的引數定義在函式名後面的括號中,如下面的程式碼就定義了a 和b 兩個引數。因為Lisp使用的是動態型別,而非靜態型別,所以引數是不需要指定型別的,不像c語言那樣需要(int a , String b)這樣定義引數。

(defun function3 (a b)
        (format *query-io* "parameter a is: ~a  b is: ~a~%" a b ))

對於有引數的函式,呼叫時需要在函式名後帶上相同數量的變數作為實際引數,如function3的呼叫如下,其中10會被賦予變數a,而20會被賦予變數b。
  (function3 10 20)

如果函式呼叫是填寫的引數數量和函式定義時不同,執行時會報錯的。

如(function3 10)會報引數太少,而(function3 10 20 30)會報引數太多。

有關Lisp函式的引數定義還有更復雜的形式,如可選引數,關鍵字引數等,在以後的文章中我們繼續學習。