core: Use hashq-table for macros.
[mes.git] / src / mes.c
index 0eb439f34bd194732621136d958244fa34cef742..c0876c957b18edb90ab0119c884571d08b3e8b9c 100644 (file)
--- a/src/mes.c
+++ b/src/mes.c
@@ -55,7 +55,7 @@ SCM r3 = 0;
 // current-module
 SCM m0 = 0;
 // macro
-SCM g_macros = 1;
+SCM g_macros = 0;
 SCM g_ports = 1;
 
 #if __M2_PLANET__
@@ -884,16 +884,26 @@ make_variable_ (SCM var) ///((internal))
 }
 
 SCM
-lookup_macro_ (SCM x, SCM a) ///((internal))
+macro_ref (SCM table, SCM name) ///((internal))
 {
-  if (TYPE (x) != TSYMBOL)
-    return cell_f;
-  SCM m = assq (x, a);
+  return hashq_ref (table, name, cell_nil);
+}
+
+SCM
+get_macro (SCM table, SCM name) ///((internal))
+{
+  SCM m = macro_ref (table, name);
   if (m != cell_f)
     return MACRO (CDR (m));
   return cell_f;
 }
 
+SCM
+macro_set_x (SCM table, SCM name, SCM value) ///((internal))
+{
+  return hashq_set_x (table, name, value);
+}
+
 SCM
 push_cc (SCM p1, SCM p2, SCM a, SCM c) ///((internal))
 {
@@ -1277,10 +1287,7 @@ eval_apply ()
                     {
                       entry = assq (name, g_macros);
                       if (entry == cell_f)
-                        {
-                          entry = cons (name, cell_f);
-                          g_macros = cons (entry, g_macros);
-                        }
+                        macro_set_x (g_macros, name, cell_f);
                     }
                   else
                     {
@@ -1313,7 +1320,7 @@ eval_apply ()
                 name = CAR (name);
               if (macro_p)
                 {
-                  entry = assq (name, g_macros);
+                  entry = macro_ref (g_macros, name);
                   r1 = MAKE_MACRO (name, r1);
                   set_cdr_x (entry, r1);
                 }
@@ -1388,7 +1395,7 @@ eval_apply ()
       }
 
     if (TYPE (r1) == TPAIR
-        && (macro = lookup_macro_ (CAR (r1), g_macros)) != cell_f)
+        && (macro = get_macro (g_macros, CAR (r1))) != cell_f)
       {
         r1 = cons (macro, CDR (r1));
         push_cc (r1, cell_nil, r0, cell_vm_macro_expand);
@@ -1426,7 +1433,7 @@ eval_apply ()
     if (TYPE (r1) == TPAIR
         && TYPE (CAR (r1)) == TSYMBOL
         && CAR (r1) != cell_symbol_begin
-        && ((macro = assq (cell_symbol_portable_macro_expand, g_macros)) != cell_f)
+        && ((macro = macro_ref (g_macros, cell_symbol_portable_macro_expand)) != cell_f)
         && ((expanders = module_ref (r0, cell_symbol_sc_expander_alist)) != cell_undefined)
         && ((macro = assq (CAR (r1), expanders)) != cell_f))
       {
@@ -2472,6 +2479,7 @@ main (int argc, char *argv[])
   SCM a = mes_environment (argc, argv);
   a = mes_builtins (a);
   m0 = make_initial_module (a);
+  g_macros = make_hash_table_ (0);
 
   if (g_debug > 3)
     module_printer (m0);