[OpenBIOS] C's continue statement in Forth?
Programmingkid
programmingkidx at gmail.com
Mon Aug 27 13:36:40 CEST 2012
On Aug 25, 2012, at 8:19 AM, openbios-request at openbios.org wrote:
>> I was wondering if there is a way to implement C's continue
>> statement in Forth. I have this loop, and some times I only want to
>> execute part of it, and then continue on to the next iteration
>> without finishing the current iteration. Is there any way of doing
>> this in OpenBIOS?
>
> It certainly can be done. But it sounds like you are making a
> word with a very big body; this is not the Forth way. Instead,
> factor your words into smaller words, for example, pull the loop
> body (the part between WHILE and REPEAT) into a separate word.
> It then becomes trivial to do your "continue" (and it will also
> be much more readable!)
>
>> begin
>> \ condition
>> while
>>
>> \ conditional code
>> if
>> CONTINUE \ skip rest of loop
>> then
>>
>> \ rest of loop ...
>>
>> repeat
>
> You don't have anything in here that "increases" the condition
> (increases some counter, follows a pointer, whatever). Typically
> you would have that just before the REPEAT, but your example makes
> it seem you have it between the BEGIN and WHILE. So your code is:
>
> BEGIN cond WHILE smth IF CONTINUE THEN rest REPEAT
>
> which you can write as
>
> BEGIN cond WHILE smth 0= IF rest THEN REPEAT
>
> (and if you do have an "increment" just before the REPEAT, which
> you want to run on CONTINUE, you can put it between the THEN and
> REPEAT in the modified example).
>
> But, let's build a CONTINUE like you described, just for fun.
> Let's look at the structure words you used:
>
> BEGIN ( C: -- dest )
> WHILE ( C: dest -- orig dest )
> REPEAT ( C: orig dest -- )
>
> You want to use your CONTINUE word between WHILE and REPEAT, and
> it should jump back to "dest"; at compile time, it should not drop
> the "dest" from the compilation stack. So its stack diagram is
>
> CONTINUE ( C: orig dest -- orig dest )
>
> or just
>
> CONTINUE ( C: dest -- dest )
>
> For doing an unconditional jump back, there is AGAIN, which is
>
> AGAIN ( C: dest -- )
>
> That eats the dest from the compilation stack though, so we want
> to duplicate it first, using CS-DUP
>
> CS-DUP ( C: dest -- dest dest )
>
> Not every system has that; just make it from CS-PICK, like so:
>
> : CS-DUP 0 CS-PICK ; IMMEDIATE
>
> And then let's do CONTINUE itself:
>
> : CONTINUE CS-DUP POSTPONE AGAIN ; IMMEDIATE
>
> Or you might want a ?CONTINUE which does the equivalent of
> IF CONTINUE THEN:
>
> : ?CONTINUE POSTPONE 0= CS-DUP POSTPONE UNTIL ; IMMEDIATE
>
>
> Hope this helps,
>
>
> Segher
You are right. My code was a little too long, so refactoring it fixed the problem. I guess I was still programming like a C programmer still. Thanks for the help.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openbios.org/pipermail/openbios/attachments/20120827/7947de5a/attachment.html>
More information about the OpenBIOS
mailing list