Skip to content

Instantly share code, notes, and snippets.

@wedesoft
Last active July 28, 2020 19:00
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save wedesoft/7929014 to your computer and use it in GitHub Desktop.
Save wedesoft/7929014 to your computer and use it in GitHub Desktop.
Embed Racket interpreter
embed
base.c
.*.un~
*.3m.c
*.o
#include <racket/scheme.h>
#include "base.c"
// Racket: http://docs.racket-lang.org/inside/overview.html#%28part._embedding%29
// Guile: http://www.ibm.com/developerworks/library/l-guile/
static int run(Scheme_Env *e, int argc, char *argv[])
{
Scheme_Object *curout;
int i;
mz_jmp_buf * volatile save, fresh;
/* Declare embedded modules in "base.c": */
declare_modules(e);
scheme_namespace_require(scheme_intern_symbol("racket/base"));
curout = scheme_get_param(scheme_current_config(),
MZCONFIG_OUTPUT_PORT);
for (i = 1; i < argc; i++) {
save = scheme_current_thread->error_buf;
scheme_current_thread->error_buf = &fresh;
if (scheme_setjmp(scheme_error_buf)) {
scheme_current_thread->error_buf = save;
return -1; /* There was an error */
} else {
Scheme_Object *v, *a[2];
v = scheme_eval_string(argv[i], e);
scheme_display(v, curout);
scheme_display(scheme_make_char('\n'), curout);
/* read-eval-print loop, uses initial Scheme_Env: */
a[0] = scheme_intern_symbol("racket/base");
a[1] = scheme_intern_symbol("read-eval-print-loop");
scheme_apply(scheme_dynamic_require(2, a), 0, NULL);
scheme_current_thread->error_buf = save;
}
}
return 0;
}
int main(int argc, char *argv[])
{
return scheme_main_setup(1, run, argc, argv);
}
all: embed
embed: embed_3m.o
$(CC) -o $@ $< -lracket3m -ldl -lm
embed.3m.c: embed.c base.c
base.c:
raco ctool --c-mods base.c ++lib racket/base
%.3m.c: %.c
raco ctool --xform $<
%_3m.o: %.3m.c
raco ctool --3m --cc $<
clean:
rm -f embed base.c *.o *.3m.c
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment