Sysop: | Amessyroom |
---|---|
Location: | Fayetteville, NC |
Users: | 28 |
Nodes: | 6 (0 / 6) |
Uptime: | 47:53:34 |
Calls: | 422 |
Files: | 1,024 |
Messages: | 90,420 |
Thanks for the explanation.
How can I get FOR and NEXT with MinForth? I have MF384.
Ahmed
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
On 14-05-2025 09:07, ahmed wrote:
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").
In a 1000 line Forth program I use DO..LOOP 11 times - none with LEAVE
or UNLOOP. In another 500 line program, not at all. So if I had to
encode FOR..NEXT I wouldn't choose DO..LOOP - for obvious reasons.
Hans Bezemer