mirror of
https://git.sr.ht/~crc_/retroforth
synced 2024-11-16 19:48:56 +01:00
new example: ANS PICK and ROLL words
FossilOrigin-Name: ee9dcdbb5edbd8b30e0155ee5cde126254a180236b83ae2bf19d26a3f950befe
This commit is contained in:
parent
e2839d5340
commit
d5df058aa4
2 changed files with 58 additions and 0 deletions
|
@ -101,6 +101,7 @@ June 2019.
|
|||
## Examples
|
||||
|
||||
- add Abort.forth
|
||||
- add ANS-PICK-ROLL.forth
|
||||
- add atua-gophermap.forth
|
||||
- add Buffer.forth
|
||||
- add CaptureOutput.forth
|
||||
|
|
57
example/ANS-PICK-ROLL.forth
Normal file
57
example/ANS-PICK-ROLL.forth
Normal file
|
@ -0,0 +1,57 @@
|
|||
PICK and ROLL are problematic in that they require the ability
|
||||
to address the stack as if it were an array. The implementations
|
||||
here are not efficient as RETRO's stacks are *not* addressable.
|
||||
|
||||
These will never be added to the standard image, but are provided
|
||||
here as an aid in porting ANS FORTH code or for those curious as
|
||||
to how such things could be added.
|
||||
|
||||
# PICK
|
||||
|
||||
6.2.2030 PICK
|
||||
CORE EXT
|
||||
|
||||
( xu ... x1 x0 u -- xu ... x1 x0 xu )
|
||||
|
||||
Remove u. Copy the xu to the top of the stack. An ambiguous
|
||||
condition exists if there are less than u+2 items on the stack
|
||||
before PICK is executed.
|
||||
|
||||
|
||||
~~~
|
||||
{{
|
||||
:save-stack (...-a)
|
||||
here [ depth &, times ] dip ;
|
||||
:fetch-prior (a-n[a-1])
|
||||
dup fetch swap n:dec ;
|
||||
:restore-stack (a-...)
|
||||
here swap - here n:dec swap [ fetch-prior ] times drop ;
|
||||
---reveal---
|
||||
:PICK (...n-...m)
|
||||
&Heap [ [ save-stack ] dip
|
||||
over + fetch [ restore-stack ] dip ] v:preserve ;
|
||||
}}
|
||||
~~~
|
||||
|
||||
# ROLL
|
||||
|
||||
6.2.2150 ROLL
|
||||
CORE EXT
|
||||
|
||||
( xu xu-1 ... x0 u -- xu-1 ... x0 xu )
|
||||
|
||||
Remove u. Rotate u+1 items on the top of the stack. An ambiguous
|
||||
condition exists if there are less than u+2 items on the stack
|
||||
before ROLL is executed.
|
||||
|
||||
~~~
|
||||
{{
|
||||
:save-values (...n-a)
|
||||
[ , ] times here ;
|
||||
:restore-values (a-...)
|
||||
here - here swap [ fetch-next swap ] times drop ;
|
||||
---reveal---
|
||||
:ROLL (...n-...m)
|
||||
&Heap [ save-values ] v:preserve swap [ restore-values ] dip ;
|
||||
}}
|
||||
~~~
|
Loading…
Reference in a new issue