Linsday when you want to prevent values from neing printed take a look at
the 'nil function.
Am 10.02.2017 19:44 schrieb "Lindsay John Lawrence" <
lawrence.lindsayj...@gmail.com>:

> If it even matters, the overhead of recurse is slowest here.
> So impressive that picolisp can iterate/recurse over a 10M element list in
> these times.
> (VirtualBox VM, 4GB, 1Core, with 64bit Debian).
>
> ... and 'make' is a lot more useful that I first realized.
>
> /Lindsay
>
> # Iterative
> (de sumi (L)
>    (let (Sum (car L))
>       (while (setq L (cdr L))
>          (setq Sum (+ Sum (car L))) ) ) )
>
> # Recurse
> (de sumr (N)
>    (cond
>       ((not N) 0)
>       (T (+ (car N) (sumr (cdr N)))) ) )
>
> # This may take a moment...
> : (setq bigly (range 1 10000000) D NIL) -> NIL
> : (bench (apply '+ bigly))  0.097 sec  -> 50000005000000
> : (bench (sum '+ bigly))    0.139 sec  -> 50000005000000
> : (bench (sumi bigly))      0.275 sec  -> 50000005000000
> : (bench (sumr bigly))      0.639 sec  -> 50000005000000
>
> : (setq bigly (need 10000000 1) D NIL) -> NIL
> : (bench (apply '+ bigly))  0.099 sec  -> 10000000
> : (bench (sum '+ bigly))    0.139 sec  -> 10000000
> : (bench (sumi bigly))      0.272 sec  -> 10000000
> : (bench (sumr bigly))      0.643 sec  -> 10000000
>
> : (bench (setq bigly (make (for X 10000000 (link (+ (- 10000000 X) 1)))))
> (length bigly))    0.437 sec -> 10000000
> : (bench (sumr bigly))      0.630 sec  -> 50000005000000
> : (bench (sumi bigly))      0.279 sec  -> 50000005000000
>
>
> Am 10.02.2017 15:28 schrieb "Mike Pechkin" <mike.pech...@gmail.com>:
>>>
>>>> hi,
>>>>
>>>> On Fri, Feb 10, 2017 at 3:07 PM, Christopher Howard <
>>>> christopher.how...@qlfiles.net> wrote:
>>>>
>>>> > Hi list. When I try to do
>>>> >
>>>> > (apply '+ (range 1 1000000)
>>>> >
>>>>
>>>>
>>>> ​List of ​millions of items is not a problem.
>>>> Problem how you use it.
>>>> (apply) is not for free, ​It *creates*​ a function call with a million
>>>> of
>>>> arguments.
>>>> Stack size make sense.
>>>>
>>>>
>>>> > I get segfault. I thought maybe this was some kind of internal
>>>> > limitation of the apply function, so I defined a foldl:
>>>> >
>>>> > (de foldl (Fn Acc Lst)
>>>> >     (if (== () Lst) Acc
>>>> >         (let Acc2 (Fn Acc (car Lst))
>>>> >              (foldl Fn Acc2 (cdr Lst)) ) ) )
>>>> >
>>>> > : (foldl '+ 0 (range 1 1000))
>>>> > (foldl '+ 0 (range 1 1000))
>>>> > -> 500500
>>>> > : (foldl '+ 0 (range 1 1000000))
>>>> > (foldl '+ 0 (range 1 1000000))
>>>> >
>>>> >
>>>> ​
>>>> Stack size makes sense too.
>>>> I like recursions this way:
>>>>
>>>> (de rec1 (F A L)
>>>>    (if L
>>>>       (rec1 F (inc 'A (++ L)) L)
>>>>       A ) )
>>>>
>>>> recursion with hidden accumulator from outer call and car-cdr:
>>>> (de rec2 (F L A)
>>>>    (default A 0)
>>>>    (if L
>>>>       (rec2 F (cdr L) (inc 'A (car L)))
>>>>       A ) )
>>>> The call will be:  (rec2 '+ (range 1 1000000)))
>>>>
>>>>
>>>> As recursion just loop you can implement it without big stack too:
>>>> (de sum1 (L)
>>>>    (let N 0
>>>>       (for I L
>>>>          (inc 'N I) ) ) )
>>>>
>>>> even without list creation:
>>>> (de sum2 (X)
>>>>    (let N 0
>>>>       (for I X
>>>>          (inc 'N I) ) ) )
>>>>
>>>>
>>>> And finally, that's why (sum) was implemented:
>>>> (sum prog (range 1 1000000)))
>>>>
>>>>
>>>> Bonus: for practice write recursion function to sum numbers without
>>>> (range)
>>>
>>>
>>
>

Reply via email to