In ANS ist 0 PICK
aquivalent zu DUP
(gforth).
PICK
wird gewöhnlich low level codiert. Das Beispiel in high level forth zeigt das Verhalten des Stack.
\ pick nth item from stack. top of stack is x0 befor n was placed there. : pick ( n -- xn ) 1+ cells sp@ + @ ;
In gforth wächst der Stack nach unten in Richtung absteigender Adressen um je eine cell pro item. Die älteren items haben daher die höhere Adresse.
screenshot: 66 55 44 33 22 11 00 ok drop sp@ . .s 21028840 <6> 66 55 44 33 22 11 ok drop sp@ . .s 21028844 <5> 66 55 44 33 22 ok drop sp@ . .s 21028848 <4> 66 55 44 33 ok drop sp@ . .s 21028852 <3> 66 55 44 ok drop sp@ . .s 21028856 <2> 66 55 ok drop sp@ . .s 21028860 <1> 66 ok drop sp@ . .s 21028864 <0> ok drop sp@ . .s *the terminal*:63: Stack underflow drop sp@ . .s ^^^^ Backtrace:
In Forth79 war 1 PICK
aquivalent zu DUP
(MVP-Forth).
Es waren 8-bit Maschinen, das Forthwort war 16 Bit breit, daher genügte immer 2*
statt cells
.
\ pick nth item from stack. top of stack is x1 befor n was placed there. : pick ( n -- xn ) dup 1 < abort" PICK ARGUMENT < 1" 2* sp@ + @ ;
Zum ausprobieren:
: dup ( x0-- x0 x0 ) 0 pick ; : 2dup ( x1 x0 -- x1 x0 x1 x0 ) 1 pick 1 pick ; : 3dup ( x2 x1 x0 -- x2 x1 x0 x2 x1 x0 ) 2 pick 2 pick 2 pick ; \ usw.