Is the garbage collection in picolisp immediate if the resource can be
released?

## Advertising

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