Scheme 小阴谋家原子vs(引用原子)

Scheme 小阴谋家原子vs(引用原子),scheme,lisp,Scheme,Lisp,我刚开始读《小阴谋家》。它从几个问题开始,询问给定的表达式是否是原子。这很直截了当,但有趣的是,第一个问题让我有点发火。它要求: 这是原子吗?atom1 1(引用atom)或“atom” 让我不舒服的是脚注的引用。他们问原子是不是原子,但不知怎的,他们说原子是真的(引用atom)还是“atom”?我就是不明白。这里发生的事情是,弗里德曼试图避免读者立即陷入quote reader宏的技术性问题,所以他提供了非常简单的示例,但在REPL中键入时实际上不起作用。在某些时候,有人认为他们应该提供工作代

我刚开始读《小阴谋家》。它从几个问题开始,询问给定的表达式是否是原子。这很直截了当,但有趣的是,第一个问题让我有点发火。它要求:

这是原子吗?
atom1

1(引用atom)或“atom”


让我不舒服的是脚注的引用。他们问原子是不是原子,但不知怎的,他们说原子是真的(引用atom)还是“atom”?我就是不明白。

这里发生的事情是,弗里德曼试图避免读者立即陷入quote reader宏的技术性问题,所以他提供了非常简单的示例,但在REPL中键入时实际上不起作用。在某些时候,有人认为他们应该提供工作代码,但他们不想把原始文本弄糟,所以他们添加了代码作为脚注

序言说:

此外,您可能需要稍微修改程序。通常,材质只需要少量更改。框架说明中提供了关于如何尝试本书中程序的建议。框架注释前面有“S:”关注点方案,前面有“L:”关注点公共Lisp

Atom只是指任何不是列表的东西。在完成这些练习时,您需要能够测试列表中的一个元素,以查看它是否是另一个列表。他们引入了一个术语来表示非列表项

还要注意,引用是由读者处理的,阅读和评估表达式的过程会消耗引用,因此:

(quote atom) 
评估为

atom

参见CLISP REPL中的以下交互:

[1]> 'atom
ATOM
ATOM
是文本所指的实体<代码>'atom是脚注所指的内容


引用的数据处理是Lisp语法的薄弱环节之一。我们所看到的是评估的结果(
ATOM
)还是代码(
'ATOM
),一直存在着困惑。毕竟,代码是Lisp中的数据,所以当我们确实希望有区别时,它会模糊区别

多谢各位。但是为什么原子的
atom
需要被引用,而原子的后续示例(例如,
turkey
1492
)不需要被引用呢?@yroc它们也需要被引用。这本书使用特殊字体来表示代码片段,如果在REPL中输入,这些代码片段将被引用。(IIRC)。(1492,作为一个数字——一个自我评估的实体——不需要被引用)@yroc:1492不需要被引用,因为它是自我评估的。不解释某些东西是一种奇怪的方式,“以避免让读者陷入困境。”我想很多人都会因为你不能在Scheme REPL中解决这些初始问题而感到气馁。你马上就会想知道引用是什么意思。将
'atom
1492
键入ones REPL(并发现它们分别计算为一个符号和一个整数),然后尝试将
(atom)
示例输入为
('atom)
,得到的不是一个列表,而是一个关于过程的错误,并且不知道为什么是
(atom)
,如框架说明中所示。这将引导您找到类似于此的答案。我原以为这不是一个温和的介绍。抱歉@NathanHughes-我知道你不是这本书的作者,但你是我能找到的唯一一个试图解释作者为什么采取这种方法的人。我了解建构主义/对话,但我认为一篇关于如何处理这本书的博文(并从一些真正的东西开始,比如Racket)对很多人来说都是一个很大的帮助。