我在接受 Chuck Moore 的采访时看到了这一点,他说:
操作该堆栈的词是 DUP、DROP 和 OVER 句点。没有,好吧 SWAP 非常方便,你想要它,但它不是机器指令。
所以我试图SWAP
只用DUP
,DROP
和来实现OVER
,但不知道怎么做,至少不增加堆栈。
这是怎么做到的,真的吗?
我在接受 Chuck Moore 的采访时看到了这一点,他说:
操作该堆栈的词是 DUP、DROP 和 OVER 句点。没有,好吧 SWAP 非常方便,你想要它,但它不是机器指令。
所以我试图SWAP
只用DUP
,DROP
和来实现OVER
,但不知道怎么做,至少不增加堆栈。
这是怎么做到的,真的吗?
你是对的,仅仅 dup、drop 和 over 似乎很难或不可能。
我猜 i21可能也有某种返回堆栈操作,所以这会起作用:
: swap over 2>r drop 2r> ;
编辑:在也没有本机交换的 GA144 上,它实现为:
over push over or or pop
Push
并pop
指返回栈,or
实际上是异或。见http://www.colorforth.com/inst.htm
在标准 Forth 中是
: swap ( a b -- b a ) >r >r 2r> ;
或者
: swap ( a b -- b a ) 0 rot nip ;
或者
: swap ( a b -- b a ) 0 rot + ;
或者
: swap ( a b -- b a ) 0 rot or ;
Charles Moore 的这句话很容易被误解,因为它是在他的 Forth 处理器的上下文中。SWAP不是硬件 Forth 处理器的机器指令。一般来说,在 Forth 中,一些定义是根据其他定义来定义的,但这以某些所谓的原语结尾。在 Forth 处理器中,它们是在硬件中实现的,但在主机系统或单板计算机上的所有 Forth 实现中,它们是由一系列机器指令实现的,例如 Intel:
CODE SWAP pop, ax pop, bx push, ax push, bx END-CODE
他还使用了“方便”一词,因为 SWAP 通常是可以避免的。在这种情况下,您需要处理两个数据项,但它们不是您想要的顺序。SWAP意味着一种精神负担,因为您必须想象堆栈内容发生了变化。人们通常可以通过使用辅助堆栈来临时存放您现在不需要的物品来保持堆栈平直。或者,如果您需要两次OVER的项目,则更可取。或者一个词可以有不同的定义,它的参数有不同的顺序。
用 4 个 FORTH 字而不是 4 个机器指令来实现SWAP显然会适得其反,因为这些 FORTH 字每个都必须由几个机器指令本身实现。