我正在研究SICP,在2.2.2节的开头,它给出了以下代码:(cons '(list 1 2) (list 3 4)))
并说它构造了一个像((1 2) 3 4)
这样的列表。但是当我把它输入DrRacket(我实际上是在这里使用Racket)时它产生'((list 1 2) 3 4)
并且如果我写(cons (list 1 2) (list 3 4))
那么它就没问题了。我知道方案'(1 2)
等于(list 1 2)
但'(list 1 2)
是什么意思?
答案 0 :(得分:3)
它应该是指“由原子列表,原子1和原子2组成的列表”。在Scheme评估列表(单引号阻止)之前,它不会将“list”与任何其他字符串区别对待。
答案 1 :(得分:2)
Scheme有一个方便的语法来表示数据文字:使用'前缀任何表达式(单引号)和表达式,而不是被评估,将作为数据返回
了解更多信息:
http://courses.cs.washington.edu/courses/cse341/04wi/lectures/14-scheme-quote.html
答案 2 :(得分:2)
修复输出样式
首先,当你在DrRacket中使用count class X
if class x amount == 1 then nothing
else select first change to XZY+1+var
loop until amount == 1
语言时,默认的打印方式不是打印它的表示,而是一个计算结果相同的表达式。您可以从菜单语言>>中将其关闭选择语言。您选择显示详细信息,然后在输出样式下选择写
按运行后,在评估#!racket
时,您将获得输出'test
。
表达中的错误
在section 2.2.2中有一个表达式test
。它与您在问题(cons (list 1 2) (list 3 4))
中所写的内容不一样。虽然表达式(cons '(list 1 2) (list 3 4))
将值(list 1 2)
和list
的过程1
应用于2
,但表达式(1 2)
只返回引用的数据'(list 1 2)
不变。
因此:
(list 1 2)
答案 3 :(得分:1)
符号'foo
生成一个名为foo的符号。
符号'(foo bar)
会生成一个包含两个名为foo
和bar
的符号的列表。
以同样的方式'(list foo bar)
列出三个符号。符号'list
碰巧被称为list
。
现在(list 'foo 'bar)
列出了两个名为foo
和bar
的符号列表。