我在interview with Chuck Moore中看到了这一点,他说:
操纵该堆栈的单词是DUP,DROP和OVER周期。 没有,SWAP很方便你想要它,但事实并非如此 机器指令。
所以我尝试仅使用SWAP
,DUP
和DROP
来实现OVER
,但无法在不增加堆栈的情况下弄清楚如何执行此操作至少。
这是怎么做到的,真的吗?
答案 0 :(得分:7)
你是对的,只有重复,掉落和结束似乎很难或不可能。
我猜想i21 可能也有一些返回堆栈操作,所以这可行:
: swap over 2>r drop 2r> ;
编辑:在GA144上,它也没有原生交换,它实现为:
over push over or or pop
Push
和pop
引用返回堆栈,or
实际上是xor。见http://www.colorforth.com/inst.htm
答案 1 :(得分:3)
在标准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 ;
答案 2 :(得分:1)
Charles Moore的这一言论很容易被误解,因为这是在他的Forth处理器的背景下进行的。 SWAP 不是硬件Forth处理器的机器指令。通常,在Forth中,某些定义是根据其他定义来进行的,但这以某些所谓的原语结尾。在Forth处理器中,这些是通过硬件实现的,但是在所有Forth实现中,例如主机系统或单板计算机,它们是通过一系列机器指令来实现的,例如对于英特尔:
CODE SWAP pop,ax pop,bx push,ax push,bx END-CODE
他还使用“方便”一词,因为经常可以避免SWAP。在这种情况下,您需要处理两个数据项,但它们的顺序不理想。 SWAP 意味着精神负担,因为您必须想象堆栈内容已更改。人们通常可以通过使用辅助堆栈暂时保持您当前不需要的物品来保持堆栈笔直。或者,如果您需要两次,则最好 OVER 。或者可以用不同的顺序用不同的参数定义单词。
用4个FORTH字而不是4个机器指令来实现 SWAP 显然是适得其反的,因为这些FORTH字每个都必须由几个机器指令本身来实现。