diff --git a/eval.c b/eval.c index 3ad188de..b55a503b 100644 --- a/eval.c +++ b/eval.c @@ -427,6 +427,7 @@ static void sexp_add_path (sexp ctx, const char *str) { sexp_push(ctx, sexp_global(ctx, SEXP_G_MODULE_PATH), SEXP_VOID); sexp_car(sexp_global(ctx, SEXP_G_MODULE_PATH)) = sexp_c_string(ctx, str, colon-str); + sexp_immutablep(sexp_global(ctx, SEXP_G_MODULE_PATH)) = 1; } } @@ -460,8 +461,10 @@ void sexp_init_eval_context_globals (sexp ctx) { sexp_add_path(ctx, getenv(SEXP_MODULE_PATH_VAR)); tmp = sexp_c_string(ctx, "./lib", 5); sexp_push(ctx, sexp_global(ctx, SEXP_G_MODULE_PATH), tmp); + sexp_immutablep(sexp_global(ctx, SEXP_G_MODULE_PATH)) = 1; tmp = sexp_c_string(ctx, ".", 1); sexp_push(ctx, sexp_global(ctx, SEXP_G_MODULE_PATH), tmp); + sexp_immutablep(sexp_global(ctx, SEXP_G_MODULE_PATH)) = 1; #if SEXP_USE_GREEN_THREADS sexp_global(ctx, SEXP_G_IO_BLOCK_ERROR) = sexp_user_exception(ctx, SEXP_FALSE, "I/O would block", SEXP_NULL); @@ -1951,6 +1954,9 @@ sexp sexp_load_module_file (sexp ctx, const char *file, sexp env) { } #if SEXP_USE_MODULES +sexp sexp_current_module_path_op (sexp ctx, sexp self, sexp_sint_t n) { + return sexp_global(ctx, SEXP_G_MODULE_PATH); +} sexp sexp_find_module_file_op (sexp ctx, sexp self, sexp_sint_t n, sexp file) { sexp_assert_type(ctx, sexp_stringp, SEXP_STRING, file); return sexp_find_module_file(ctx, sexp_string_data(file)); diff --git a/include/chibi/eval.h b/include/chibi/eval.h index 3364d5c4..063db6db 100644 --- a/include/chibi/eval.h +++ b/include/chibi/eval.h @@ -96,6 +96,7 @@ SEXP_API sexp sexp_load_standard_ports (sexp context, sexp env, FILE* in, FILE* SEXP_API sexp sexp_load_standard_env (sexp context, sexp env, sexp version); SEXP_API sexp sexp_find_module_file (sexp ctx, const char *file); SEXP_API sexp sexp_load_module_file (sexp ctx, const char *file, sexp env); +SEXP_API sexp sexp_current_module_path_op (sexp ctx, sexp self, sexp_sint_t n); SEXP_API sexp sexp_find_module_file_op (sexp ctx, sexp self, sexp_sint_t n, sexp file); SEXP_API sexp sexp_load_module_file_op (sexp ctx, sexp self, sexp_sint_t n, sexp file, sexp env); SEXP_API sexp sexp_add_module_directory_op (sexp ctx, sexp self, sexp_sint_t n, sexp dir, sexp appendp); diff --git a/opcodes.c b/opcodes.c index 371c84f2..7af86d4c 100644 --- a/opcodes.c +++ b/opcodes.c @@ -243,6 +243,7 @@ _OP(SEXP_OPC_SETTER, SEXP_OP_SLOTN_SET, 4, 0, SEXP_VOID, _I(SEXP_OBJECT), _I(SEX _FN0(_I(SEXP_ENV), "current-environment", 0, sexp_current_environment), _FN0(_I(SEXP_ENV), "%meta-env", 0, sexp_meta_environment), _FN1(SEXP_NULL, _I(SEXP_ENV), "env-exports", 0, sexp_env_exports_op), +_FN0(_I(SEXP_PAIR), "current-module-path", 0, sexp_current_module_path_op), _FN1(_I(SEXP_STRING), _I(SEXP_STRING), "find-module-file", 0, sexp_find_module_file_op), _FN2(SEXP_VOID, _I(SEXP_STRING), _I(SEXP_ENV), "load-module-file", 0, sexp_load_module_file_op), _FN2(SEXP_VOID, _I(SEXP_STRING), _I(SEXP_BOOLEAN), "add-module-directory", 0, sexp_add_module_directory_op),