[英]Ambiguity with `quote` in the Little Schemer. When should an expression be proceeded with a quote and when shouldn't it?
Friedman 和 Felleisen 的 Little Schemer 4e 從定義atom?
:
(define atom?
(lambda (x)
(and (not (pair? x)) (not (null? x)))))
然后在第一章中,有一些問題詢問某某是否是一個原子。 例如(為了清楚起見,腳注被改寫):
這是一個原子是真的嗎?
atom
**在方案中:(
(quote atom)
或'atom
它說turkey
、 1492
、 u
和*abc$
也是原子。
除1492
之外的所有這些都必須以'
開頭 - 否則我們會得到一個Error: execute: unbound symbol:
1492
和'1492
都有效。 從此以后,在本書中,我怎么知道什么時候應該或不應該在某些內容之前加上引號( '
)? 這很令人困惑。 我希望作者只是明確地引用了引號-在表達式之前添加一個單引號( '
)真的會增加那么多視覺噪音嗎? 我是否應該假設所有內容都以引號( '
)開頭?
原子。 原子是不可分割的東西。 像13
或72
這樣的值是不可分割的,它是一個單一的值。 還有其他原子,像"hello"
這樣的字符串,像x
或y
這樣的變量,像:keyword
或'something
這樣的值。
編寫 Lisp 時,原子由空格或括號分隔。 然后我們可以通過將原子放在括號中來創建一個或多個form
,例如(* 2 (+ 1 3))
。 這里的原子是:
然后有幾個問題。 對於初學者來說, x
是指原子'x
,一個名為x
的變量,還是存儲在變量x
中的值? Lisp 假設x
是一個變量,因此輸入x
會返回x
的值或產生關於x
未綁定的錯誤。 在x
前面加上一個單引號,如'x
,表示“請不要試圖評估這個”。
Forms 具有一致的格式(operator data1 data2 data3...)
。 但是,如果您只想提供數據會發生什么? 你用什么運算符? 答案是使用 operator quote
,它將表單評估為僅數據。 因為一直說引號很煩人,所以 Lisp 允許你說'(data1 data2 data3...)
代替。
至於'1492
,這與 Scheme 和 Common Lisp 中的1492
相同。 這些值是可互換的。 我會使用1492
,因為引用是多余的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.