retroforth/example/numeric-ranges.retro
crc 2e95ec501a update more examples to use new word names
FossilOrigin-Name: 708314f58b4253b273c217a11265725bad4c8d7d7c53c503510440dade50be4d
2020-07-06 02:49:49 +00:00

31 lines
783 B
Forth

This implements some words to return a range of numbers on the stack.
It's probably best to capture these values in an array.
First is a word to return values from a lower to upper limit, incrementing
upwards. The returned values are inclusive of the limits.
~~~
:range-inc (lh-a)
over - n:inc [ I over + swap ] indexed-times drop ;
~~~
Next is a word to return values from an upper to lower limit, decrementing
upwards. The returned values are inclusive of the limits.
~~~
:range-dec (hl-a)
over &- dip swap n:inc [ I over swap - swap ] indexed-times drop ;
~~~
The last word takes the limits and calls the appropriate word.
~~~
:range (nn-a)
dup-pair gt? [ range-dec ] [ range-inc ] choose ;
~~~
As a simple test case:
```
{ #1 #5 range } [ n:put sp ] a:for-each
```