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

Reply via email to