mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-20 02:30:23 +02:00
* modules.c (scm_module_tag, scm_module_system_booted_p): New
globals. (scm_post_boot_init_modules): Initialize scm_module_tag. (scm_interaction_environment): New primitive.
This commit is contained in:
parent
f33b174d0e
commit
e3365c07da
1 changed files with 30 additions and 15 deletions
|
@ -56,6 +56,10 @@
|
||||||
|
|
||||||
#include "libguile/modules.h"
|
#include "libguile/modules.h"
|
||||||
|
|
||||||
|
SCM scm_module_system_booted_p = 0;
|
||||||
|
|
||||||
|
SCM scm_module_tag;
|
||||||
|
|
||||||
static SCM the_root_module;
|
static SCM the_root_module;
|
||||||
static SCM root_module_lookup_closure;
|
static SCM root_module_lookup_closure;
|
||||||
|
|
||||||
|
@ -75,6 +79,11 @@ scm_selected_module ()
|
||||||
|
|
||||||
static SCM set_current_module;
|
static SCM set_current_module;
|
||||||
|
|
||||||
|
/* This is the module selected during loading of code. Currently,
|
||||||
|
* this is the same as (interaction-environment), but need not be in
|
||||||
|
* the future.
|
||||||
|
*/
|
||||||
|
|
||||||
SCM
|
SCM
|
||||||
scm_select_module (SCM module)
|
scm_select_module (SCM module)
|
||||||
{
|
{
|
||||||
|
@ -83,6 +92,19 @@ scm_select_module (SCM module)
|
||||||
return old;
|
return old;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SCM_DEFINE (scm_interaction_environment, "interaction-environment", 0, 0, 0,
|
||||||
|
(),
|
||||||
|
"This procedure returns a specifier for the environment that"
|
||||||
|
"contains implementation-defined bindings, typically a superset of"
|
||||||
|
"those listed in the report. The intent is that this procedure"
|
||||||
|
"will return the environment in which the implementation would"
|
||||||
|
"evaluate expressions dynamically typed by the user.")
|
||||||
|
#define FUNC_NAME s_scm_interaction_environment
|
||||||
|
{
|
||||||
|
return scm_selected_module ();
|
||||||
|
}
|
||||||
|
#undef FUNC_NAME
|
||||||
|
|
||||||
SCM_SYMBOL (scm_sym_app, "app");
|
SCM_SYMBOL (scm_sym_app, "app");
|
||||||
SCM_SYMBOL (scm_sym_modules, "modules");
|
SCM_SYMBOL (scm_sym_modules, "modules");
|
||||||
static SCM module_prefix;
|
static SCM module_prefix;
|
||||||
|
@ -115,14 +137,10 @@ scm_ensure_user_module (SCM module)
|
||||||
return SCM_UNSPECIFIED;
|
return SCM_UNSPECIFIED;
|
||||||
}
|
}
|
||||||
|
|
||||||
static SCM module_eval_closure;
|
|
||||||
|
|
||||||
SCM
|
SCM
|
||||||
scm_module_lookup_closure (SCM module)
|
scm_module_lookup_closure (SCM module)
|
||||||
{
|
{
|
||||||
return scm_apply (SCM_CDR (module_eval_closure),
|
return SCM_MODULE_EVAL_CLOSURE (module);
|
||||||
SCM_LIST1 (module),
|
|
||||||
SCM_EOL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static SCM resolve_module;
|
static SCM resolve_module;
|
||||||
|
@ -141,8 +159,7 @@ scm_load_scheme_module (SCM name)
|
||||||
return scm_apply (SCM_CDR (try_module_autoload), SCM_LIST1 (name), SCM_EOL);
|
return scm_apply (SCM_CDR (try_module_autoload), SCM_LIST1 (name), SCM_EOL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Environments
|
/* Environments */
|
||||||
*/
|
|
||||||
|
|
||||||
SCM
|
SCM
|
||||||
scm_top_level_env (SCM thunk)
|
scm_top_level_env (SCM thunk)
|
||||||
|
@ -188,21 +205,17 @@ scm_system_module_env_p (SCM env)
|
||||||
* The code will be replaced by the low-level environments in next release.
|
* The code will be replaced by the low-level environments in next release.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define OBARRAY(module) (SCM_PACK (SCM_STRUCT_DATA (module) [0]))
|
|
||||||
#define USES(module) (SCM_PACK (SCM_STRUCT_DATA (module) [1]))
|
|
||||||
#define BINDER(module) (SCM_PACK (SCM_STRUCT_DATA (module) [2]))
|
|
||||||
|
|
||||||
static SCM module_make_local_var_x;
|
static SCM module_make_local_var_x;
|
||||||
|
|
||||||
static SCM
|
static SCM
|
||||||
module_variable (SCM module, SCM sym)
|
module_variable (SCM module, SCM sym)
|
||||||
{
|
{
|
||||||
/* 1. Check module obarray */
|
/* 1. Check module obarray */
|
||||||
SCM b = scm_hashq_ref (OBARRAY (module), sym, SCM_UNDEFINED);
|
SCM b = scm_hashq_ref (SCM_MODULE_OBARRAY (module), sym, SCM_UNDEFINED);
|
||||||
if (SCM_VARIABLEP (b))
|
if (SCM_VARIABLEP (b))
|
||||||
return b;
|
return b;
|
||||||
{
|
{
|
||||||
SCM binder = BINDER (module);
|
SCM binder = SCM_MODULE_BINDER (module);
|
||||||
if (SCM_NFALSEP (binder))
|
if (SCM_NFALSEP (binder))
|
||||||
/* 2. Custom binder */
|
/* 2. Custom binder */
|
||||||
{
|
{
|
||||||
|
@ -215,7 +228,7 @@ module_variable (SCM module, SCM sym)
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
/* 3. Search the use list */
|
/* 3. Search the use list */
|
||||||
SCM uses = USES (module);
|
SCM uses = SCM_MODULE_USES (module);
|
||||||
while (SCM_CONSP (uses))
|
while (SCM_CONSP (uses))
|
||||||
{
|
{
|
||||||
b = module_variable (SCM_CAR (uses), sym);
|
b = module_variable (SCM_CAR (uses), sym);
|
||||||
|
@ -267,6 +280,8 @@ scm_init_modules ()
|
||||||
void
|
void
|
||||||
scm_post_boot_init_modules ()
|
scm_post_boot_init_modules ()
|
||||||
{
|
{
|
||||||
|
scm_module_tag = (SCM_CELL_WORD_1 (SCM_CDR (scm_intern0 ("module-type")))
|
||||||
|
+ scm_tc3_cons_gloc);
|
||||||
the_root_module = scm_intern0 ("the-root-module");
|
the_root_module = scm_intern0 ("the-root-module");
|
||||||
the_module = scm_intern0 ("the-module");
|
the_module = scm_intern0 ("the-module");
|
||||||
set_current_module = scm_intern0 ("set-current-module");
|
set_current_module = scm_intern0 ("set-current-module");
|
||||||
|
@ -274,11 +289,11 @@ scm_post_boot_init_modules ()
|
||||||
scm_sym_modules));
|
scm_sym_modules));
|
||||||
make_modules_in = scm_intern0 ("make-modules-in");
|
make_modules_in = scm_intern0 ("make-modules-in");
|
||||||
beautify_user_module_x = scm_intern0 ("beautify-user-module!");
|
beautify_user_module_x = scm_intern0 ("beautify-user-module!");
|
||||||
module_eval_closure = scm_intern0 ("module-eval-closure");
|
|
||||||
root_module_lookup_closure = scm_permanent_object
|
root_module_lookup_closure = scm_permanent_object
|
||||||
(scm_module_lookup_closure (SCM_CDR (the_root_module)));
|
(scm_module_lookup_closure (SCM_CDR (the_root_module)));
|
||||||
resolve_module = scm_intern0 ("resolve-module");
|
resolve_module = scm_intern0 ("resolve-module");
|
||||||
try_module_autoload = scm_intern0 ("try-module-autoload");
|
try_module_autoload = scm_intern0 ("try-module-autoload");
|
||||||
|
scm_module_system_booted_p = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue