Terrence Brannon wrote:
I [found](http://bit.ly/ar7uDi) a couple of naive fibonacci programs
by Bill Spight that work:

: FIB ?DUP
  CASE
    0 of 1 endof
    1 of 1- RECURSE 1 endof
    1- RECURSE TUCK +
  ENDCASE ;

: FIB DUP 0= IF 1 ELSE 1- RECURSE TUCK + THEN ;

But I would like to know why mine does not work:


: fib { n -- fibn }
  assert( n 0>= )
  n CASE
    0 OF 0 ENDOF
    1 OF 1 ENDOF
    2 OF 1 ENDOF        
    ( otherwise ) n 1 - recurse n 2 - recurse +
  ENDCASE ;

There is a non-explicit DROP before the ENDCASE. That's because the case parameter has to disappear at some point. Change your code in this way:

>     ( otherwise ) n 1 - recurse n 2 - recurse + SWAP

This way, the parameter will be dropped, not your computed Fib value, and it will work.

In general, CASE is not a very useful or used construct in Forth; this is not C. The less you use it, the better.


Reply via email to