Re: External allocations using miniPicoLisp

2023-12-03 Thread Alexander Burger
Hi Kashyap,

> I think "finally" will do what I need :)

Yes, good idea!

☺/ A!ex

-- 
UNSUBSCRIBE: mailto:picolisp@software-lab.de?subject=Unsubscribe


Re: External allocations using miniPicoLisp

2023-12-03 Thread C K Kashyap
Thanks Alex,

The penny just dropped for me as I was writing this mail - yup, I remember
now :)
I think "finally" will do what I need :)

Regards,
Kashyap


On Sat, Dec 2, 2023 at 11:35 PM Alexander Burger 
wrote:

> Hi Kashyap,
>
> > Is there a reference implementation of external allocation using
> > miniPicoLisp?
> >
> > Here's what I'd like to do - Create a new function called "alloc" that
> > allocates some memory.
> >
> > (let A (alloc 100)
> >   (poke A 0 10)) # poke simply writes a byte(10) at offset 0
>
> I do not know if anybody has done this in miniPicoLisp, but the official
> PicoLisp has functions 'buf' and 'byte' which behave that way:
>
>(buf A 100  # Allocate on the stack
>   (byte A 10)
>   (byte (+ A 7) 11)
>   ... )
>
> 'buf' allocates memory on the runtime stack, and cleans it up when done.
>
>
> You can also explicitly allocate system memory to get the same effect, but
> this
> has more overhead:
>
>(let A (%@ "malloc" 'P 100)  # Allocate memory
>   (byte A 10)
>   ...
>   (%@ "free" NIL A) )  # Clean up
>
>
> > The part I want to ensure is that the memory that's allocated by alloc
> gets
> > collected by the GC.
>
> This does not make sense. The garbage collector traverses the 'heap'
> structures,
> managing used and unused cells (as discussed in our last mail). Memory
> allocated
> by 'buf' or malloc() does not contain cells reachable from Lisp data
> structures,
> and is therfore not known by the garbage collector. And as it is not part
> of the
> linked list of 'heap's, it will not be free'd.
>
> ☺/ A!ex
>
> --
> UNSUBSCRIBE: mailto:picolisp@software-lab.de?subject=Unsubscribe
>


Re: External allocations using miniPicoLisp

2023-12-02 Thread Alexander Burger
Hi Kashyap,

> Is there a reference implementation of external allocation using
> miniPicoLisp?
> 
> Here's what I'd like to do - Create a new function called "alloc" that
> allocates some memory.
> 
> (let A (alloc 100)
>   (poke A 0 10)) # poke simply writes a byte(10) at offset 0

I do not know if anybody has done this in miniPicoLisp, but the official
PicoLisp has functions 'buf' and 'byte' which behave that way:

   (buf A 100  # Allocate on the stack
  (byte A 10)
  (byte (+ A 7) 11)
  ... )

'buf' allocates memory on the runtime stack, and cleans it up when done.


You can also explicitly allocate system memory to get the same effect, but this
has more overhead:

   (let A (%@ "malloc" 'P 100)  # Allocate memory
  (byte A 10)
  ...
  (%@ "free" NIL A) )  # Clean up


> The part I want to ensure is that the memory that's allocated by alloc gets
> collected by the GC.

This does not make sense. The garbage collector traverses the 'heap' structures,
managing used and unused cells (as discussed in our last mail). Memory allocated
by 'buf' or malloc() does not contain cells reachable from Lisp data structures,
and is therfore not known by the garbage collector. And as it is not part of the
linked list of 'heap's, it will not be free'd.

☺/ A!ex

-- 
UNSUBSCRIBE: mailto:picolisp@software-lab.de?subject=Unsubscribe