michele.zaffalon at gmail.com
Sat Oct 10 12:57:29 EDT 2009
> I'm not sure this will help but, here goes...
> The representation of a "function" is different for Gambit an C. In C, a
> function "value" is normally represented as the address of the machine code
> that implements this function. The C compiler generates the "call" machine
> instruction to call functions represented this way. On the Gambit side, a
> function value is represented as the address of the "closure object" which
> contains the environment of the closure and the code pointer. You can't use
> the "call" machine instruction to call such functions. Even in a Scheme
> system where closures are represented as a piece of code (this is possible,
> in fact the first versions of Gambit used this representation) you also have
> the problem that the parameter passing protocol may be different in C and
> Scheme, and it probably has to be to support "rest parameters".
> So... when a Scheme function is passed to the C world, as a C function,
> there is a real conversion that must occur because the underlying
> representations and parameter passing protocol are different in the two
> Does that clarify things?
It was already clear enough in your previous reply, thanks for the patience.
So the bottom line is that
(c-define (callback-wrapper x)
won't work with
(letrec ((f (lambda (x) (* 4 x)))) (callback-wrapper 4))
but it will in the top level only with
> (define (f p) (* 3 p))
> (callback-wrapper 4) ; -> 12
More information about the Gambit-list