2 ly-module.cc -- implement guile module stuff.
4 source file of the GNU LilyPond music typesetter
6 (c) 2002--2004 Han-Wen Nienhuys <hanwen@cs.uu.nl>
11 #include "lily-guile.hh"
12 #include "ly-module.hh"
13 #include "protected-scm.hh"
15 #define FUNC_NAME __FUNCTION__
17 static int module_count;
20 ly_init_anonymous_module (void * data)
23 scm_c_use_module ("lily");
27 ly_make_anonymous_module ()
29 String s = "*anonymous-ly-" + to_string (module_count++) + "*";
30 SCM mod = scm_c_define_module (s.to_str0(), ly_init_anonymous_module, 0);
34 #define FUNC_NAME __FUNCTION__
37 ly_module_define (void *closure, SCM key, SCM val, SCM result)
40 SCM module = (SCM) closure;
41 scm_module_define (module, key, scm_variable_ref (val));
45 /* Ugh signature of scm_internal_hash_fold () is inaccurate. */
46 typedef SCM (*Hash_cl_func)();
49 ly_import_module (SCM dest, SCM src)
51 SCM_VALIDATE_MODULE (1, src);
52 scm_internal_hash_fold ((Hash_cl_func) &ly_module_define, (void*) dest,
53 SCM_EOL, SCM_MODULE_OBARRAY (src));
57 accumulate_symbol (void *closure, SCM key, SCM val, SCM result)
61 return scm_cons (key, result);
65 ly_module_symbols (SCM mod)
67 SCM_VALIDATE_MODULE (1, mod);
69 SCM obarr= SCM_MODULE_OBARRAY (mod);
70 return scm_internal_hash_fold ((Hash_cl_func) &accumulate_symbol,
71 NULL, SCM_EOL, obarr);
75 entry_to_alist (void *closure, SCM key, SCM val, SCM result)
78 return scm_cons (scm_cons (key, scm_variable_ref (val)), result);
82 ly_module_to_alist (SCM mod)
84 SCM_VALIDATE_MODULE (1, mod);
87 SCM obarr= SCM_MODULE_OBARRAY (mod);
89 return scm_internal_hash_fold ((Hash_cl_func) &entry_to_alist, NULL, SCM_EOL, obarr);
92 /* Lookup SYM, but don't give error when it is not defined. */
94 ly_module_lookup (SCM module, SCM sym)
96 #define FUNC_NAME __FUNCTION__
97 SCM_VALIDATE_MODULE (1, module);
99 return scm_sym2var (sym, scm_module_lookup_closure (module), SCM_BOOL_F);
104 ly_modules_lookup (SCM modules, SCM sym)
106 for (SCM s = ly_car (modules); SCM_MODULEP (s); s = ly_cdr (s))
108 SCM v = scm_sym2var (sym, scm_module_lookup_closure (s), SCM_UNDEFINED);
109 if (v != SCM_UNDEFINED)
112 return SCM_UNDEFINED;
119 ly_export (SCM module, SCM namelist)
121 if (!export_function)
122 export_function = scm_permanent_object (scm_c_lookup ("module-export!"));
124 scm_call_2 (SCM_VARIABLE_REF (export_function), module, namelist);
128 ly_reexport_module (SCM mod)
130 ly_export (mod, ly_module_symbols (mod));