2011-02-02 61 views

回答

56

#'Common Lisp中

的Common Lisp和其他一些Lisp的方言functionname有多個命名空間。這裏的函數和值是不同的。爲了得到一個名字的函數值,我們需要寫:

(function functionname) 

自認爲是一個有點長寫的,有一個較短的符號:

#'functionname 

要顯示的效果看這樣的:

(let ((foo 42)) 
    (flet ((foo() 'bar)) 
    (list foo (function foo) #'foo (foo)))) 

上面定義了一個局部變量FOO本地功能FOO。 列表語句返回值的FOO,然後使用(function ...)符號,那麼同樣使用速記符號,然後實際調用函數FOO價值函數值的foo

(function foo)#'foo是相同的概念,但寫法不同。兩者都是指名爲FOO的本地詞彙功能。 FOOFLET表格作爲本地函數引入。

Lisp的REPL返回是這樣的:

(42 #<function FOO 4060008224> #<function FOO 4060008224> BAR) 

以上情況說明,第一項是真正的值的變量FOO和接下來的兩個項目是函數值,功能綁定到FOO。最後一項是從函數調用(FOO)返回的符號BAR

Common Lisp,Emacs Lisp和ISLisp中存在正常值和函數值的名稱空間分隔。像Scheme這樣的其他Lisp方言沒有這種分離。在Scheme中,名稱只能表示一個值。

#字符

#字符用於在s表達式中引入特殊語法。這裏有一些例子:

#'functionname -> (function functionname) 
#(1 2 3)   -> the vector of the elements 1 2 3 
#c(1 2)   -> a complex number 
#xFFFF   -> a hex number 
#b1111   -> a binary number 

等等。 #是所謂的調度宏字符

ANSI Common Lisp HyperSpec描述了Section 2.4.8 Sharpsign中的#字符。

Common Lisp可能使用了不同的向量語法。說[1 2 3]。它也可以對複數使用不同的語法。像{1 2}。但它不這樣做。爲什麼?原因是因爲Common Lisp試圖在語言中使用字符時經濟並且爲用戶自己的語法擴展留下了字符如[]{}。通常Lisp用戶開發嵌入式語言並使其更容易一些,Common Lisp標準試圖將字符使用降至最低,並提供宏字符和調度宏字符的機制。

爲了減少字符使用量,使用單個分派字符#,然後下一個字符確定可以表示的內容。二進制數字爲#b。用於十六進制數的#x#c複數。 #(矢量。 #'用於函數名稱。還有更多。

由於Common Lisp是一種可編程編程語言,因此用戶可以更改此字符級別的語法。請參閱功能SET-DISPATCH-MACRO-CHARACTER

+0

您提供了一篇優秀的文章!當我需要時,我發現它! – TheGeeko61 2018-02-02 06:34:10