From: "pluijzer ." <[email protected]>
Subject: [Chicken-users] Chicken C interface
Date: Wed, 5 Jun 2013 17:10:41 +0200

> Hello everybody,
> 
> I was planning to use Chicken Scheme in a fashion more similar to Guile and
> Lua. i.e. passing Scheme Data Objects from Chicken to C and back using the
> C interface.
> 
> I am a little confused though as how to have a C function return a Scheme
> List that is seen by the garbage collector.
> 
> For example, is the code below correct, will the list be seen by the
> garbage collector? And if not, is there correct way to do this.
> 
> #>
> C_word give_12()
> {
>   C_word *mem  = C_alloc(C_SIZEOF_LIST(2));
>   C_word  list = C_list(&mem, 2, C_fix(1), C_fix(2));
>   return list;
> }
> <#
> (print ((foreign-lambda scheme-object "give_12")))

As written in the other message: C_alloc is just a wrapper around alloca(3),
so returning from the function invalidates or overwrites the data. A later
(minor) garbage collection may actually recover the data, but it is not
certain that it happens. See 

  http://api.call-cc.org/doc/foreign/access/foreign-primitive

for a variant that allows stack-allocation.


cheers,
felix

_______________________________________________
Chicken-users mailing list
[email protected]
https://lists.nongnu.org/mailman/listinfo/chicken-users

Reply via email to