The initial iterative replacement solution I came up with (below) quickly runs out of resources as it has to build the entire list before starting to draw.

## Advertising

What error did you get? How much resources does picolisp use? Do you call ulimit before? I think you may have some fundamental problems with garabarage allocation. Please see if you understand that code. (de expensive-list-increaser (A N) (default N 1) (prinl "call: " N) (if A (cons (+ 1 (car A)) (expensive-list-increaser (copy (prinl (cdr A))) (inc N)))) (prinl "A of " N " is no no longer refernced after the function number " N " returns") @@) (de compreku (D) (expensive-list-increaser (range 1 D)) Picolisp can not garbage collect A of the first call until all other are finished since the first A could be needed inside first call at a later point. This is related to PicoLisp not having tail recursion. You also need to understand that 'mapcar and 'map returns a new list not the old one modified. This means you create a copy of the list with each mapcar the longest of which is only cleared after the first recursive call is finished. (de compiter (D) (for ( N . A) (range 1 D) (prinl "call: " N) (prinl (copy A)) (prinl "The copy of A is no longer accessible so it can be deallocated"))) # : (compreku 5) call: 1 2345 call: 2 345 call: 3 45 call: 4 5 call: 5 call: 6 A of 6 is no no longer refernced after the function number 6 returns A of 5 is no no longer refernced after the function number 5 returns A of 4 is no no longer refernced after the function number 4 returns A of 3 is no no longer refernced after the function number 3 returns A of 2 is no no longer refernced after the function number 2 returns Y A of 1 is no no longer refernced after the function number 1 returns #: (compiter 5) call: 1 1 The copy of A is no longer accessible so it can be deallocated call: 2 2 The copy of A is no longer accessible so it can be deallocated call: 3 3 The copy of A is no longer accessible so it can be deallocated call: 4 4 The copy of A is no longer accessible so it can be deallocated call: 5 5 The copy of A is no longer accessible so it can be deallocated 2017-03-03 12:47 GMT+01:00 Joh-Tob Schäg <johtob...@gmail.com>: > Is the garbage collection in picolisp immediate if the resource can be > released? > > No, picolisp uses a mark and sweep halt the world garage collector. During > sweep phase the complete allocated RAM is checked. If that would happen > after each release of a resource picolisp would be very slow. > Furthermore in Picolisp it is not possible to decide whether a resource > can be released or not with out doing mark and sweep. This is because of > cyclic list and the fact that you could always have a symbol pointing to > that cell. > > > > 2017-03-03 12:04 GMT+01:00 Lindsay John Lawrence < > lawrence.lindsayj...@gmail.com>: > >> >> Is the garbage collection in picolisp immediate if the resource can be >> released? >> >> The initial iterative replacement solution I came up with (below) quickly >> runs out of resources as it has to build the entire list before starting to >> draw. >> >> I haven't figured out how to do it yet, but I think, in this case, a >> 'recursive' solution that renders as points are created would use a lot >> less resources, assuming that processed replacement rules are garbage >> collected as the stack unwinds and elements are traversed over. >> >> It would be a nice accomplishment to be able to render the more complex >> fractal plants expressed here: https://en.wikipedia.org/wiki/L-system >> >> /Lindsay >> >> >> # https://en.wikipedia.org/wiki/Gosper_curve >> # Angle 60 degrees = PI/3 >> # Axiom A >> # Replacement Rules >> # A :--> A - B - - B + A + + A A + B - >> # B :--> + A - B B - - B - A + + A + B >> >> # C (initially = A) grows...very quickly. >> #: n=0 (length C) -> 15 >> #: n=1 (length (setq C (F C))) -> 113 >> #: n=2 -> 799, n=3 -> 5601, n=4 -> 39215, n=5 -> 274513, n=6 -> 1921599, >> n=7 . >> >> # For n=6... >> : (bench (nil (Draw-Gosper-Curve))) >> -> 1.370 sec >> >> Which works out to: >> >> XY Cnt: 823543 coordinates to plot >> Min-XY: -66,432.00 -42,345.11 >> Max-XY: 2,048.00 23,611.35" >> >> ...about 900K of serialized canvas instructions. >> >> >> Full-code at: https://github.com/thinknlive/picolisp-gosper >> >> (de Gosper-Curve (Length Angle N) >> (let >> (A (chop "A-B--B+A++AA+B-") >> B (chop "+A-BB--B-A++A+B") >> C A >> F '((L) (fish atom >> (mapcar '((X) >> (cond >> ((= X "A") A) >> ((= X "B") B) >> (T X))) L))) ) >> >> >> # Generate points >> (do N (setq C (F C))) >> >> # Plot points >> (map '((R) >> (case (car R) >> (("A" "B") (Plot-Line Length Angle)) >> ("+" (setq Angle (+ Angle PI/3))) >> ("-" (setq Angle (- Angle PI/3))) >> (T (msg (text "?Gosper-Curve: No-match: @1" @))) )) C ) >> >> ) ) >> >> >> >