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
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.