Sujet : Re: LOOP
De : do-not-use (at) *nospam* swldwa.uk (Gerry Jackson)
Groupes : comp.lang.forthDate : 07. Jul 2025, 07:54:19
Autres entêtes
Organisation : A noiseless patient Spider
Message-ID : <104fquq$2p8dc$1@dont-email.me>
References : 1 2 3 4 5 6 7 8 9 10 11
User-Agent : Mozilla Thunderbird
On 03/07/2025 20:33, minforth wrote:
On Sat, 28 Jun 2025 21:01:48 +0000, Anton Ertl wrote:
sean@conman.org writes:
What is the difference between FOR/NEXT and DO/LOOP? Don't they do the
same thing?
>
FOR ... NEXT on one system does not do the same thing as FOR ... NEXT
on some other systems, and they all behave different from DO ... LOOP.
>
Correct. Here are variants with iterators that even run on gforth 0.7.9:
\ ====== <n> FOR# .. #TIMES
==================================================
\ original: machine code
\ demo variant: slow Forth
: _ITERATE \ end xt
swap
BEGIN dup 0>
WHILE over execute 1-
REPEAT 2drop ;
: FOR# postpone [: ; IMMEDIATE
: #TIMES postpone ;] postpone _iterate ; IMMEDIATE
\ ====== <n> FOR .. N M .. NEXT
==============================================
I've found looping quotations useful but I like to include the quotation inside the loop e.g. (without the syntactic sugar and moving the iterator inside the quotation):
: downcount begin [: dup 0> if dup . 1- then ;] over 0> while execute repeat 2drop ;
10 downcount \ displays 10 9 8 7 6 5 4 3 2 1 ok
Advantages are:
1) The xt is not passed to the quotation and so doesn't get in the way. 2) The xt is loaded as a literal when the quotation exits.
3) The quotation can exit the loop early by EXITing with 0 on the stack.
-- Gerry