2013-04-22 490 views
1

我想在Scheme中实现我自己的减法函数。我必须使用apply方法将减法应用于用户的输入。事情是,用户输入必须介于(),[]或{}之间(我正在为小语言编写一个小解释器)。我的代码已经管理好了,但是我的问题是使用apply方法。我只需要读取在右括号之前输入的数据。有没有办法读取输入并在分隔符“)”,“]”或“{}”处停止。即使你可以用一个分隔符指引正确的方向,我也可以让其余的工作。如何在输入特定字符时停止阅读输入?

这里就是我想要做的事:

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

但我想让它停在右括号阅读。

回答

1

read过程读取#\(#\)之间方案的形式。假设括号是适当的分隔符以下工作:

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

当然,-预计数字和read将返回任何方案的形式。

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

只要你找到一个左括号,将它添加到一个堆栈中,并开始将你读过的字符添加到数据结构中,比如说一个新的列表或语法树(注意:你必须逐个字符地阅读,没有像你的代码中所暗示的那样一行一行!)。每当找到堆栈中最顶层元素对应的右括号时,从堆栈中弹出最顶层的括号,并停止向元素列表中添加元素 - 此时您知道在使用的数据结构中已经读取了完整的表达式并可以继续进行评估。

此外,您应该分离用于解析输入的代码以评估它,以评估者接收列表,语法树或解析器返回的任何中间表示形式的方式,而不必担心读取字符,找到匹配的括号等

编辑

如果你没有从头开始实现一个解析器需要,包括内置的程序简单的解决方案会做,所建议@ GoZoner:使用read程序,确保输入数字在()和ð结束输入与一回,像这样:

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

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