为 infix 定义一个方案函数

问题描述 投票:0回答:3

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

例如,当我输入

(infix '(2 + 3))
时,它应该评估 5

如果我输入

(infix '(7 - 3)
它应该评估 4

scheme infix-operator
3个回答
1
投票

这很快就会变得非常复杂。考虑

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

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

如果您只支持两个操作数的表达式,这很简单,只需使用

cadr
来知道您得到的是哪个运算符,然后将该操作应用到操作数(也许使用
eval
[1]


[1] 如果您确实使用

eval
,请注意下面 Alex Knauth 的评论。


0
投票

解决方案太复杂,无法在此处显示。 要在Scheme中实现或使用中缀表示法,可以搜索并查看SRFI 105 Curly Infix或/和Scheme+的实现,Scheme+是Scheme语言的扩展,允许中缀表示法和其他功能,请参阅Scheme+


-1
投票

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

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

有人将其用作(中缀 1 + 2 - 9 + 10)

© www.soinside.com 2019 - 2024. All rights reserved.