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