2

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

4

1 回答 1

1

您不能用于read输入任意文本。该read过程仅用于输入“S-expressions”,一种可用于表示 Scheme 源代码表达式超集的数据格式。

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

点对符号在 R5RS 的第 6.3.2 节中进行了描述。

因此,正如 Dan D. 在对您的问题的评论中所建议的那样,您应该考虑使用该read-char过程来使用用户输入文本。它在R5RS 的第 6.6.2 节中进行了描述。这似乎违反直觉,因为read-char只消耗一个字符而read消耗许多字符(并构建一个潜在的大型结构化数据树),但现实是您可以在 之上构建自己的解析器read-char,通过在循环,正如 Dan D. 所建议的那样。

事实上,一些方案系统read通过使其成为调用read-char. 参见例如Larceny 的阅读器源代码,哪里read会调用get-datum,哪些调用get-datum-with-source-locations,哪些调用read-char在多个地方。

或者,您可能有其他方式来读取用户的输入。这个read-line过程很常见(而且它也很容易写在上面read-char)。或者您可能会查看 Parser-Generator(例如为 Larceny 的阅读器生成源代码的那个,上面链接。

于 2013-02-10T16:27:48.367 回答