[從Schemer的角度來看。儘管Scheme和Common Lisp中的一些概念具有相同的名稱,但這並不意味着這兩種語言的意思是相同的。]
首先注意符號和標識符是兩個不同的東西。
符號可以被認爲是支持快速平等比較的字符串。 如果拼寫方式相同,兩個符號s
和t
相等(或多或少)。操作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
是否有一種方式來逃避'|'在你的口齒不清的例子嗎? – William 2015-09-24 18:51:04
@William:'| \ | |' – 2015-09-24 19:03:58