1

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

这是我正在尝试做的事情:

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

但我希望它在右括号处停止阅读。

4

2 回答 2

1

The read procedure reads Scheme forms between #\( and #\). Assuming parens are a suitable delimiter the following works:

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

Of course, - expects numbers and read will return any Scheme form.

> (subt 'ignore)
(10 5 3 1)
1
于 2013-04-22T16:56:00.030 回答
1

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

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

编辑

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

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

(subt)
 input: (10 2 1)
output: 7
于 2013-04-22T16:18:26.703 回答