在 FORTH 中重写 a**2 + ab + c

Rewriting a**2 + ab + c in FORTH

第 2 章第 4 题 Starting FORTH (online here) 要求你为

写一个定义
a**2 + ab + c  ( c a b -- result )

答案是

: 2-4 OVER + * + ;

情况如何,假设a=1,b=2,c=3

3 1 2  ok
OVER .s <4> 3 1 2 1  ok
+ .s <3> 3 1 3  ok
* .s <2> 3 3  ok
+ .s <1> 6  ok

之所以有效,是因为正如评论中所述,我 math-stupid。

我看到了

OVER .s <4> 3 1 2 1  ok
+ .s <3> 3 1 3  ok

并被抛出一个循环。问题是

a**2 + ab + c  ( c a b -- result )

相同
a(a+b) + c  ( c a b -- result )

相同
c + a(a+b)  ( c a b -- result )

这基本上就是他们正在做的事情。他们稍微移动了表格

c + a(a+b)
c + a(b+a)

你看到在堆栈中,它被重新排列成这样...

c a b
c a b a  -- after over

然后他们就运行

c a b a + * +

聪明,感谢 Mateusz Piotrowski 在评论中指出。