方案适用于包含带引号的元素的列表
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) , where
quote` 是符号报价。
在您的示例中,您尝试 (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 外引号那样被特殊处理。
我正在做一个方案项目,我遇到了引号问题。 当我使用 (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) , where
quote` 是符号报价。
在您的示例中,您尝试 (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 外引号那样被特殊处理。