![](/img/trans.png)
[英]Why does "The Little Schemer" insist that the second argument to `cons` must be a list?
[英]Why (car (1 2)) from The Little Schemer does not work in DrRacket?
我一直在閱讀“小陰謀家”的第一章。 問題是,有些示例在 DrRacket 中工作,例如(eq? "foo" "foo")
而有些則不喜歡(car ("a" "b"))
或(cdr ("a" "b"))
因為的
application: not a procedure;
expected a procedure that can be applied to arguments
given: "a"
arguments...:
你能指出為什么這些例子不起作用嗎?
這些示例不起作用,因為它們不是合法的 Scheme。 我對這本書不熟悉,但可能是因為它的排版方式可能會使從中轉錄示例而不會出現您所犯的錯誤略有困難。 要了解為什么它們不是,您需要考慮系統如何評估事物。 這是對它如何工作的簡單而部分的描述(實際實現做的事情比這要復雜得多,而且這個描述是部分的,尤其是因為它根本沒有解釋我們如何獲得事物的綁定)。
評估某事:
(foo ...)
這樣的復合形式嗎? 如果是,那么——
所以我們可以使用這些規則來嘗試評估(car ("a" "b"))
。
car
不是什么特別的東西,所以我們不打那個案子;car
是一個符號,所以查找它的值是一個函數;("a" "b")
是復合形式,它的第一個元素並不特殊——
好的,所以這行不通。 為了讓它起作用,我們需要回過頭來看看評估規則中的一個案例:在評估一個復合形式時,我們先看一個元素,以確定它是否是我們知道的一些特殊的魔法事物,在這種情況下我們會這樣做一些特別的東西。 有少數這樣特殊的魔法事物:我們在這里唯一關心的是quote
。 對此的特殊規則是:
quote
,它看起來像(quote ...)
,那么 –
<x>
,它應該看起來像(quote <x>)
;<x>
沒有進一步嘗試評估<x>
。因此,例如:
(quote x)
的值是符號x
;(quote (1 2 3))
是列表(1 2 3)
;(quote "x")
是字符串"x"
(在這種情況下你不需要quote
,因為字符串已經根據上面的第一條規則對自身求值,但它不會造成傷害)。 所以回到我們想要評估的形式,我們實際需要的是(car (quote ("a" "b")))
。 在評估時:
car
不是什么特別的東西,所以我們不打那個案子;car
是一個符號,所以查找它的值是一個函數;(quote ("a" "b"))
是一個復合形式——
quote
;quote
規則,結果是("a" "b")
;car
的值應用於("a" "b")
,結果為"a"
。 那么還有一個技巧: (quote <x>)
出現了很多,所以有一個特殊的語法,它是單個'
: 'x
讀取相同的(quote x)
。 這只會使源代碼不那么冗長。 所以這給出了你正在嘗試做的工作版本的最終形式:
(car '("a" "b"))
最后,Lisps需要quote
的原因是一件值得思考的有趣事情,但與此答案無關。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.