2013-11-22 46 views
7

實施SWAP我看到在interview with Chuck Moore,他說:在第四

操縱該堆棧的字是DUP,DROP和OVER時期。 有沒有,很好的SWAP非常方便,你想要它,但它不是 機器指令。

於是,我就在僅僅DUPDROPOVER方面實現SWAP,但無法弄清楚如何做到這一點,沒有至少增加堆棧。

這是怎麼回事?

+0

這不就是他的觀點嗎?也許我誤解了這個問題。 –

+1

@AndréLaszlo他的觀點是,SWAP是通過其他指令來實現的,如DUP,DROP和OVER。但你怎麼做,而不增加堆棧? – sashoalm

+0

「但是你怎麼做,不增加堆棧?」,甚至暫時? –

回答

7

你說得對,看起來很難或不可能,只是重複,放棄和結束。

我猜I21 可能也有某種返回堆棧操作,所以這會工作:

: swap over 2>r drop 2r> ; 

編輯:在GA144,也沒有本地交換,它的實現如:

over push over or or pop 

Pushpop指返回堆棧,or實際上是XOR。見http://www.colorforth.com/inst.htm

+0

事實上,在F18上,這是一種做「交換」('over push over或pop)的方法。另一個可能是「過推推式彈出式流行音樂」。還有一種,使用A寄存器的指令較少,可能會「推!流行一個'。 – AshleyF

+1

我還要提到,基本上over *已經*是一個'swap'類,除了它留下了一個值。儘管他的籌碼有圓形堆疊,所以有時候這不是問題。或者,您可以在消耗最高值後使用「drop」進行清理。所以,在很多情況下,'over'用來代替'swap'。 – AshleyF

3

標準第四是

: 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 ;