Liste des Groupes | Revenir à cl forth |
On 14/05/2025 7:17 pm, Hans Bezemer wrote:Ooooh! I find it almost as beautiful as UNLOOP and LEAVE. If you want to do a thing before doing another thing then do it - and then enter the loop. Ok, it may violate your sense of elegance (depending on your taste) but it is much more understandable:On 14-05-2025 09:07, ahmed wrote:Except eForth's FOR NEXT had AFT WHILE etc to effect such things. Never say never?On Wed, 14 May 2025 5:51:35 +0000, anthk wrote:>
>On 2024-07-11, ahmed <melahi_ahmed@yahoo.fr> wrote:>Thanks for the explanation.>
How can I get FOR and NEXT with MinForth? I have MF384.
>
Ahmed
In pforth (pfe), that's why I use to test code made for eforth:
>
: >MARK ( --A ) HERE 0 , ;
: AHEAD ( --A ) COMPILE branch >MARK ; IMMEDIATE
: AFT ( a --a A ) DROP [COMPILE] AHEAD [COMPILE] BEGIN SWAP ; IMMEDIATE
>
: FOR ( RUNTIME: N -- )
COMPILE ABS \ NO NEGATIVES
COMPILE LIT 0 , COMPILE SWAP
[COMPILE] ?DO ; IMMEDIATE
>
: NEXT
COMPILE LIT -1 ,
[COMPILE] +LOOP ; IMMEDIATE
Thanks.
>
I've already defined for and next in MinForth like this:
>
: (0) 0 ;
: (-1) -1 ;
: for_ postpone (0) postpone swap postpone ?do ; immediate
: _next postpone (-1) postpone +loop ; immediate
>
and here is an example of use:
>
: go_ 10 for_ i . _next ;
>
go_ 10 9 8 7 6 5 4 3 2 1 0 ok
Well, it isn't standardized - so you can make it anything you want to. I got two variants, the one I think it should be, and the one from eForth:
>
:macro for >r begin r@ 0> while ;
:macro next r> 1- >r repeat rdrop ;
>
eForth:
:macro for >r begin ;
:macro next r@ 0> while r> 1- >r repeat rdrop ;
>
They *SEEM* almost identical, but they aren't. The eForth one performs "the action" before the condition is tested, mine *AFTER* the condition is tested.
>
Now - what do I expect when I issue a "10"? I expect a thing to be performed ten times. No more, no less. And that's what mine gets. The eForth one does not ten things, but eleven (including the zero). Also note my version fixes another DO..LOOP problem - it bombs out when the count is zero or less.
>
Finally, we all agree DO..LOOP is deeply flawed (it is) but we still prefer to use it - preferably with loops with negative subscripts, or garnishing it with horrors like UNLOOP and LEAVE (Hello! - it's a *counted* loop. It should do as many times as I asked it to do initially - not halfway change my mind saying "Oops - now I want you to quit anyway").
...
I would say we "prefer to use" DO LOOP because when all said and done it hasn't been
bettered. Immediate LEAVE ?DO UNLOOP full range loops were incremental improvements
that led to DO LOOP's ubiquitous status in Forth. That said I can appreciate
restrictive environments where the decision was made to implement FOR NEXT instead.
Les messages affichés proviennent d'usenet.