我需要能够读取项目方案中的用户输入。例如,我需要能够读取字符串4 5 * .
。我正在使用该(read)
函数实现它,但它在读取.
. 我会使用不同的符号,但它是由项目描述指定的。有没有办法做到这一点?
1 回答
您不能用于read
输入任意文本。该read
过程仅用于输入“S-expressions”,一种可用于表示 Scheme 源代码表达式超集的数据格式。
您无法.
通过该read
过程读取 a 的原因是句点标记在 Scheme 源代码中具有特殊作用:它用于点对表示法。 (C1 . C2)
是把C1
和C2
写成 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 的阅读器生成源代码的那个,上面链接。