This is the mail archive of the guile@cygnus.com mailing list for the guile project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Vadim Zaliva <lord@crocodile.org> writes: > That is the best way to take pointer of some scheme function and call it > from "C"? For example, I have following scheme definition: > > (define (func str) > ) > > How can I call it from C? The one way I've found is use gh_eval_str(), but > I have to prepare external representation of parameters. > > I suspect there is way to take pointer to this function from C and simply > call it. I look up the the Scheme procedure by name each time I want to call it, using 'scm_intern0' if the procedure is in the-root-module, or something like this if it's in some other module (in this case 'guile-user'): static SCM make_callout(char *callout, SCM ls) { SCM proc; char buf[512]; sprintf(buf, "(module-ref (resolve-module '(guile-user)) '%s)", callout); proc = gh_eval_str(buf); if (proc == SCM_UNDEFINED) { printf("callout error: lookup failed for '%s'\n", callout); return SCM_UNDEFINED; } else { return scm_apply(proc, ls, SCM_EOL); } } To format arguments, I often use the convenience function 'scm_listify'. Here is an example usage (note the SCM_UNDEFINED at the end of the list): int ui_modify_verify_callout(UIRec *ui, const char *widget_name, const char *str, int len, char **ret_str) { SCM obj; *ret_str = NULL; obj = make_callout("fte:modify-verify", scm_listify(ui_box(ui), scm_makfrom0str(widget_name), scm_makfromstr(str, len, 0), SCM_UNDEFINED)); if (SCM_NIMP(obj) && SCM_ROSTRINGP(obj)) { *ret_str = XtNewString(SCM_CHARS(obj)); } return (obj == SCM_BOOL_F ? 0 : 1); } I understand that the CVS snapshots contain a C level interface to the module system, so the jiggery-pokery above with gh_eval_str() should be obsolete in the next release of guile. I hope this helps, -russ -- WAR IS PEACE FREEDOM IS SLAVERY BACKSPACE IS DELETE