scheme - R7RS-small:quasiquoted 表达式的等价性
问题描述
R7RS -small 标准,第 20-21 页的 4.2.8 Quasiquotation 部分说
(let ((a 3)) `((1 2) ,a ,4 ,'five 6))
相当于
-
`((1 2) 3 4 five 6)
和
-
(let ((a 3)) (cons '(1 2) (cons a (cons 4 (cons 'five '(6))))))
但不等同于:
(let ((a 3)) (list (list 1 2) a 4 'five 6))
上面的表达式与前三个有何不同?上面所有四个表达式的计算结果都是一样的:'((1 2) 3 4 five 6)
.
解决方案
原因在示例前几行给出(重点是我的):
quasiquote 表达式可以返回新分配的可变对象或在表达式求值期间在运行时构造的任何结构的文字结构。不需要重建的部分总是字面的。
这意味着在:
(let ((a 3)) `((1 2) ,a ,4 ,'five 6))
(1 2)
quasiquote 内的部分必须被视为文字,如 in...'(1 2)...
而不是由其组件构建的结构,如 in: ...(list 1 2)...
。
这似乎是一个过度规范,因为'(1 2)
打印完全一样(list 1 2)
,但第一个列表不能被变异(或者,如果发生变异,更好的是,存在未定义的行为),而第二个列表可以合法地变异。
推荐阅读
- compiler-errors - 损坏的 Modelica.Fluid.Valves.ValveIncompressible 模型?收到错误“Function Utilities.regRoot2 not found in scope
" - javascript - 无法让 rack-cors Gem 为 Rails6 工作
- ruby-on-rails - 如何在 Rails 6 中使用 js.erb 视图
- java - 如何读取我的客户端应用程序通过 url 发送的 XML SOAP 数据?
- r - 根据一列的最小值过滤数据框
- c++ - 为什么它给了我一个额外的词?
- python - 如何在命令行中执行此操作(我正在使用 spyder)
- css - 滚动捕捉不起作用。我查看了现有的问题,但没有一个有帮助
- api - 是否有一个 chrome API 可以为我提供网站的状态代码
- docker - 如何在 python docker sdk 中使用 exec_run 来替换我的 docker cli 命令