Counted loops (was: [SPOILER] Re: Euler problem #187)
  Home FAQ Contact Sign in
comp.lang.forth only
 
Advanced search
POPULAR GROUPS

more...

 Up
Counted loops (was: [SPOILER] Re: Euler problem #187)         

Group: comp.lang.forth · Group Profile
Author: Anton Ertl
Date: May 10, 2008 10:34

mhx@iae.nl (Marcel Hendrix) writes:
>anton@mips.complang.tuwien.ac.at (Anton Ertl) writes Re: [SPOILER] Re: Euler problem #187
>>> I can not read the code with these funny loops.
>
>> Read up on them in
>
>
>> They are just improved versions of the regular counted loops. I guess
>> I would have made another error or two with the regular counted loops.
>
>They may be technically superior, but having to look up the 8 (?)
>variants every time undoes any possible benefit for me.

I think it's pretty mnemonic (see below), and it saves you remembering
and working around the traps that the Forth-94 counted loops lay out
for you.

Let's first look at the DOs: You can have DOs for up-counting loops
(+DO, U+DO), and DOs for down-counting loops (-DO, U-DO). The other
dimension is whether the limits are signed (+DO, -DO) or unsigned
(U+DO, U-DO). So this gives a table

signed unsigned
count up +DO U+DO
count down -DO U-DO

Next, let's look at the LOOPs: there is the usual LOOP and +LOOP for
counting up, and the new -LOOP for counting down.

I don't use counted loops often, but I don't need to look these words
up when I need them.
>I really do
>not understand what 'problem' the Gforth manual sees in
>
>: test 0 3 do i . -1 +loop ; test 3 2 1 0 ok

: test 3 0 do i . 1 +loop ; test 0 1 2 ok

If you don't see a problem, you are blind.

Here's a better solution for counting down:

: test 0 3 do i . 1 -loop ; test 3 2 1 ok

(Note that the compat/loops.fs version of -LOOP only works with -DO and
U-DO, not with DO or ?DO).

The other problems with your test loop construction is that it uses
DO, and the problem can be seen with:

: test1 do i . -1 +loop ;
0 0 test1
0 -3 test1

These can be avoided by using -DO.

There is only one excuse for using DO, and knowing that the parameters
are distinct is not one of them.
>FORTH> euler187
>There are 17427272 composite integers, n < 10^8, having precisely two, not
>necessarily distinct, prime factors.
>0.250 seconds elapsed. ok

It seems you have worked at getting the wrong answer way faster?

- anton
no comments
diggit! del.icio.us! reddit!

RELATED THREADS
SubjectArticles qty Group
Re: Eddie: Spoilers c. 5th - 8th of March - also spoiler Thursuk.media.radio.archers ·