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