gforth
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [gforth] attempt to use WHILE leads to empty stack (loop issues)


From: Anton Ertl
Subject: Re: [gforth] attempt to use WHILE leads to empty stack (loop issues)
Date: Sun, 7 Mar 2010 15:43:23 +0100
User-agent: Mutt/1.5.18 (2008-05-17)

On Sat, Mar 06, 2010 at 02:32:29PM -0500, Terrence Brannon wrote:
> re: 
> http://www.complang.tuwien.ac.at/forth/gforth/Docs-html/General-Loops-Tutorial.html
> 
> First, the enormous amount of stack dancing really made this program
> hard to follow.

You mean, in this example:

     : log2 ( +n1 -- n2 )
     \ logarithmus dualis of n1>0, rounded down to the next integer
       assert( dup 0> )
       2/ 0 begin
         over 0> while
           1+ swap 2/ swap
       repeat
       nip ;

You ain't seen nothing yet.  Or, in other words, this is not an
example that would be considered as having a lot of stack dancing by
most Forth programmers.

The pattern

( x1 x2 ) update-x1 swap update-x2 swap ( x1' x2' )

is typical when two values have to be updated.

> As a person deciding what language to study, I
> immediately began to think "I think this stack dancing is very very
> confusing. Maybe I should look at another language." So, I tried to
> rewrite it, but for some reason, the stack is empty when it
> terminates.

Your rewrite appears to be an example of overfactoring.  If you want
to get rid of stack manipulation, you can do it with locals within one
colon definition, e.g.:

     : log2 { n1 -- n2 }
     \ logarithmus dualis of n1>0, rounded down to the next integer
       assert( n1 0> )
       n1 2/ 0 begin { n count }
         n 0> while
           n 2/ count 1+
       repeat
       count ;

This is pretty Gforth-specific, though (locals withing control
structures are not universally supported).  If you wonder why COUNT is
visible after the loop, read

http://www.complang.tuwien.ac.at/forth/gforth/Docs-html/Where-are-locals-visible-by-name_003f.html

- anton




reply via email to

[Prev in Thread] Current Thread [Next in Thread]