如何为中缀计算器定义方案函数?
例如,当我输入(infix '(2 + 3))
时,它应该计算 5
如果我输入(infix '(7 - 3)
它应该评估 4
这可能会很快变得非常复杂。考虑(1 - 2 * 3)
. 如果您的计算器只支持加法和求反,这仍然不是微不足道的。考虑(5 - 5 - 5)
.如果您将输入视为左关联,您将获得正确的 -5,但如果您将其读取为右关联(如果使用某些 LL 解析器解析表达式,这是一个常见的错误(,您将获得 0。
为了正确地从中缀转换为前缀(这就是您在 Scheme 中计算结果的方式(,您通常需要将整个输入解析为解析树,一旦正确完成,其余的实际上是微不足道的(树节点是操作,叶子是数字(。
如果您只支持两个操作数的表达式,这很容易,只需使用cadr
知道您得到哪个运算符,并将该操作应用于操作数(可能使用[1]eval
[1] 如果您确实使用eval
,请注意下面Alex Knauth的评论。
这仅适用于 + 和 - 但我找到了语法,
(define-syntax infix
(syntax-rules (+ -)
((_ a) a)
((_ a + b ...) (+ a (_ b ...)))
((_ a - b ...) (- a (_ b ...))))
一个使用它作为(中缀 1 + 2 - 9 + 10(