2

我正在尝试在 Macintosh 上使用 DrScheme 从“The Little Schemer”一书中学习 Scheme。它以“l 的汽车是什么,其中 l 是论点 (abc)?”之类的东西开头。

我知道这个问题的答案是,但我实际上无法弄清楚在 Dr Scheme 中输入什么来“跟随”。关于如何分配给 l 的一个简单想法,例如 > (def l ('a 'b 'c))

给我错误:“函数调用:在左括号后需要一个定义的名称或原始操作名称,但发现了别的东西”

4

4 回答 4

4

定义一些东西:

(define <name> <value>)

所以要定义 l:

(define l '(a b c))

这定义l为 list (a b c)。单引号引用它后面的任何内容,无论是符号还是列表,这意味着它不会被评估而是按原样读取。但是,您不会引用您设置的名称。值得庆幸的是,这是 Scheme 中极少数存在这种不一致的操作之一。

于 2009-01-21T04:16:53.797 回答
1

试试这个:

(define l '(a b c))

在这里,引用适用于整个列表(a b c)

于 2009-01-21T04:13:42.133 回答
1

或者,只需使用

(car '(a b c))

错误告诉你的是:当读者看到一个列表时,它想将列表的第一个元素视为一个函数。这就是(+ 1 2 3)工作原理:它调用 hthe 函数+。(严格来说,它查看符号'+并发现绑定了一个函数,然后调用该函数。)

所以,当你输入

(define l ('a 'b 'c))

它查看内部列表,然后想要找到一个函数。相反,它会找到名为 的符号a。由于那里没有功能,因此您会收到错误消息。相反,如果您键入

(define l '(a b c))

您已经通过引用告诉读者,将其视为列表而不试图解释它。

以下是 Mac 上 MIT Scheme 的示例:

1 ]=> (define li '(a b c))

;Value: li

1 ]=> (car li)

;Value: a

1 ]=> (car '(a b c ))

;Value: a
于 2009-01-21T04:15:37.823 回答
0

非缩写形式

(define l '(a b c))  

(define l (quote (a b c)))  

或者在这种情况下甚至是这样:

(define l (list 'a 'b 'c))  

如果没有“列表”部分,它显然会尝试执行'a

于 2009-01-21T17:21:28.737 回答