2013-11-22 9 views
7

ich sah, dass in einem interview with Chuck Moore, sagt er:SWAP Implementieren Forth in

Die Worte, die diesen Stapel sind DUP, DROP und über einen Zeitraum manipulieren. Es gibt keine, gut SWAP ist sehr praktisch, und Sie wollen es, aber es ist nicht eine Maschinenanweisung.

Also habe ich versuchte SWAP in Bezug auf nur DUP, DROP und OVER zu implementieren, kann aber nicht herausfinden, wie es zu tun, ohne den Stapel zumindest zu erhöhen.

Wie ist das wirklich gemacht?

+0

Ist das nicht sein Punkt? Vielleicht verstehe ich die Frage aber falsch. –

+1

@ AndréLaszlo Sein Punkt ist, dass SWAP in Bezug auf andere Anweisungen wie DUP, DROP und OVER implementiert wird. Aber wie machst du das, ohne den Stack zu erhöhen? – sashoalm

+0

"Aber wie machst du es, ohne den Stack zu erhöhen?", Auch nur vorübergehend? –

Antwort

7

Sie haben Recht, es scheint hart oder unmöglich mit nur dup, fallen, und vorbei.

Ich würde die i21 erraten wahrscheinlich auch eine Art Return-Stack Manipulation hat, so dass dies funktionieren würde:

: swap over 2>r drop 2r> ; 

Edit: Auf der GA144, die auch nicht über eine native Swap hat, es implementiert ist als:

over push over or or pop 

Pushpop und an den Rückkehrstapel beziehen, ist tatsächlich or xor. Siehe http://www.colorforth.com/inst.htm

+0

In der Tat, auf der F18 ist dies eine Möglichkeit, einen 'Swap' (' over push over 'oder' pop ') zu machen. Ein anderer könnte "über Push Push Drop Pop Pop" sein. Ein weiterer, mit weniger Anweisungen, aber mit dem A-Register, könnte 'Push a! pop a'. – AshleyF

+1

Ich würde auch erwähnen, dass im Wesentlichen über ist * bereits * ein "Swap" von Arten, außer dass es hinter einem Wert zurückbleibt. Seine Chips haben jedoch kreisförmige Stapel und das ist manchmal kein Problem. Oder Sie können später mit einem "Tropfen" aufräumen, nachdem die oberen Werte verbraucht wurden. So wird "over" in vielen Fällen anstelle von "swap" verwendet. – AshleyF

3

Im Standard-Forth ist

: swap (a b -- b a) >r >r 2r> ; 

oder

: swap (a b -- b a) 0 rot nip ; 

oder

: swap (a b -- b a) 0 rot + ; 

oder

: swap (a b -- b a) 0 rot or ;