我正在尝试在 Macintosh 上使用 DrScheme 从“The Little Schemer”一书中学习 Scheme。它以“l 的汽车是什么,其中 l 是论点 (abc)?”之类的东西开头。
我知道这个问题的答案是,但我实际上无法弄清楚在 Dr Scheme 中输入什么来“跟随”。关于如何分配给 l 的一个简单想法,例如 > (def l ('a 'b 'c))
给我错误:“函数调用:在左括号后需要一个定义的名称或原始操作名称,但发现了别的东西”
定义一些东西:
(define <name> <value>)
所以要定义 l:
(define l '(a b c))
这定义l
为 list (a b c)
。单引号引用它后面的任何内容,无论是符号还是列表,这意味着它不会被评估而是按原样读取。但是,您不会引用您设置的名称。值得庆幸的是,这是 Scheme 中极少数存在这种不一致的操作之一。
试试这个:
(define l '(a b c))
在这里,引用适用于整个列表(a b c)
。
或者,只需使用
(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
非缩写形式
(define l '(a b c))
是
(define l (quote (a b c)))
或者在这种情况下甚至是这样:
(define l (list 'a 'b 'c))
如果没有“列表”部分,它显然会尝试执行'a