Last active
July 28, 2020 19:00
-
-
Save wedesoft/7929014 to your computer and use it in GitHub Desktop.
Embed Racket interpreter
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
embed | |
base.c | |
.*.un~ | |
*.3m.c | |
*.o |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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