【问题标题】:R7RS-small: equivalence of quasiquoted expressionsR7RS-small:quasiquoted 表达式的等价性
【发布时间】:2021-11-29 10:27:47
【问题描述】:

R7RS-small standard,第 20-21 页的第 4.2.8 节准引用表明

(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)

【问题讨论】:

    标签: scheme quasiquotes r7rs


    【解决方案1】:

    原因在示例前几行给出(重点是我的):

    一个quasiquote 表达式可以返回新分配的可变对象或在表达式求值期间在运行时构造的任何结构的字面量结构。 不需要重建的部分总是字面的。

    这意味着在:

    (let ((a 3)) `((1 2) ,a ,4 ,'five 6))
    

    准引号内的(1 2)部分必须被视为文字,如@9​​87654323@,而不是由其组件构建的结构,如:...(list 1 2)...

    这似乎是一个过度规范,因为 '(1 2) 打印完全像 (list 1 2),但第一个列表 不能 被变异(或者,更好的是,如果发生变异,会有未定义的行为),而第二个可以合法变异。

    【讨论】:

      猜你喜欢
      • 2011-02-27
      • 1970-01-01
      • 2010-10-08
      • 1970-01-01
      • 2016-01-19
      • 2011-09-03
      • 1970-01-01
      • 2019-07-25
      • 1970-01-01
      相关资源
      最近更新 更多