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) >>> >>> >> >