-6

如何为中缀计算器定义方案函数?

例如,当我输入(infix '(2 + 3))它应该评估 5

如果我输入(infix '(7 - 3)它应该评估 4

4

2 回答 2

0

这会很快变得非常复杂。考虑(1 - 2 * 3)。如果你的计算器只支持加法和反法,这仍然不是小事。考虑(5 - 5 - 5)。如果您将输入视为左关联,您将得到正确的 -5,但如果您将其读取为右关联(如果您使用一些 LL 解析器解析表达式,这是一个常见错误),您将得到 0。

为了正确地从中缀转换为前缀(这是您在 Scheme 中计算结果的方式),您通常需要将整个输入解析为解析树,一旦正确完成,其余的实际上就是,微不足道的(树节点是操作,叶子是数字)。

如果您只支持两个操作数的表达式,这很容易,只需使用cadr知道您得到哪个运算符,然后将该操作应用于(可能使用eval[1])操作数


[1] 如果您使用eval,请注意下面 Alex Knauth 的评论。

于 2018-09-23T13:18:34.620 回答
-1

这仅适用于 + 和 - 但我找到了语法,

(define-syntax infix 
  (syntax-rules (+ -)
    ((_ a) a)
    ((_ a + b ...) (+ a (_ b ...)))
    ((_ a - b ...) (- a (_ b ...))))

一个使用它作为(中缀 1 + 2 - 9 + 10)

于 2021-07-23T20:23:41.453 回答