====== Stack Word Set ===== Kern ^ [[.:stack:2dup|2dup]] |( x1 x2 --- x1 x2 x1 x2 )| ^ [[.:stack:2over|2over]] |( x1 x2 x3 x4 --- x1 x2 x3 x4 x1 x2 )| ^ [[.:stack:2swap|2swap]] |( x1 x2 x3 x4 --- x3 x4 x1 x2 )| ^ [[.:stack:to-r|>R]] |Execution: ( x --- ) und ( R: --- x )| ^ [[.:stack:question-dup|?DUP]] |entweder: ( x --- 0 ) oder: ( x --- x x )| ^ [[.:stack:depth|depth]] |( --- +n )| ^ [[.:stack:drop|drop]] |( x --- )| ^ [[.:stack:dup|dup]] |( x --- x x )| ^ [[.:stack:over|over]] |( x1 x2 --- x1 x2 x1 )| ^ [[.:stack:r-from|R>]] |Execution: ( --- x ) und ( R: x --- )| ^ [[.:stack:r-drop|rdrop]] |( R: x --- )| ^ [[.:stack:rp-fetch|rp@]] |( --- a-addr )| ^ [[.:stack:rp-store|rp!]] |( a-addr --- )| ^ [[.:stack:r-fetch|r@]] |Execution: ( --- x ) und ( R: x --- x )| ^ [[.:stack:rot|rot]] |( x1 x2 x3 --- x2 x3 x1 )| ^ [[.:stack:sp-fetch|sp@]] |( --- a-addr )| ^ [[.:stack:sp-store|sp!]] |( a-addr --- )| ^ [[.:stack:swap|swap]] |( x1 x2 --- x2 x1 )| Extension ^ [[.:stack:tuck|tuck]] |( x1 x2 --- x2 x1 x2 )| ===== Der Stack ===== Wie der Datenstapel - Stack - physikalisch angelegt ist, wird bei der Implementation des Forthsystems festgelegt. Bildlich wächst ein leerer Stack nach oben. Das oberste Element heißt TOP und das darunter SECOND und das unterste BOTTOM. Auf dem Stack abgelegt werden Datenworte wie Zahlen, Adressen oder Charakters. Die Datenworte sind gewöhnlich nicht weiter gekennzeichnet, und es ist dem Programmierer überlassen, die Bedeutung der Daten bei der Verarbeitung zu kennen und richtig handhaben. 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. Forth kennt mehrere Instruktionen um Daten auf den Stacks auszutauschen. Dieses **stack word set** hat sich im Laufe der Jahre herausgebildet. Es ist die Sammlung der geläufigsten Daten-Operationen auf dem Stack. Nicht alle müssen in jedem Forthsystem implementiert sein. **Beispiele:** * ''DROP'' entfernt das oberste Datenwort vom Stack. Dabei bleibt der Wert auf dem Stack physikalisch noch solange erhalten, bis eine andere Routine einen neuen Wert einschreibt. * ''>R'' verschiebt das oberste Datenwort vom Daten- auf den Returnstack, und ''R>'' holt es zurück.