读一个“。”在方案R5RS中

时间:2012-11-18 01:36:50

标签: scheme

我需要能够在项目的方案中读取用户输入。例如,我需要能够读取字符串4 5 * .。我正在使用(read)函数实现它,但在读取.时会出错。我会使用不同的符号,但它由项目描述指定。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:1)

您无法使用read输入任意文字。 read过程仅用于输入“S表达式”,这是一种可用于表示Scheme源代码表达式超集的数据格式。

您无法通过.过程读取read的原因是句点令牌在Scheme源中具有特殊作用:它用于点对表示法。 (C1 . C2)是将C1C2对写成S表达式的方式。请注意,单个 (C1 . C2)列表 (C1 C2)(由两对组成)之间存在重要差异;然而,源文本之间的唯一区别是存在/不存在单个句点。

点对符号在6.3.2 of the R5RS部分中描述。

因此,正如Dan D.对您的问题的评论中所建议的那样,您应该考虑使用read-char过程来使用用户输入文本。它在6.6.2 of the R5RS部分中描述。这似乎是违反直觉的,因为read-char只消耗一个字符,而read消耗许多字符(并构建一个可能很大的结构化数据树),但实际情况是你可以构建自己的解析器在read-char之上,按照Dan D的建议,在循环中重复调用它。

事实上,一些方案系统通过使其成为调用read的Scheme过程来实现read-char。例如,请参见Larceny's reader source code,其中read将调用get-datum,其中会调用get-datum-with-source-locations,在多个地方调用read-char

或者,您可能有其他方式从用户那里读取输入。 read-line过程非常常见(并且在read-char之上也很容易编写)。或者您可以查看一个Parser-Generator(就像为Larceny的读者生成源代码的那个,在上面链接。