R7RS-small 表示所有标识符都必须由分隔符终止,但同时它为标识符中的内容定义了非常详细的规则。那么是哪一个呢?
是一个标识符应该以一个初始字符开始,然后一直持续到一个分隔符,还是它以一个初始字符开始并继续遵循 7.1.1 中定义的语法。
这里有几个明显的案例。这些是有效的标识符吗?
a#a
b,b
c'c
d[d]
如果它们不应该是有效的,那么说标识符必须由分隔符终止的目的是什么?
|..ident..|
是 R7RS 中符号的分隔符,以允许您无法在旧样式符号中插入的任何字符(|
是分隔符)。
然而,在 R6RS 中,"official"
语法是不正确的,因为它不允许定义这样的符号1+
,这导致所有实现都定义了自己的规则来克服官方语法的这种疾病。
除非您需要阅读给定实现的源代码并了解它是如何定义符号的,否则您不应该太在意这些规则并使用经典符号。
在第 7.1.1 节中,您可以找到定义 R7RS 标识符的词法结构的 backus-naur 形式,但我怀疑实现是否遵循它。
我从这里引用
与标识符一样,Scheme 的不同实现使用略有不同的规则,但总是将不包含特殊字符且以不能以数字开头的字符开头的字符序列视为符号
换句话说,一个实现将使用像 read-atom 这样的函数,然后它将通过使用 read-number 和 if number? 回溯来对原子进行分类。失败它将是一个符号。