You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修改字面量列表应报错吗?多款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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 18:00:04