【问题标题】:What are valid identifiers in R7RS-small?R7RS-small 中的有效标识符是什么?
【发布时间】:2020-06-20 08:20:17
【问题描述】:

R7RS-small 表示所有标识符都必须由分隔符终止,但同时它为标识符中的内容定义了非常详尽的规则。那么是哪一个呢?

是一个标识符应该以一个初始字符开始,然后一直持续到一个分隔符,还是它以一个初始字符开始并按照 7.1.1 中定义的语法继续。

这里有几个明显的案例。这些是有效的标识符吗?

  • a#a
  • b,b
  • c'c
  • d[d]

如果它们不应该是有效的,那么说标识符必须由分隔符终止的目的是什么?

【问题讨论】:

  • 可能意图是一个有效的标识符后面必须跟一个分隔符,否则就是无效的。
  • 处理方案语法的一个想法也是google for read-atom。这是一个非标准化的 lisp 函数,实现在内部使用它来更一般地读取符号、数字和原子,之后它将尝试通过回溯数字、符号等中的原子来进行分类。
  • 我还编辑了我的答案。

标签: scheme r7rs


【解决方案1】:

|..ident..| 是 R7RS 中符号的分隔符,以允许您无法在旧式符号中插入任何字符(| 是分隔符)。

但是,在 R6RS 中,"official" grammar 是不正确的,因为它不允许定义像 1+ 这样的符号,这导致所有实现都定义了自己的规则来克服官方语法的这种疾病。

除非您需要阅读给定实现的源代码并了解它是如何定义符号的,否则您不应该太在意这些规则并使用经典符号。

section 7.1.1 中,您可以找到定义 R7RS 标识符的词法结构的 backus-naur 形式,但我怀疑实现是否遵循它。

我引用here

与标识符一样,Scheme 的不同实现使用略有不同 不同的规则,但总是有一个序列 不包含特殊字符且以 a 开头的字符 不能以数字开头的字符被视为符号

换句话说,一个实现将使用像 read-atom 这样的函数,然后它会通过使用 read-number 和 if number 回溯来对原子进行分类?失败它将是一个符号。

【讨论】:

  • 我想了解规范的意图,比如我是否想制作一个全新的 R7RS 实现。为什么说“不以竖线开头的标识符以⟨delimiter⟩结尾”,同时又为标识符提供了不同的语法?除了语法所说的内容之外,有效标识符是否还必须由分隔符终止?
  • @TzvetanMikov 句法类 是在 7.1.1 中定义的,正如我已经说过的那样——它由空格、(、)、" 等组成。如果你是不熟悉 7.1 中的这种表示法,那么您应该先从简单的事情开始,然后再尝试 r7rs 实现。尝试更好地实现 r4rs。
  • 我对符号很熟悉,谢谢,但它是模棱两可的。人们应该能够仅从文本中得出行为,而无需参考现有的实现。如果您遵循语法,则无需使用分隔符终止标识符。除了语法之外,是否还打算应用分隔符规则?具体来说,我在问题中给出的示例是如何被解析的,比如“a,a”? "," 不是分隔符,但它也不是 的一部分。
  • @TzvetanMikov 我现在查看了 r7rs 语法。它与 r6rs 语法有同样的问题——1+ 在 r7rs 中也不是有效符号(因为 1 不属于 <initial> 类)。但是所有实现都定义了自己的规则,以使某些符号有效。因此,对于您的特定符号,您需要查阅您感兴趣的实现的源代码。
  • @TzvetanMikov 您的所有示例都不是官方语法中的有效标识符,如果您发现在某些实现中它们是有效的,那么该实现不遵循官方定义,
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-05
  • 1970-01-01
  • 2011-06-15
  • 1970-01-01
  • 2011-09-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多