guile-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Best way to call a user defined hook (written in guile) from C when


From: Neil Jerram
Subject: Re: Best way to call a user defined hook (written in guile) from C when the hook need plenty parameters
Date: Mon, 05 Jul 2010 21:18:30 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/23.1 (gnu/linux)

address@hidden writes:

> (define (hook-helper %s) (lambda () #\t))
>
> where %s is the long list of parameters (foo bar baz...) that's inserted by 
> the C program.
> And :
>
> (define (hook . args) (local-eval (cons print-user-fields user-fields) 
> (procedure-environment (apply hook-helper args))))

Using local-eval and procedure-environment like this won't work in Guile
1.9/2.0, I believe.

But you could get a similar effect - which I think will still work in
1.9/2.0 - by creating a module, defining values in it, and then
evaluating in that module.  (In Guile, module == top level environment.)

(Note that the bindings in a module are conceptually similar to an alist,
so this is actually not so different from what Thien-Thi suggested.)

To create a module, in Scheme:

(define-module (xxx))

Then your C code would access that using

SCM module = scm_c_resolve_module ("xxx");

and define each value in it using

scm_c_module_define (module, name, value);

and finally evaluate in that module using

scm_c_eval_string_in_module (expression, module);

It would also seem (at least to me) a bit less magical to define the
user-fields as a procedure, e.g.:

(define (calc-user-fields)
  (list foo
        bar
        (+ baz foo)
        (if (> foo bar) 1 2)))

and then the "expression" above would be "(calc-user-fields)".

All completely untested, of course! :-)

Regards,
     Neil



reply via email to

[Prev in Thread] Current Thread [Next in Thread]