0

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

4

1 回答 1

2

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

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),但第一个列表不能被变异(或者,如果发生变异,更好的是,存在未定义的行为),而第二个列表可以合法地变异。

于 2021-10-10T07:55:10.840 回答