Nm... After tinkering in the debugger.. using 'pp etc..
I get it. I am still getting the  (= code data) in picolisp.

This gives the results I wanted.

(de Fibonacci (N)
   (let (Fib '(1 1 0) R 0)
      (do N
         (rot Fib)
         (set Fib (+ (cadr Fib) (caddr Fib)))
      )
      (setq R (car Fib))
      (set Fib 1 (cdr Fib) 1 (cddr Fib) 0)
      R
    ) )

Now I can write...

: (Fibonacci 1)
-> 2
: (Fibonacci 10)
-> 144
: (bench (nil (Fibonacci 100000)))
3.388 sec
: (length (chop (Fibonacci 100000)))
-> 20899 digits!

Picolisp bignums are awesome!

/Lindsay



On Sat, Mar 11, 2017 at 10:49 AM, Lindsay John Lawrence <
lawrence.lindsayj...@gmail.com> wrote:

> Hi
>
> I am having difficulty understanding the following..
>
> This works as expected...
>
> : (setq Sum '(1 1 0))
> -> (1 1 0)
> : (set Sum (+ (cadr Sum) (caddr Sum)))
> -> 1
> : (rot Sum)
> -> (0 1 1)
> : (set Sum (+ (cadr Sum) (caddr Sum)))
> -> 2
> : (rot Sum)
> -> (1 2 1)
> : (set Sum (+ (cadr Sum) (caddr Sum)))
> -> 3
> : (rot Sum)
> -> (1 3 2)
> : (set Sum (+ (cadr Sum) (caddr Sum)))
> -> 5
> : (rot Sum)
> -> (2 5 3)
> : (set Sum (+ (cadr Sum) (caddr Sum)))
> -> 8
> : Sum
> -> (8 5 3)
>
> However, when I put it in a function...
>
> (de Fibonacci (N)
>    (let (Fib '(1 1 0))
>       (do N
>          (rot Fib)
>          (set Fib (+ (cadr Fib) (caddr Fib))) )
>    (car Fib) ) )
>
> The results are something like a 'co routine or 'job... in that Fib as a
> memory between calls and it is not re-initialized with the 'let as I
> expected.
>
> -> Fibonacci
> : (Fibonacci 1)
> -> 2
> : (Fibonacci 1)
> -> 3
> : (Fibonacci 1)
> -> 5
> : (Fibonacci 1)
> -> 8
> ...
>
> The behavior I expected was
>
> : (Fibonacci 3)
> -> 5
> ..
>
> Why?
>
> /Lindsay
>
>
>
>
>

Reply via email to