方案适用于包含带引号的元素的列表

scheme apply to a list including elements with quote

我正在做一个方案项目,我遇到了引号问题。 当我使用 (apply + '(1 2 '3)) 球拍时出现错误,另一方面 (+ 1 2 '3) 工作正常。在项目的某个时刻,我需要能够执行类似 (apply + '(1 2 '3)) 的操作,因为我正在从给定文件中获取值并且我没有自由使用 (+ 1 2 '3) .我试图编写一个添加函数来添加列表中的所有值,但它也没有用。我怎么解决这个问题? 谢谢。

这里的问题是引用'的意思。 表达式 ' 表示 "produce a value that prints as ".

例如 '3 生成值 3,因为值 3 打印为 3。

'(1 b)中你得到一个列表,它的第一个元素是数字1,第二个元素是符号b。

现在您还需要了解有关报价的一件事。引用是 reader 的缩写。当 '<something> 被读取时, reader 产生形式 (quote <something>). This means that'(1 'b)produces the list(1 (quote b)). This is a list whose second element is the list(quote b) , wherequote` 是符号报价。

在您的示例中,您尝试 (apply + '(1 2 '3))'(1 2 '3) 产生的值是列表 (1 2 (quote 3))。由于 + 仅添加数字,因此您收到一条错误消息。

如果您想从文件中读取数字,那么将它们作为数字读取,一切都应该没问题。

'x(quote x)的缩写。在早期的 lisps 中,它是一个 reader 宏,今天一些打印例程为了方便实际上会将 (quote x) 打印为 'x。即使打印机选择将其打印为缩写,它仍然是一个包含两个元素的列表,因此 (car ''x)quote

(+ '1 '2 '3) 工作正常,因为正在评估所有参数。 + 被评估为程序对象 #<+>(只是全局变量 + 实现的程序表示),'1 评估为它的数据,数字 1 等等。该过程的最终应用发生在参数 (1 2 3) 上。数字是自我评估的,所以如果你不引用它们 1 将评估为 1 等等,你会得到相同的结果。并非所有值都是自我评估的。

使用 (apply + '(1 2 3)) 所有 3 个参数都得到评估。 apply+ 都指向程序对象,'(1 2 3) 指向列表 (1 2 3)。过程 #<+> 应用参数 (1 2 3)

(apply + '(1 2 '3)) 中,所有 3 个参数都被评估。 apply+ 都指向程序对象,'(1 2 '3) 指向列表 (1 2 (quote 3))。评估者只查看外部引号,因此 3 仍被引号,现在它是数据的一部分。过程 #<+> 应用参数 (1 2 (quote 3))。它不会工作,因为 #<+> 只知道如何添加数字而不是列表。您可以预料到违反合同,某种错误。

计算结果为数据。如果除了外部引号之外还有更多引号,它就不再是语言命令,而是带有符号 quote 和第二个值的列表。它不像 qith 外引号那样被特殊处理。