簡體   English   中英

為什么 The Little Schemer 中的 (car (1 2)) 在 DrRacket 中不起作用?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM