syntax-rules标识符与全局名称冲突问题咨询
关于syntax-rules卫生宏内部标识符与全局名称冲突的规范行为问题
我遇到了syntax-rules的极端场景:正在使用经修改(将字符串字面量替换为标识符)的R7RS标准let-values宏,代码如下:
(define-syntax let-values (syntax-rules (bind mktmp) ((let-values (binding ...) body0 body1 ...) (let-values bind (binding ...) () (begin body0 body1 ...))) ((let-values bind () tmps body) (let tmps body)) ((let-values bind ((b0 e0) binding ...) tmps body) (let-values mktmp b0 e0 () (binding ...) tmps body)) ((let-values mktmp () e0 args bindings tmps body) (call-with-values (lambda () e0) (lambda args (let-values bind bindings tmps body)))) ((let-values mktmp (a . b) e0 (arg ...) bindings (tmp ...) body) (let-values mktmp b e0 (arg ... x) bindings (tmp ... (a x)) body)) ((let-values mktmp a e0 (arg ...) bindings (tmp ...) body) (call-with-values (lambda () e0) (lambda (arg ... . x) (let-values bind bindings (tmp ... (a x)) body))))))
搭配SRFI-210使用时,宏中的bind标识符与全局定义的bind函数冲突,该函数代码为:
(define (bind obj . transducers) (apply bind/list (list obj) transducers))
为适配我的Scheme实现(lips.js.org),曾错误移除标识符作用域检查。根据Gauche的syntax-rules文档,某示例仅Gambit支持,多数Scheme实现(Kawa、Guile、Chicken、Chez)无法运行;另一个测试示例则在所有被测实现中正常运行。结合卫生宏相关论文描述,我想咨询:当存在全局bind名称时,卫生宏let-values中的bind符号应遵循怎样的规范行为?
内容的提问来源于stack exchange,提问作者jcubic
相关产品推荐
相关产品推荐

