Scheme 什么是';(清单1-2)计划中的方法?

Scheme 什么是';(清单1-2)计划中的方法?,scheme,lisp,racket,Scheme,Lisp,Racket,我正在研究SICP,在第2.2.2节的开头,它给出了以下代码:(cons)(列表12)(列表34)),并说它构造了一个类似于((1 2)3 4)的列表。但是当我把它输入DrRacket(实际上我在这里使用Racket)时,它会生成((列表12)34),如果我写(cons(列表12)(列表34)),那么它就可以了。我知道在Scheme(12)中等于(列表12),但是(列表12)的意思是什么?它应该是指“由原子列表、原子1和原子2组成的列表”。在Scheme计算列表(单引号阻止)之前,它不会将“li

我正在研究SICP,在第2.2.2节的开头,它给出了以下代码:
(cons)(列表12)(列表34))
,并说它构造了一个类似于
((1 2)3 4)
的列表。但是当我把它输入DrRacket(实际上我在这里使用Racket)时,它会生成
((列表12)34)
,如果我写
(cons(列表12)(列表34))
,那么它就可以了。我知道在Scheme
(12)
中等于
(列表12)
,但是
(列表12)
的意思是什么?

它应该是指“由原子列表、原子1和原子2组成的列表”。在Scheme计算列表(单引号阻止)之前,它不会将“list”与任何其他字符串区别对待。

符号
'foo
生成一个名为foo的符号

符号
”(foo-bar)
用两个符号构成一个列表,分别命名为
foo
bar

同样地,
”(list foo bar)
也会列出三个符号。符号
'list
恰好被称为
list

现在,
(list'foo'bar)
列出了两个名为
foo
bar

的符号。Scheme有一个方便的语法来表示数据文本:在任何表达式前面加上“(单引号),表达式将作为数据返回,而不是进行计算

有关更多信息:


修复输出样式

首先,当您使用
#时!racket
语言在DrRacket中,默认的打印方式不是打印它的表示,而是打印计算结果相同的表达式。您可以从菜单语言>选择语言将其关闭。选择“显示详细信息”,然后在“输出样式”下选择“写入”

按Run键后,在评估
测试时
将获得输出
测试

表达错误

其中有一个表达式
(cons(列表12)(列表34))
。它与你在问题中所写的不一样,
(cons)(列表12)(列表34))
。当表达式
(列表12)
使用值
1
2
应用过程
list
,从而成为
(12)
,表达式
(列表12)
只返回引用的数据
(列表12)

因此:

(cons (list 1 2) (list 3 4))   ; ==> ((1 2) 3 4)
(cons '(list 1 2) (list 3 4))  ; ==> ((list 1 2) 3 4)
'(cons '(list 1 2) (list 3 4)) ; ==> (cons '(list 1 2) (list 3 4))

为什么
”(foo-bar)
是正确的,而
(list-foo-bar)
是错误的?两者都在制作一个带有2个未知标识符的列表。在
(list foo bar)
中,系统1)查找
list
是什么,并找到列表构造函数2)查找
foo
并发现它未定义。但是在
(foo bar)
中,foo似乎也未定义。意味着构造一个打印为
(foo bar)的值
。系统将
'(foo-bar)
更改为
(list'foo'bar)
。我可以说
'(foo-bar)
只是声明了一个列表变量,该列表变量由另外两个变量foo和bar组成,但尚未绑定到一个值?谢谢,但我只能采用一个答案。谢谢,但我只能采用一个答案。真的吗?但在我的书中,它确实有一个额外的“。。。那么你想说添加一个额外的“没有用吗?”@Caesar如果你按照2.2.2的链接,你可以清楚地看到web版没有引用
列表
表单。额外的
更改了代码的解释方式<代码>(+1 2 3)
计算为
6
,而
”(+1 2 3)
计算为
(+1 2 3)
(由符号
+
和数字1、2和3组成的列表。与
(列表1 2 3)
相同,除了
列表
执行其他操作,而
的结果(列表1 2 3)
是与
(+1 2 3)
相同的结果,但第一个符号不同。表达式中没有引号的第一个过程是不同的。它不是。我面前有一份SICP副本,代码不是
(cons'(列表1 2)(列表3 4))
。它是
(cons(列表12)(列表34))
。好的,那么我的副本一定有什么问题。谢谢