William James <w_a_x_man@[EMAIL PROTECTED]
> writes:
>On May 5, 11:49 am, an...@[EMAIL PROTECTED]
(Anton Ertl)
>> : n-digits { n -- n2 }
>> \ number of n-th powers with n digits
>> \ for n=1, it does not count 0 and 1 (I correct for the 1 below)
>> \ this works by just seeing what the lowest x is that fits in
>> \ 10^(n-1), and then rounding x up to an integer
>> n 1- 0 d>f n 0 d>f f/ falog f>d drop 9 swap - ;
>
>Clever, but the stack makes it hard to follow the code.
I find that the conversion between integer and FP, with a double-cell
intermediate step makes it a little bit convoluted. One can fix that
with factoring (and using FLOOR, which I have hitherto overlooked):
: u>f 0 d>f ;
: f>u f>d drop ;
: nnf/ ( n1 n2 -- f ) swap u>f u>f f/ ;
: n-digits1 { n -- r }
9e n 1- n nnf/ falog floor f- ;
>> : solve ( -- )
>> 1 1 begin ( n sum )
>> over n-digits dup 0> while
>> + swap 1+ swap repeat
>> drop nip ;
>
>Again, the stack makes it very difficult to follow.
>When one sees the +, he can't easily tell what two
>items are being added together. This code is hard
>to understand and to modify.
With N-DIGITS1, it becomes a little easier:
: solve ( -- r )
1 1e begin ( n rsum )
dup n-digits1 fdup f0> while ( n rsum r )
f+ 1+ repeat
fdrop drop ;
Or you can use locals to reduce the stack load:
: solve ( -- r )
1 1e begin { n f: rsum }
n n-digits1 { f: r }
r f0> while
n 1+ r rsum f+ repeat
rsum ;
But given the tone of your posting, I guess you think that the stack
makes that difficult to follow, too. Then you have two options:
1) Get some more practice in reading Forth or other stack-based
languages. You may eventually get the hang of it.
2) Conclude that stack-based languages are not for you and stick with
whatever other language you like.
- anton
--
M. Anton Ertl http://www.complang.tuwien.ac.at/anton/home.html
comp.lang.forth FAQs: http://www.complang.tuwien.ac.at/forth/faq/toc.html
New standard: http://www.forth200x.org/forth200x.html
EuroForth 2008:
http://www.complang.tuwien.ac.at/anton/euroforth/ef08.html


|