Lisp 中的 string 和 symbol 的區別?

時間 2021-05-30 02:30:22

1樓:z展新

感覺大家都沒說到點子上,

定義:Symbol(符號)只是用來指代能夠引用其他資料型別的一種資料型別而已。

通常情況下,Symbol在read時讀為符號(這個資料型別),然後在eval時(根據上下文)求得另外一種資料物件。

特殊的符號,讀為不同型別,求值後為自身(讀後的型別):比如布林值符號,在讀時,為布林值,求值時,為自身布林值;再比如nil符號,Clojure裡特有的keyword,都是這種特殊符號。(特殊符號也並沒有脫離定義,特殊符號只不過引用了自身(這個資料型別),表示指代自己)

而String(字串),它只是由字元按順序組成的一種資料型別而已。讀為字串,求值為字串,就和其他普通資料一樣,it's just data,它並不引用任何其他資料型別。

符號本身也是資料,但是在進入求值階段,你必須對其進行quote防止被求值(防止求得該符號所引用的資料),才能獲得符號資料型別值本身,而像字串數字等這種字面量值,它是啥就是啥。

符號作為一種資料型別,可被傳遞,可被引用,可被求值,甚至還能被進行讀操控,是Lisp裡的一等公民。能直接操作符號,才有強大的Lisp巨集系統。這種特性在市面上流行的這些類C程式語言裡是不可想象的。

2樓:蛙二

字串沒有維度,或者說是trivial的,和它屬於同一層級是數字。

符號有多個維度(可以理解成有多種屬性,比如elisp的符號就有4個維度)。符號的name在表現形式上和string一樣,但還有其它維度是string表示不了的。

3樓:

舉個例子,'abc作為乙個原子(atom),你不可以拆開它;而"abc"是復合資料,可以提取出"a"。因此symbol的存在大大擴充了原子世界,以便於寫符號計算和元程式設計。

4樓:

非,字串是無結構的,符號是有結構的,符號中的數字型別也不是以字串形式儲存的而是單純的數字,原子的符號受到識別符號規則的限制而字串沒有。

換句話來說不是任意一段字串都可以找到相對應的符號。

5樓:開源醬

String 的本質**不是**字串

String 是乙個字串行

Symbol 也從來沒被當作字串用過,人家是符號,題主你聽說過符號演算沒有

6樓:CrLF0710

數字是一種特殊的符號。——摘自《LISP 1.5 Programmer's Manual》在lisp中符號的歷史比字串更加久遠,在LISP 1.

5中SYMBOL 和 CONS是最重要的資料型別。

而字串是後來加上的。用來表示字串行的概念,至此,再用SYMBOL的NAME來表示字串行已然成為不好的行為了。

如何解釋 Lisp 中 call cc 的概念?

簡單點的理解就是在 call cc 出現的地方搞出乙個蟲洞的出口,而蟲洞的入口是 call cc lambda k中出現的 k 通過 k 的形式將.的求值結果傳送到蟲洞出口的位置,k這個蟲洞入口還可以賦值給別的變數.其它的就交給別的答主了 勃珍妮 補充一下 紅日照小池 池哥的回答,因為看不大懂.定義...

java的String在記憶體中如何分配的?

陳肖恩 1.myString 是常量,通過編譯期直接定義到常量表中,new String 是執行期指令,基本上new出來的物件都在堆上。可以理解為編譯期常量表定義了 myString 字串,在執行期調取常量new出乙個String物件放到堆裡,兩者引用不一樣。2.字面量字串可以在編譯器優化,例如常量...

在C 11中,如何將一種編碼的string轉換為另一種編碼的string?

keyes vc下有個BSTR,很方便。string to wstring string str hello知乎 bstr tt str.c str wstring wstr t wstring to string wstring wstr L hello知乎 bstr t t wstr.c str...