我已經開始學習Lisp,並且想知道以幾種不同方式執行特定任務的所有冗餘是否有用?肯定有經驗的Lisp程序員可以回答這個問題。Lisp中的冗餘
僅舉一個例子。我們可以通過以下兩種不同的方式創建功能。
(defun add2 (x) (+ x 2))
或
(setf (symbol-function 'add2)
#'(lambda (x) (+ x 2))
我明白,這提供了靈活性,以實現不同的東西。但是爲什麼所有這些冗餘可以幫助我更好地理解事情。
我已經開始學習Lisp,並且想知道以幾種不同方式執行特定任務的所有冗餘是否有用?肯定有經驗的Lisp程序員可以回答這個問題。Lisp中的冗餘
僅舉一個例子。我們可以通過以下兩種不同的方式創建功能。
(defun add2 (x) (+ x 2))
或
(setf (symbol-function 'add2)
#'(lambda (x) (+ x 2))
我明白,這提供了靈活性,以實現不同的東西。但是爲什麼所有這些冗餘可以幫助我更好地理解事情。
第一種形式的存在是因爲定義函數是一種常見的瑣事,所以您需要一種方便的語法。
第二種形式存在,因爲有時候,你想用宏來生成函數定義和內容。
如果沒有defun
,我們仍然可以使用第二種形式定義函數,但沒有人會用Lisp編程,因爲一個簡單的任務會非常艱鉅。每個程序員都會設計自己的defun
宏,與其他所有宏不兼容。
如果您在現有實現中查看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
你描述的基本上是這Lisp的很大一部分是寫在自己的事實的副作用。因此,通常使用的高級定義以及它後面的低級定義都可供程序員使用。
如果你想要做高級的東西,否則不可能,但是通常它可以被視爲一個實現細節,讓低級定義可用是非常好的。
謝謝larsmans。 – roshang
很好的解釋。 –