[CM] s7 C functions and environments
bil at ccrma.Stanford.EDU
bil at ccrma.Stanford.EDU
Sun Dec 29 17:05:08 PST 2024
I hope I understand your question!: the first example using "+" could
be:
static s7_pointer make_f(s7_scheme *sc, s7_pointer args)
{
s7_pointer x = s7_car(args);
char buf[256];
snprintf(buf, 256, "(let ((x %ld)) (lambda (y) (+ x y)))",
s7_integer(x));
return(s7_eval_c_string(sc, buf));
}
The same idea using a C function in place of "+":
static int64_t fadd(int64_t x, int64_t y) {return(x + y);}
static s7_pointer g_fadd(s7_scheme *sc, s7_pointer args)
{
return(s7_make_integer(sc,
fadd(s7_integer(s7_car(args)), s7_integer(s7_cadr(args)))));
}
static s7_pointer make_fadd(s7_scheme *sc, s7_pointer args)
{
s7_pointer x = s7_car(args);
char buf[256];
snprintf(buf, 256, "(let ((x %ld)) (lambda (y) (fadd x y)))",
s7_integer(x));
return(s7_eval_c_string(sc, buf));
}
s7_scheme *s7 = s7_init();
s7_define_function(s7, "make-f", make_f, 1, 0, false, NULL);
s7_define_function(s7, "make-fadd", make_fadd, 1, 0, false, NULL);
s7_define_function(s7, "fadd", g_fadd, 2, 0, false, NULL);
...
I haven't brought out to s7.h the lambda call above (as s7_lambda or
something), and need to think about whether there's currently a
reasonable
way to do it with the existing s7.h functions -- will mull it over.
More information about the Cmdist
mailing list