Scheme 将操作数推入堆栈的计算后修复

Scheme 将操作数推入堆栈的计算后修复,scheme,Scheme,不知道怎么开始,有什么建议吗 定义一个名为(eval postfix p)的SCHEME函数,该函数将接受后缀表达式(存储在表示操作数的整数和表示运算符的字符列表中),对该表达式求值,然后返回结果。 您的函数应该支持加法(#+)、减法(#-)、乘法(#*)、除法(#/)和幂运算(#\710)。 您可能希望从一个函数开始以增量方式工作,该函数采用表示运算符的字符,可以从堆栈中弹出两个操作数,计算运算符并将结果推回到堆栈上。接下来,您可以添加一个函数,通过将操作数推到堆栈上并在遇到运算符时计算后缀表

不知道怎么开始,有什么建议吗

定义一个名为(eval postfix p)的SCHEME函数,该函数将接受后缀表达式(存储在表示操作数的整数和表示运算符的字符列表中),对该表达式求值,然后返回结果。 您的函数应该支持加法(#+)、减法(#-)、乘法(#*)、除法(#/)和幂运算(#\710)。
您可能希望从一个函数开始以增量方式工作,该函数采用表示运算符的字符,可以从堆栈中弹出两个操作数,计算运算符并将结果推回到堆栈上。接下来,您可以添加一个函数,通过将操作数推到堆栈上并在遇到运算符时计算后缀表达式。注意,您可能想使用该号码?函数来确定列表中的项是操作数还是运算符。

生成一个函数,在堆栈上执行单个指令,并返回更改的堆栈:

(定义(后缀执行一个指令堆栈)
...)

它应该检查指令是否是
数字?
或类似
'+
的符号。如果它是一个数字,您可以返回
(cons指令堆栈)
来推送它,如果它是一个运算符,您需要从堆栈中弹出两个项目,将它们相加(或相减),然后将其推送到堆栈上并返回

那你就可以

(定义(后缀执行所有指令堆栈)
...)


它递归地在指令列表上循环,使用前面定义的helper函数执行每个指令,直到它达到
null?
。然后它可以返回最终堆栈。

这是您详细描述的建议起点。
这是一个很好的起点,所以要坚持下去

编写一个输入为一个运算符和一个堆栈的函数:

operator: +
stack: |x y z w|
它应该弹出两个操作数:

operator: +
left operand: x
right operand: y
stack: |z w|
评估:

result: x + y = A
stack: |z w|
然后返回堆栈,并在顶部添加结果:

|A z w|

完成此操作后(确保使用所有五个运算符进行测试),可以使用此函数实现完整的求值函数

后缀:
4567++
(4+(5+(6+7))
相同,而
456+7++
((4+5)+6)+7)相同。基本上,一个数字被推到堆栈上,由一个操作符对前2位执行操作。例如,
5 3 4+
将在堆栈上保留
5 7
。另一个
+
在堆栈上是
12
。如果您想要
((4*5)+(6*7))
您需要执行
45*6*7*+