R7RS-small:准引用表达式的等价性

R7RS-small: equivalence of quasiquoted expressions

第 20-21 页的 R7RS-small standard 部分 4.2.8 准引用说

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

相当于

但不等同于:

(let ((a 3)) (list (list 1 2) a 4 'five 6))

上面的表达式与前三个表达式有何不同?以上所有四个表达式的计算结果相同:'((1 2) 3 4 five 6).

原因在例子前几行给出(强调是我的):

A quasiquote expression may return either newly allocated, mutable objects or literal structure for any structure that is constructed at run time during the evaluation of the expression. Portions that do not need to be rebuilt are always literal.

这意味着在:

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

准引号 中的 (1 2) 部分必须 被视为文字,如 ...'(1 2)... 中那样,而不是从其组件构建的结构,例如在:...(list 1 2)....

这似乎是一个过度指定,因为 '(1 2) 打印与 (list 1 2) 完全相同,但是第一个列表 cannot 被改变(或者,更好的是,有如果发生突变,则为未定义行为),而第二个可以合法突变。