2012-07-27 37 views
4

首先,據我瞭解,變量標識符在通用lisp中被稱爲符號。lisp符號的有效字符

我注意到,雖然像C語言這樣的語言變量標識符只能是字母數字和下劃線,但Common Lisp允許使用更多字符,如「*」和(至少在方案中)「?」

所以,我想知道的是:Common Lisp允許在符號中包含的全部字符集(如果我錯了,則爲可變標識符)是什麼?這是相同的計劃?

此外,功能名稱的字符集是不同的?

我一直在使用Google,在CLHS和Practical Common Lisp中尋找,而對於我的生活,一定是錯誤的,因爲我似乎無法找到答案。

回答

7

詳細的答案有點棘手。 Common Lisp有ANSI標準。它定義了一套available characters。基本上你可以使用所有這些定義的字符作爲符號。另見Symbols as Tokens

例如

|Polynom 2 * x ** 3 - 5 * x ** 2 + 10| 

是一個有效符號。請注意,垂直條標記符號並且不屬於符號名稱。

然後是Common Lisp的現有實現以及它們對各種字符集和字符串類型的支持。所以有幾個支持Unicode(或類似的)並允許符號名稱中的Unicode字符。

LispWorks:所述CLHS,其詳細描述了讀出器算法的

CL-USER 1 > (list 'δ 'ψ 'σ) 
(δ ψ σ) 
+0

是否有一種方式來逃避'|'在你的口齒不清的例子嗎? – William 2015-09-24 18:51:04

+0

@William:'| \ | |' – 2015-09-24 19:03:58

2

參見第2章。但簡單的答案是,如果一個標記不是一個readmacro調用(2.4節),並且不是一個數字或所有點,它默認被解釋爲一個符號。

4

[從Schemer的角度來看。儘管Scheme和Common Lisp中的一些概念具有相同的名稱,但這並不意味着這兩種語言的意思是相同的。]

首先注意符號和標識符是兩個不同的東西。

符號可以被認爲是支持快速平等比較的字符串。 如果拼寫方式相同,兩個符號st相等(或多或少)。操作string=?需要循環查看這些字符,看看它們是否完全相同。這需要與最短字符串的長度成比例的時間。另一方面,符號自動(運行時系統)放入(通常)散列表中。因此symbol=?歸結爲一個簡單的指針比較,因此非常快。在C中使用枚舉的情況下經常使用符號。

符號是可以在運行時出現的值。

標識符只是程序中變量的名稱。

現在,如果將所述程序表示爲Scheme值,則一種選擇是使用符號來表示標識符 - 但這並不意味着符號是標識符(反之亦然)。更好地表示標識符(仍在Scheme中)是語法對象,除標識符的名稱外,它還記錄標識符被讀取(或構造)的位置。假設你遇到一個未定義的變量並且想要在程序中的未定義變量的位置發信號,那麼源位置是標識符表示的一部分非常方便。

最後但並非最不重要。一個標識符的法律特徵是什麼?這是最好從R6RS引用章節和版本:

4.2.4標識符

其他編程語言允許大多數標識符也是可以接受的方案。通常,字母,數字和「擴展字母字符」的序列是一個標識符,當它以無法開始數字對象表示的字符開頭時。另外,+, - 和...是標識符,也是以兩個字符序列 - >開頭的字母,數字和擴展字母字符序列。這裏是標識符的一些例子:

lambda   q    soup 
list->vector +    V17a 
<=    a34kTMNs   ->- 
the-word-recursion-has-many-meanings 

擴展的字母可能標識符範圍內,如果他們的信件被使用。以下是擴展字母字符:

! $ % & * + - ./: <=> ? @^_ ~ 

此外,其Unicode標值是所有字符大於127並且其Unicode的類別是路中,L1,LT,LM,螺,錳,MC,Me中,釹,NL ,否,Pd,Pc,Po,Sc,Sm,Sk,So或Co可以在標識符內使用。另外,任何字符都可以在標識符中使用,當通過一個指定的。例如,標識符H \ llo與標識符Hello相同,標識符\ x3BB;與標識符λ相同。

在Scheme程序中,任何標識符都可以用作變量或語法關鍵字(請參閱5.2節和9.2節)。任何標識符也可以用作一個語法數據,在這種情況下它代表一個符號(見11.10節)。

來源:http://www.r6rs.org/final/html/r6rs/r6rs-Z-H-7.html#node_sec_4.2.4