Forth wurde als 2-Stack-Maschine entwofen. Es gibt den Daten- und den Returnstack. Auf dem Returnstack wird die Liste der auszuführenden Forthworte geführt, die dort meist in der Form von Adressen liegen. Vorübergehend können aber auch Daten auf den Returnstack ausgelagert werden. Das Wort >R
1) erledigt dies.
Die Daten müssen aber von dort wieder zurück auf den Datenstack geholt werden. R>
2) muss also ausgeführt worden sein, bevor die Definition mit NEXT
verlassen wird um zum nächsten Forthwort zu kommen. So werden >r
und r>
immer als Paar benutzt. Sie können also nur innerhalb einer Definition verwendet werden. 3)
Das Paar >r
und r>
wird immer maschinenabbhängig implementiert. Der Stackpointer kann in Registern oder Uservariablen liegen. Es gibt keinen sicheren Weg in high level forth diesen ReturnstackPointer RP zu manipulieren.
Gleichwohl kann auch der Returnstack innerhalb einer Definition auf forthige Weise gefahrlos gelesen und geschrieben werden - wenn man darauf achtet, seine Daten oberhalb der nächsten Adresse zu halten, und zum Schluß auch wieder zu entfernen. RP@
liefert die aktuelle Adresse des TOP
of ReturnStack. 4)
: rtest1 ( x1 x2 -- x1 x2 ) cr rp@ . rp@ @ . ( R: -- next address) >r cr rp@ . rp@ @ . >r cr rp@ . rp@ @ . r> cr rp@ . rp@ @ . r> cr rp@ . rp@ @ . ( R: -- next address) cr .s ; : rtest2 ( x1 x2 -- x1 x2 ) cr rp@ . rp@ @ . >r cr rp@ . rp@ @ . >r cr rp@ . rp@ @ . 44 rp@ ! cr rp@ . rp@ @ . 55 rp@ ! cr rp@ . rp@ @ . r> cr rp@ . rp@ @ . r> cr rp@ . rp@ @ . cr .s ;
CELL
von System zu System variiert. In Gforth ist CELL=4
und daher erhöht oder erniedrigt sich die Addresse um 4, wenn Daten auf den Stack gelegt, oder von dort genommen werde.