我目前正在实施一个基于网络的计划环境,用于踢腿和傻笑。在实现解析器时,我偶然发现了一个奇怪的问题:一些Scheme实现声明读取数字的数字直到满足分隔符,但它们也声称双引号是有效的分隔符。成功评估123"abc"
对我来说似乎很奇怪,但是Racket似乎这样做,依次显示123
和"abc"
。
很困惑,我启动了Gimp并进入了它的Script-Fu控制台,这是Guile Scheme。给它相同的表达,它抱怨一个无约束的价值;所以它试图将其解析为符号?
我尝试了JScheme作为'第三意见'。它还抱怨未定义的变量。
TL; DR: Scheme的行为应该是什么?
旁注:鉴于后两者的抱怨,我尝试了以下方法:
(define 123"abc" 10)
123"abc"
评估为10
。我糊涂了。双引号标记不应该导致解析器挽救而不是分配符号吗?
答案 0 :(得分:1)
在您选择的Scheme实现上尝试此操作(您可能需要在字符串端口工作之前加载SRFI 6):
(call-with-input-string "(123\"abc\")" read)
在Racket和Guile上,它都以(123 "abc")
的形式读入,这与我的期望完全一样。通过快速浏览R5RS的“词法结构”部分,我相信返回不同内容的实现,如(|123"abc"|)
,可能不符合。