2009-01-21 83 views
2

我正试图在Macintosh上使用DrScheme从“The Little Schemer”一书中学习Scheme。它开始于诸如“什么是我的车哪里l是论据(a b c)?”在计划中分配原子列表

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

给我错误: “函数调用:期望一个定义的名称或一个基本的操作名称括号,却发现别的东西”

回答

4

要定义的东西:

(define <name> <value>) 

所以定义L:

(define l '(a b c)) 

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

(define l '(a b c)) 

1

试试这个:

(define l '(a b c)) 

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

+0

错误消息: def:name未定义,不是参数,也不是原始名称 – Leonard 2009-01-21 04:16:13

+0

它应该是“define”而不是“def”,请参阅我的答案以获取更多信息:http://stackoverflow.com/questions/464057/在计划中分配一个原子列表#464072 – 2009-01-21 04:17:37

+0

呃,我只是按照你的例子。改为'定义'。 – 2009-01-21 04:21:21

1

或者,只是使用

(car '(a b c)) 

什么错误是告诉大家的是:当读者看到一个列表,它要到列表中的第一个元素当作一个函数。这就是(+ 1 2 3)的工作原理:它调用函数+。 (严格来说,它看起来在符号'+,发现存在绑定到该函数,然后调用该函数。)

所以,当你键入

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

它着眼于内部列表,然后想找到一个功能。相反,它会发现名为a的符号。由于那里没有功能,所以会出现错误。如果您改为输入

(define l '(a b c)) 

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

下面是从麻省理工学院计划在Mac上的例子:

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

;Value: li 

1 ]=> (car li) 

;Value: a 

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

;Value: a 
0

非abbraveted形式

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

或在这种情况下,即使是这样:

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

没有它试图执行“一个 “清单” 部分,显然