2

我目前正在实施一个基于 Web 的 Scheme 环境,用于踢球和咯咯笑。在实现解析器的过程中,我偶然发现了一个奇怪的现象:一些 Scheme 实现声明在遇到分隔符之前读取数字的数字,但他们也声称双引号是有效的分隔符。成功评估123"abc"对我来说似乎很奇怪,但 Racket 似乎做到了,显示123"abc"顺序。

困惑的我启动了 Gimp 并进入了它的 Script-Fu 控制台,下面是 Guile Scheme。给它同样的表达,它抱怨一个未绑定的值;所以它试图将其解析为符号?

我尝试将 JScheme 作为“第三意见”。它还抱怨一个未定义的变量。

TL;DR: Scheme 的行为应该是什么?

旁注:鉴于后两者的抱怨,我尝试了以下方法:

(define 123"abc" 10)
123"abc"

它评估为10。我很困惑。双引号不应该导致解析器退出而不是分配符号吗?

4

1 回答 1

1

在你选择的 Scheme 实现上试试这个(你可能需要在SRFI 6中加载字符串端口才能工作):

(call-with-input-string "(123\"abc\")" read)

在 Racket 和 Guile 上,这都读取为(123 "abc"),这正是我所期望的。快速浏览 R5RS 的“词法结构”部分,我相信返回不同内容的实现,例如(|123"abc"|),可能是不符合标准的。

于 2013-03-18T13:16:09.470 回答