2011-11-09 231 views
4

我已經開始學習Lisp,並且想知道以幾種不同方式執行特定任務的所有冗餘是否有用?肯定有經驗的Lisp程序員可以回答這個問題。Lisp中的冗餘

僅舉一個例子。我們可以通過以下兩種不同的方式創建功能。

(defun add2 (x) (+ x 2)) 

(setf (symbol-function 'add2) 
    #'(lambda (x) (+ x 2)) 

我明白,這提供了靈活性,以實現不同的東西。但是爲什麼所有這些冗餘可以幫助我更好地理解事情。

回答

15

第一種形式的存在是因爲定義函數是一種常見的瑣事,所以您需要一種方便的語法。

第二種形式存在,因爲有時候,你想用宏來生成函數定義和內容。

如果沒有defun,我們仍然可以使用第二種形式定義函數,但沒有人會用Lisp編程,因爲一個簡單的任務會非常艱鉅。每個程序員都會設計自己的defun宏,與其他所有宏不兼容。

+0

謝謝larsmans。 – roshang

+0

很好的解釋。 –

2

如果您在現有實現中查看DEFUN,它不僅僅是定義一個函數。它記錄了例如IDE的定義位置(開發環境),設置文檔,記錄類型信息,...

通常Lisp根據功能接口公開機械。典型的用法是通過一組宏提供的,這些宏在開發環境中提供了方便的界面和副作用。

有時,使用CLOS,在功能接口下面甚至有一個面向對象的實現。

圖片則看起來像這樣

macros <- used by the programmer, convenient to use 
^
    | 
functions <- user interface to the implementation 
^
    | 
CLOS (classes, instances, generic functions) <- low-level extensible machine 
1

你描述的基本上是這Lisp的很大一部分是寫在自己的事實的副作用。因此,通常使用的高級定義以及它後面的低級定義都可供程序員使用。

如果你想要做高級的東西,否則不可能,但是通常它可以被視爲一個實現細節,讓低級定義可用是非常好的。