Is this the only way to have a Scheme defined function passed on the fly to C? Short of using global variables as in here
https://mercure.iro.umontreal.ca/pipermail/gambit-list/2009-January/002939.h...
Well, the only solutions I find acceptable. There might be some (more or less portable) library to implement C closures that could be used (libffi?). You have to understand what the fundamental problem is. In C, functions pointers are implemented (usually) as the address of the code which implements the function. The C compiler generates a "call" instruction to that address. Scheme closures carry with them an environment... that is what makes them more useful than plain functions. So to convert a Scheme closure to a C function pointer, in general it is necessary to allocate a fresh code address that will correspond to the Scheme closure. The technique shown in the message linked above is based on the idea of allocating at compile time a pool of C functions, and then to assign them on demand to Scheme closures. It is 100% portable, but it places a static limit on the number of Scheme closures that can be converted (the code could be improved to un-assign the Scheme closure when it is no longer live using wills for example). The other solution, based on dynamic code generation, does not place a limit on the number of converted Scheme closures, but it is not portable (it is CPU and OS dependent). There is no portable solution I know of that solves both issues (portable here means it respects the C standard and only relies on the C standard).
Marc
I don't understand: in
(c-define (helper-func x) (int) int "helper_func" "" (*f* x))
(define gsl-func (c-lambda (int) int "gsl_func"))
and helper_func is called by the gsl_func routine, *f* can be any Scheme closure. Then why can't the C interface accept
(define gsl-func2 (c-lambda ( (function (int) int) int) int "gsl_func"))
and generate the correct helper-func with *f* replaced by whatever function is passed to gsl-func2?
I am sure this is a silly question so apologies in advance.
michele