定义中缀的scheme函数

定义中缀的scheme函数,scheme,infix-operator,Scheme,Infix Operator,如何为中缀计算器定义scheme函数 例如,当我输入中缀'2+3时,它的值应为5 如果我输入中缀'7-3,它应该计算4,这会很快变得非常复杂。考虑1 - 2×3。 如果您的计算器只支持加法和求反,这仍然不是一件小事。考虑5—5—5。如果你认为输入是左相联的,你会得到正确的-5,但是如果你把它看作是右联的,这是一个常见的错误,如果你用一些LL解析器解析表达式,你会得到0。 为了将中缀转换为前缀(这是在Scheme中正确计算结果的方式),通常需要将整个输入解析到解析树中,一旦正确完成,其余部分实际上

如何为中缀计算器定义scheme函数

例如,当我输入中缀'2+3时,它的值应为5


如果我输入中缀'7-3,它应该计算4

,这会很快变得非常复杂。考虑1 - 2×3。 如果您的计算器只支持加法和求反,这仍然不是一件小事。考虑5—5—5。如果你认为输入是左相联的,你会得到正确的-5,但是如果你把它看作是右联的,这是一个常见的错误,如果你用一些LL解析器解析表达式,你会得到0。 为了将中缀转换为前缀(这是在Scheme中正确计算结果的方式),通常需要将整个输入解析到解析树中,一旦正确完成,其余部分实际上很简单,树节点是操作,叶子是数字

如果您只支持两个操作数的表达式,这很简单,只需使用cadr了解得到的运算符,并可能使用eval[1]将该操作应用于操作数


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

定义语法中缀l语法case l quote u'abc'bachow大约7-3*4?是否每个表达式只支持3个元素?你允许像7+2-4+1这样的子表达式吗?您认为这样的表达式需要如何处理才能支持深度嵌套的表达式?如果可能的话,我会避免使用eval。@AlexKnauth,为什么?因为它没有其他函数定义得那么好。在Repl中,您可以将*从乘法重新定义为a、or或任何真正的形式。您在引用中编写的*或+,在其静态上下文中具有某种预期的含义,而是从其外部获取其含义,以便在其他地方动态重写。引号失去了本地含义,eval的含义被非本地覆盖。当然,是的,eval实现了动态绑定,但我不会说它定义得不太好。这就是它的定义。然而,这是一个很好的警告。谢谢