修改字面量列表应报错吗?多款Scheme实现未触发R5RS/R7RS要求错误
你的理解存在部分偏差,你测试的几个Scheme实现的行为并没有违反R5RS/R7RS-small规范。
R5RS与R7RS-small中仅明确规定:修改字面量常量(即通过quote/'语法生成的列表、符号等对象)的行为属于未定义行为,并没有强制要求实现必须对这类操作抛出错误。
对未定义行为的处理完全交给实现自行决定:实现可以选择抛出错误、允许修改成功、静默忽略修改,甚至引发程序崩溃,都属于符合标准的处理逻辑。
你测试的几个实现默认都没有开启字面量常量的写保护机制,所以执行以下代码时不会报错:
(define (g) '(constant-list)) (set-car! (g) 3) ; 标准规定该操作行为未定义
部分实现提供了可选的运行/编译开关来开启字面量写保护,开启后再执行上述代码就会触发错误提示,比如Chez Scheme开启最高安全级别、Guile开启常量只读选项、Racket的plt-r5rs开启严格规范检查模式时,都会对这类操作抛出异常。
内容的提问来源于stack exchange,提问作者Flux
相关产品推荐
相关产品推荐

