On 7/10/07, Kevin Cozens <[EMAIL PROTECTED]> wrote:

> Have you also looked at init_procedures() and marshall_proc_db_call() in the
> scheme_wrapper.c file? You will find other examples of defining Scheme
> routines that will call C when invoked and which require parameters.

Our current setup uses init_procedures to load our functions, and is
based on what we found there.  Many of the functions listed there do
an excellent job of parsing arguments passed from Scheme, but the only
Script-Fu/Tiny-Fu way we've been able to find to make calls back to
the Scheme interpreter is using the ts_interpret_string function,
which calls tinyscheme's scheme_load_string and requires that you know
the string name of the procedure you're trying to call.

> That is about all I can suggest for the moment without knowing the specifics
> of the situtation where you feel you have to use scheme_call.

We're currently working on a function called from the
Script-Fu/Tiny-Fu console like
(pixel-map drawable function)
that maps said function (which takes an argument for each channel in
the drawable and returns a list of new values for each channel) to
every pixel in a drawable.

When writing a foreign function that parses a Scheme argument list, we
haven't found a way to get back a string procedure name from an
argument of type T_CLOSURE, which is a problem since all user-defined
Scheme procedures have this type, so we can't use scheme_load_string.
Also, tinyscheme already has scheme_call, a function that works well
enough to return values we can parse and takes arguments in the same
format Scheme passes them to foreign functions (i.e. "pointer"s to
Scheme functions of type T_CLOSURE and "pointer"s to argument lists).
Even if we were to find a way to get a string name for a procedure and
build string calls like "(function r g b)" to pass to
scheme_load_string, it seems like a step backward to do so having
received the parameters in the first place in a format closer to
tinyscheme's evaluation cycle.

The problem with scheme_call is that it doesn't play well inside
foreign functions. Any foreign function, as far as we can tell, that
calls scheme_call will proceed normally and return.  However, the
function's return value isn't picked up by tinyscheme, so something
like (+ 1 (foreign-func-with-scheme_call 2)) won't return anything.
This behavior is specific to foreign functiosn that call scheme_call,
so something like (+ 1 (foreign-func-without-scheme_call 2)) will
generally work.

We'll try to contact the tinyscheme people about this.

Ted and Emily
Gimp-developer mailing list

Reply via email to