1. 程式人生 > >CommonLisp(三)---高階函式與匿名函式(lambda演算)

CommonLisp(三)---高階函式與匿名函式(lambda演算)

                 我一直堅信,簡單為美,如果一個概念不能夠用數學或者簡單的形式描述,那麼其可用性就不能保證。

一.高階函式

簡而言之,使用函式作為引數的函式就是高階函式。

如果在較高的層面上抽象,函式也是資料,我們可以將函式作為資料在函式之間進行傳遞,並在某個合適的時刻執行該函式,有時候我們也將高階函式叫做回撥函式(callback)或者鉤子函式(hook),這也體現在任何一種將函式作為資料看待的語言中,如Python,JavaScript等。

        在CommonLisp中我們通過defun巨集定義一個函式,程式碼如下:

#!/usr/bin/env clisp

(defun foo (x y)
      (+ x y))

;通過函式名呼叫函式,為了直觀我們使用print列印返回結果
(print (foo 10 10))

;使用function操作符號獲取函式物件
(print (function foo))
;使用function操作符的語法糖#'獲取函式物件
(print #'foo)
;使用funcall呼叫函式
(print (funcall #'foo 10 10))
;使用apply呼叫函式,需要傳遞一個list
(print (apply #'foo  (list 10 10)))
 

1.我們可以通過函式名對函式呼叫

  (func-name)

2.我們可以通過function操作符獲取一個函式物件,或者通過function操作符的語法糖#'來獲取函式物件。

       (function func-name)或者 #'func-name

3.我們可以通過funcall或者apply呼叫一個函式

二者的區別是前者需要一個函式物件及該函式物件需要的引數進行呼叫,二後者需要一個函式物件與該函式物件需要引數的列表進行呼叫

funcall #'func-name arg1 arg2

apply #'func-name (list arg1 arg2)

二.匿名函式

      很容易理解,匿名函式就是沒有名字作為控制代碼的函式。這個概念也存在與很多語言中。

在CommonLisp中,我們使用lambda表示式建立一個匿名函式,格式如下

(lambda (parameters) body)
如下,我們建立一個匿名函式並予以呼叫:
(funcall #'(lambda (x y) (+ x y)) 10 10)
當然還可以簡寫成如下形式:
((lambda (x y) (+ x y)) 10 10)