2010-11-13 35 views
5

在lisp中,符號可以同時綁定到一個值和一個函數。 例如,同時綁定一個值和函數的符號的優點是什麼?

符號f綁定到一個功能

(defun f(x) 
    (* 2 x)) 

符號f綁定到一個值

(setq f 10) 

所以,我寫的是這樣的:

(f f) 

=> 20

這樣的功能有什麼好處?

+3

參考文獻和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

+0

@Pete:感謝您的鏈接。在我發佈我的問題之前,我搜索了這個主題,但不知何故,我錯過了這一個。 – 2010-11-13 10:45:09

回答

12

該符號可以同時具有一個函數和一個值。該功能可以通過SYMBOL-FUNCTION獲取,值可以通過SYMBOL-VALUE獲取。

這不是完整的視圖。 Common Lisp具有(至少)兩個名稱空間,一個用於函數,一個用於變量。全局符號參與此。但對於本地功能而言,符號不涉及。

那麼有什麼優勢:

  • 函數和變量標識符之間沒有名稱衝突。

    方案:(定義(FOO LST)(名單LST))

    CL:(defun定義FOO(名單)(名單列表))

  • 沒有運行時檢查的東西是否是一個真正的函數

    方案:(定義(FOO)(巴))

    CL:(defun定義FOO()(巴))

    在方案中,不清楚BAR是什麼。它可能是一個數字,當調用FOO時會導致運行時錯誤。

    在CL BAR是一個函數或未定義。它永遠不可能是別的。它可以例如永遠不會是一個數字。無法將函數名稱綁定到數字,因此無需在運行時檢查這種情況。

-1

這對日常任務很有用,但主要原因是因爲宏,你會明白爲什麼一旦你研究它。

相關問題