在lisp中,符號可以同時綁定到一個值和一個函數。 例如,同時綁定一個值和函數的符號的優點是什麼?
符號f綁定到一個功能
(defun f(x)
(* 2 x))
符號f綁定到一個值
(setq f 10)
所以,我寫的是這樣的:
(f f)
=> 20
這樣的功能有什麼好處?
在lisp中,符號可以同時綁定到一個值和一個函數。 例如,同時綁定一個值和函數的符號的優點是什麼?
符號f綁定到一個功能
(defun f(x)
(* 2 x))
符號f綁定到一個值
(setq f 10)
所以,我寫的是這樣的:
(f f)
=> 20
這樣的功能有什麼好處?
該符號可以同時具有一個函數和一個值。該功能可以通過SYMBOL-FUNCTION獲取,值可以通過SYMBOL-VALUE獲取。
這不是完整的視圖。 Common Lisp具有(至少)兩個名稱空間,一個用於函數,一個用於變量。全局符號參與此。但對於本地功能而言,符號不涉及。
那麼有什麼優勢:
函數和變量標識符之間沒有名稱衝突。
方案:(定義(FOO LST)(名單LST))
CL:(defun定義FOO(名單)(名單列表))
沒有運行時檢查的東西是否是一個真正的函數
方案:(定義(FOO)(巴))
CL:(defun定義FOO()(巴))
在方案中,不清楚BAR是什麼。它可能是一個數字,當調用FOO時會導致運行時錯誤。
在CL BAR是一個函數或未定義。它永遠不可能是別的。它可以例如永遠不會是一個數字。無法將函數名稱綁定到數字,因此無需在運行時檢查這種情況。
這對日常任務很有用,但主要原因是因爲宏,你會明白爲什麼一旦你研究它。
參考文獻和Gabriel的Lisp-1/Lisp-2論文的鏈接已經在[Common Lisp中的函數和變量的單獨命名空間與方案](http://stackoverflow.com/questions/1020968/separate- namespaces-for-functions-and-variables-in-common-lisp-versus-scheme) – 2010-11-13 10:31:30
@Pete:感謝您的鏈接。在我發佈我的問題之前,我搜索了這個主題,但不知何故,我錯過了這一個。 – 2010-11-13 10:45:09