1 /* Copyright (C) 1998, 2000 Free Software Foundation, Inc.
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation; either version 2, or (at your option)
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with this software; see the file COPYING. If not, write to
15 * the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
16 * Boston, MA 02111-1307 USA
18 * As a special exception, the Free Software Foundation gives permission
19 * for additional uses of the text contained in its release of GUILE.
21 * The exception is that, if you link the GUILE library with other files
22 * to produce an executable, this does not by itself cause the
23 * resulting executable to be covered by the GNU General Public License.
24 * Your use of that executable is in no way restricted on account of
25 * linking the GUILE library code into it.
27 * This exception does not however invalidate any other reasons why
28 * the executable file might be covered by the GNU General Public License.
30 * This exception applies only to the code released by the
31 * Free Software Foundation under the name GUILE. If you copy
32 * code from other Free Software Foundation releases into a copy of
33 * GUILE, as the General Public License permits, the exception does
34 * not apply to the code that you add in this way. To avoid misleading
35 * anyone as to the status of such modified files, you must delete
36 * this exception notice from them.
38 * If you write modifications of your own for GUILE, it is your choice
39 * whether to permit this exception to apply to your modifications.
40 * If you do not wish that, delete this exception notice. */
42 /* Software engineering face-lift by Greg J. Badros, 11-Dec-1999,
43 gjb@cs.washington.edu, http://www.cs.washington.edu/homes/gjb */
47 #include "libguile/_scm.h"
49 #include "libguile/eval.h"
50 #include "libguile/smob.h"
51 #include "libguile/procprop.h"
52 #include "libguile/vectors.h"
53 #include "libguile/hashtab.h"
54 #include "libguile/struct.h"
55 #include "libguile/variable.h"
56 #include "libguile/fluids.h"
58 #include "libguile/modules.h"
60 SCM scm_module_system_booted_p
= 0;
64 static SCM the_root_module
;
65 static SCM root_module_lookup_closure
;
68 scm_the_root_module ()
70 return SCM_CDR (the_root_module
);
73 static SCM the_module
;
78 return scm_fluid_ref (SCM_CDR (the_module
));
81 static SCM set_current_module
;
83 /* This is the module selected during loading of code. Currently,
84 * this is the same as (interaction-environment), but need not be in
89 scm_set_current_module (SCM module
)
91 SCM old
= scm_current_module ();
92 scm_apply (SCM_CDR (set_current_module
), SCM_LIST1 (module
), SCM_EOL
);
96 SCM_DEFINE (scm_interaction_environment
, "interaction-environment", 0, 0, 0,
98 "Return a specifier for the environment that contains\n"
99 "implementation--defined bindings, typically a superset of those\n"
100 "listed in the report. The intent is that this procedure will\n"
101 "return the environment in which the implementation would\n"
102 "evaluate expressions dynamically typed by the user.")
103 #define FUNC_NAME s_scm_interaction_environment
105 return scm_current_module ();
109 SCM_SYMBOL (scm_sym_app
, "app");
110 SCM_SYMBOL (scm_sym_modules
, "modules");
111 static SCM module_prefix
;
114 scm_module_full_name (SCM name
)
116 if (SCM_EQ_P (SCM_CAR (name
), scm_sym_app
))
119 return scm_append (SCM_LIST2 (module_prefix
, name
));
122 static SCM make_modules_in
;
123 static SCM beautify_user_module_x
;
126 scm_make_module (SCM name
)
128 return scm_apply (SCM_CDR (make_modules_in
),
129 SCM_LIST2 (scm_the_root_module (),
130 scm_module_full_name (name
)),
135 scm_ensure_user_module (SCM module
)
137 scm_apply (SCM_CDR (beautify_user_module_x
), SCM_LIST1 (module
), SCM_EOL
);
138 return SCM_UNSPECIFIED
;
142 scm_module_lookup_closure (SCM module
)
144 return SCM_MODULE_EVAL_CLOSURE (module
);
148 scm_current_module_lookup_closure ()
150 if (scm_module_system_booted_p
)
151 return scm_module_lookup_closure (scm_current_module ());
156 static SCM resolve_module
;
159 scm_resolve_module (SCM name
)
161 return scm_apply (SCM_CDR (resolve_module
), SCM_LIST1 (name
), SCM_EOL
);
164 static SCM try_module_autoload
;
167 scm_load_scheme_module (SCM name
)
169 return scm_apply (SCM_CDR (try_module_autoload
), SCM_LIST1 (name
), SCM_EOL
);
175 scm_top_level_env (SCM thunk
)
180 return scm_cons (thunk
, SCM_EOL
);
184 scm_env_top_level (SCM env
)
186 while (SCM_NIMP (env
))
188 if (!SCM_CONSP (SCM_CAR (env
))
189 && SCM_NFALSEP (scm_procedure_p (SCM_CAR (env
))))
190 return SCM_CAR (env
);
197 SCM_SYMBOL (scm_sym_system_module
, "system-module");
200 scm_system_module_env_p (SCM env
)
202 SCM proc
= scm_env_top_level (env
);
203 if (SCM_FALSEP (proc
))
204 proc
= root_module_lookup_closure
;
205 return ((SCM_NFALSEP (scm_procedure_property (proc
,
206 scm_sym_system_module
)))
212 * C level implementation of the standard eval closure
214 * This increases loading speed substantially.
215 * The code will be replaced by the low-level environments in next release.
218 static SCM module_make_local_var_x
;
221 module_variable (SCM module
, SCM sym
)
223 /* 1. Check module obarray */
224 SCM b
= scm_hashq_ref (SCM_MODULE_OBARRAY (module
), sym
, SCM_UNDEFINED
);
225 if (SCM_VARIABLEP (b
))
228 SCM binder
= SCM_MODULE_BINDER (module
);
229 if (SCM_NFALSEP (binder
))
230 /* 2. Custom binder */
232 b
= scm_apply (binder
,
233 SCM_LIST3 (module
, sym
, SCM_BOOL_F
),
240 /* 3. Search the use list */
241 SCM uses
= SCM_MODULE_USES (module
);
242 while (SCM_CONSP (uses
))
244 b
= module_variable (SCM_CAR (uses
), sym
);
247 uses
= SCM_CDR (uses
);
253 scm_bits_t scm_tc16_eval_closure
;
255 /* NOTE: This function may be called by a smob application
256 or from another C function directly. */
258 scm_eval_closure_lookup (SCM eclo
, SCM sym
, SCM definep
)
260 SCM module
= SCM_PACK (SCM_SMOB_DATA (eclo
));
261 if (SCM_NFALSEP (definep
))
262 return scm_apply (SCM_CDR (module_make_local_var_x
),
263 SCM_LIST2 (module
, sym
),
266 return module_variable (module
, sym
);
269 SCM_DEFINE (scm_standard_eval_closure
, "standard-eval-closure", 1, 0, 0,
271 "Return an eval closure for the module @var{module}.")
272 #define FUNC_NAME s_scm_standard_eval_closure
274 SCM_RETURN_NEWSMOB (scm_tc16_eval_closure
, SCM_UNPACK (module
));
281 #ifndef SCM_MAGIC_SNARFER
282 #include "libguile/modules.x"
284 module_make_local_var_x
= scm_sysintern ("module-make-local-var!",
286 scm_tc16_eval_closure
= scm_make_smob_type ("eval-closure", 0);
287 scm_set_smob_mark (scm_tc16_eval_closure
, scm_markcdr
);
288 scm_set_smob_apply (scm_tc16_eval_closure
, scm_eval_closure_lookup
, 2, 0, 0);
292 scm_post_boot_init_modules ()
294 scm_module_tag
= (SCM_CELL_WORD_1 (SCM_CDR (scm_intern0 ("module-type")))
295 + scm_tc3_cons_gloc
);
296 the_root_module
= scm_intern0 ("the-root-module");
297 the_module
= scm_intern0 ("the-module");
298 set_current_module
= scm_intern0 ("set-current-module");
299 module_prefix
= scm_permanent_object (SCM_LIST2 (scm_sym_app
,
301 make_modules_in
= scm_intern0 ("make-modules-in");
302 beautify_user_module_x
= scm_intern0 ("beautify-user-module!");
303 root_module_lookup_closure
= scm_permanent_object
304 (scm_module_lookup_closure (SCM_CDR (the_root_module
)));
305 resolve_module
= scm_intern0 ("resolve-module");
306 try_module_autoload
= scm_intern0 ("try-module-autoload");
307 scm_module_system_booted_p
= 1;