Scheme 输入特定字符时,如何停止读取输入?

Scheme 输入特定字符时,如何停止读取输入?,scheme,Scheme,我试图在Scheme中实现我自己的减法函数。我必须使用apply方法对用户的输入应用减法。问题是,用户输入必须介于()、[]或{}之间(我正在为一种小型语言编写一个小型解释器)。我的代码已经很好地管理了开头的括号,但我的问题是对其余部分使用apply方法。我只需要读取在结束括号前输入的数据。是否有方法读取输入并在分隔符“)”、“]”或“{}”处停止。即使你只需要一个分隔符就可以引导我朝着正确的方向前进,我也可以让其余的工作正常进行 以下是我想做的: (define subt (lambda (x

我试图在Scheme中实现我自己的减法函数。我必须使用apply方法对用户的输入应用减法。问题是,用户输入必须介于()、[]或{}之间(我正在为一种小型语言编写一个小型解释器)。我的代码已经很好地管理了开头的括号,但我的问题是对其余部分使用apply方法。我只需要读取在结束括号前输入的数据。是否有方法读取输入并在分隔符“)”、“]”或“{}”处停止。即使你只需要一个分隔符就可以引导我朝着正确的方向前进,我也可以让其余的工作正常进行

以下是我想做的:

(define subt (lambda (x)
             (apply - (read-line))))

但我希望它停止在结束括号处读取。

每当找到开始括号时,将其添加到堆栈中,并开始将读取的字符添加到数据结构中,例如,一个新的列表或语法树(注意:您必须逐个字符读取,而不是像代码中暗示的那样逐行读取!)。每当您找到对应于堆栈中最顶端元素的右括号时,请从堆栈中弹出最顶端的括号,并停止向字符列表中添加元素-此时您知道已在使用的数据结构中读取了完整的表达式,并可以继续对其求值

此外,您应该将用于解析输入的代码与用于对输入进行求值的代码分开,以便求值器接收列表、语法树或解析器返回的任何中间表示,并且不必担心读取字符、查找匹配括号等

编辑

如果不需要从头开始实现解析器,则可以使用一个包含内置过程的简单解决方案,正如@GoZoner所建议的那样:使用
read
过程,确保在
()
之间输入数字,并以返回结束输入,如下所示:

(define (subt)
  (apply - (read)))

(subt)
 input: (10 2 1)
output: 7

read
过程读取
\\(
\\)
之间的方案表单。假设parens是一个合适的分隔符,则以下工作:

(define subt
  (lambda (x)
    (apply - (read))))
当然,
-
需要数字,
read
将返回任何方案表单

> (subt 'ignore)
(10 5 3 1)
1