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