Re: Recursion in foreign-safe-lambda
Massimo Nocentini via Chicken-users <[email protected]>
| Newsgroups | gmane.lisp.scheme.chicken |
|---|---|
| Message-ID | <[email protected]> |
Thank you Thomas,
I have a progress using foreign-primitive for allocating objects.
On the contrary, given the following definitions:
(defineparse(foreign-primitivescheme-object(((constc-string) filename)
(scheme-objectl))
"P(C_k, filename, l);"))
where function P is defined in a companion cpp file and reads as follows:
C_wordc(C_wordC_k, C_wordl)
{
if(l==C_SCHEME_END_OF_LIST)
{
C_return(C_SCHEME_END_OF_LIST);
}
C_wordcdr=c(C_k, C_i_cdr(l));
C_word*ptr=C_alloc(C_SIZEOF_PAIR);
C_wordres=C_a_pair(&ptr, C_i_car(l), cdr);
C_return(res);
}
externvoidP(C_wordC_k, constchar*filename, C_wordl)
{
C_kontinue(C_k, c(C_k, l));
}
My goal here is to just walk through the given list l and allocate fresh
pairs for it. When I try:
(parse "something.json" '(1 2 3))
I still get:
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure> #(#<proc...
[panic] Detected corrupted data in stack - execution terminated <stdin>: <--
What I'm doing wrong?
Thanks again,
M
On 9/20/25 7:40 PM, Thomas Chust wrote:
> Hello Massimo,
>
> I believe you can only allocate Scheme data from a foreign-primitive,
> not from a foreign[-safe]-lambda: The memory reserved by C_alloc lives
> /on the C stack/, so a C function that uses this primitive must never
> return. It can invoke a continuation to communicate a return value,
> but it must not unwind the C stack below the point of allocation.
>
> There is nothing preventing such a function from invoking itself,
> though. As long as the recursive call is either optimized away as a
> simple jump or never returns, the allocation should still work!
>
> Ciao,
> Thomas C.
>
>
> Am Sa., 20. Sept. 2025 um 18:27 Uhr schrieb Massimo Nocentini via
> Chicken-users <[email protected]>:
>
> Dear list,
>
> I have a question about the foreign module. Given the following
> definition:
>
> (defineparse(foreign-safe-lambda*scheme-object(((constc-string)
> filename))
> "C_word out = P(filename); C_return(out);"
> ))
>
> and
>
> externC_wordP(constchar*filename)
> {
> char*str="hello world";
> intlength=strlen(str);
> C_word*ptr=C_alloc(C_SIZEOF_STRING(length));
> C_wordres=C_string(&ptr, length, str);
> returnres;
> }
>
> When I use the parse function on a string, I get the following output:
> #(#<procedure> #<procedure C_values> (#(#<procedure> #...
> How can I allocate Scheme object from a C function (possibly
> recursive)?
> Thank you all in advance,
> Massimo
>