mini-mes: Fully remove reader from core.
authorJan Nieuwenhuizen <janneke@gnu.org>
Sat, 25 Mar 2017 14:58:44 +0000 (15:58 +0100)
committerJan Nieuwenhuizen <janneke@gnu.org>
Sat, 25 Mar 2017 14:58:44 +0000 (15:58 +0100)
* scaffold/mini-mes.c (lookup_): Remove.
* mes.c: Likewise.
* reader.c (lookup_): Enable.
* mlib.c (putc): New function.
* module/mes/libc.mes (putc): New function.

21 files changed:
GNUmakefile
build-aux/mes-snarf.scm
lib.c
math.c
mes.c
mlibc.c
module/mes/base-0.mes
module/mes/libc.mes
module/mes/read-0-32.mo [new file with mode: 0644]
module/mes/read-0.mes
module/mes/type-0.mes
posix.c
reader.c
scaffold/cons-mes.c
scaffold/micro-mes.c
scaffold/mini-mes.c
scaffold/tiny-mes.c
tests/gc-0.test
tests/gc-1.test
tests/gc.test
vector.c

index bb3eacdc4c9a15f61162d4e128245bffb3f9a7d1..f6a7e70442196d23425ac8988c0c374835d72447 100644 (file)
@@ -101,6 +101,7 @@ dump: module/mes/read-0.mo
 mes-32: mes.c lib.c
        rm -f mes mes.o
        guix environment --system=i686-linux --ad-hoc gcc-toolchain -- bash -c 'make mes CC=i686-unknown-linux-gnu-gcc LIBRARY_PATH=$${PATH%%/bin:*}/lib'
+       rm -f mes.o
        mv mes mes-32
 
 module/mes/read-0-32.mo: module/mes/read-0.mes mes-32
@@ -135,6 +136,7 @@ mini-mes: scaffold/mini-mes.c
        rm -f $@
        #       gcc -nostdlib --std=gnu99 -m32 -g -o $@ '-DPREFIX=' '-DVERSION='"$(VERSION)"' $<
        gcc -nostdlib -I. --std=gnu99 -m32 -g -I. -o $@ $(CPPFLAGS) $<
+       rm -f mes.o
        chmod +x $@
 
 guile-mini-mes: mini-mes.h mini-mes.i mini-mes.environment.i mini-mes.symbols.i
index ae80d412b0436093b803caa8c65bc6fce9d78097..05215a2a56d91add81afaed1a40ec77853c6ca5c 100755 (executable)
@@ -57,10 +57,11 @@ exec ${GUILE-guile} --no-auto-compile -L $HOME/src/mes/build-aux -L build-aux -e
                     (regexp-replace "_" "-")
                     (regexp-replace "_" "-")
                     (regexp-replace "_" "-")
-                    (regexp-replace "^builtin_" "")
                     (regexp-replace "_to_" "->")
                     (regexp-replace "_x$" "!")
-                    (regexp-replace "_p$" "?"))
+                    (regexp-replace "_p$" "?")
+                    (regexp-replace "___" "***")
+                    (regexp-replace "___" "***"))
                    (.name f))))
         (if (not (string-suffix? "-" name)) name
             (string-append "core:" (string-drop-right name 1))))))
@@ -120,8 +121,8 @@ exec ${GUILE-guile} --no-auto-compile -L $HOME/src/mes/build-aux -L build-aux -e
        (format #f "g_cells[cell_~a].string = MAKE_STRING (scm_~a.string);\n" (.name f) (.name f))
        (format #f "g_cells[cell_~a].car = MAKE_STRING (scm_~a.car);\n" (.name f) (.name f)))
    (if GCC?
-       (format #f "a = acons (make_symbol (scm_~a.string), ~a, a);\n\n" (.name f) (function-cell-name f))
-       (format #f "a = acons (make_symbol (scm_~a.car), ~a, a);\n\n" (.name f) (function-cell-name f)))))
+       (format #f "a = acons (lookup_symbol_ (scm_~a.string), ~a, a);\n\n" (.name f) (function-cell-name f))
+       (format #f "a = acons (lookup_symbol_ (scm_~a.car), ~a, a);\n\n" (.name f) (function-cell-name f)))))
 
 (define (snarf-symbols string)
   (let* ((matches (list-matches "\nstruct scm scm_([a-z_0-9]+) = [{](TSPECIAL|TSYMBOL)," string)))
diff --git a/lib.c b/lib.c
index ea5eb4f1465ef0bc1a77b36663bd72bb626f85a1..b458e56105596b49eaa9080f2c26a11a894766cd 100644 (file)
--- a/lib.c
+++ b/lib.c
@@ -1,6 +1,6 @@
 /* -*-comment-start: "//";comment-end:""-*-
  * Mes --- Maxwell Equations of Software
- * Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
+ * Copyright © 2016,2017 Jan Nieuwenhuizen <janneke@gnu.org>
  *
  * This file is part of Mes.
  *
 //   return MAKE_NUMBER (n);
 // }
 
+SCM fdisplay_ (SCM,FILE*);
+
+int g_depth;
+
+SCM
+display_helper (SCM x, int cont, char* sep, FILE *fd)
+{
+  fputs (sep, fd);
+  if (g_depth == 0) return cell_unspecified;
+  g_depth = g_depth - 1;
+
+  switch (TYPE (x))
+    {
+    case TCHAR:
+      {
+        fputs ("#\\", fd);
+        putc (VALUE (x), fd);
+        break;
+      }
+    case TFUNCTION:
+      {
+        fputs ("#<procedure ", fd);
+        char *p = "?";
+        if (FUNCTION (x).name != 0)
+          p = FUNCTION (x).name;
+        fputs (p, fd);
+        fputs ("[", fd);
+        fputs (itoa (CDR (x)), fd);
+        fputs (",", fd);
+        fputs (itoa (x), fd);
+        fputs ("]>", fd);
+        break;
+      }
+    case TMACRO:
+      {
+        fputs ("#<macro ", fd);
+        display_helper (cdr (x), cont, "", fd);
+        fputs (">", fd);
+        break;
+      }
+    case TNUMBER:
+      {
+        fputs (itoa (VALUE (x)), fd);
+        break;
+      }
+    case TPAIR:
+      {
+        if (!cont) fputs ("(", fd);
+        if (x && x != cell_nil) fdisplay_ (CAR (x), fd);
+        if (CDR (x) && TYPE (CDR (x)) == TPAIR)
+          display_helper (CDR (x), 1, " ", fd);
+        else if (CDR (x) && CDR (x) != cell_nil)
+          {
+            if (TYPE (CDR (x)) != TPAIR)
+              fputs (" . ", fd);
+            fdisplay_ (CDR (x), fd);
+          }
+        if (!cont) fputs (")", fd);
+        break;
+      }
+    case TSPECIAL:
+#if __NYACC__
+      // FIXME
+      //{}
+      {
+        SCM t = CAR (x);
+        while (t && t != cell_nil)
+          {
+            putc (VALUE (CAR (t)), fd);
+            t = CDR (t);
+          }
+        break;
+      }
+#endif
+    case TSTRING:
+#if __NYACC__
+      // FIXME
+      {
+        SCM t = CAR (x);
+        while (t && t != cell_nil)
+          {
+            putc (VALUE (CAR (t)), fd);
+            t = CDR (t);
+          }
+        break;
+      }
+#endif
+    case TSYMBOL:
+      {
+        SCM t = CAR (x);
+        while (t && t != cell_nil)
+          {
+            putc (VALUE (CAR (t)), fd);
+            t = CDR (t);
+          }
+        break;
+      }
+    default:
+      {
+        fputs ("<", fd);
+        fputs (itoa (TYPE (x)), fd);
+        fputs (":", fd);
+        fputs (itoa (x), fd);
+        fputs (">", fd);
+        break;
+      }
+    }
+  return 0;
+}
+
+SCM
+display_ (SCM x)
+{
+  g_depth = 5;
+  return display_helper (x, 0, "", stdout);
+}
+
+SCM
+display_error_ (SCM x)
+{
+  g_depth = 5;
+  return display_helper (x, 0, "", stderr);
+}
+
+SCM
+fdisplay_ (SCM x, FILE *fd) ///((internal))
+{
+  g_depth = 5;
+  return display_helper (x, 0, "", fd);
+}
+
 SCM
 exit_ (SCM x) ///((name . "exit"))
 {
@@ -111,7 +242,7 @@ check_apply (SCM f, SCM e) ///((internal))
       char buf[1024];
       sprintf (buf, "cannot apply: %s:", type);
       fprintf (stderr, " [");
-      stderr_ (e);
+      display_error_ (e);
       fprintf (stderr, "]\n");
       SCM e = MAKE_STRING (cstring_to_list (buf));
       return error (cell_symbol_wrong_type_arg, cons (e, f));
@@ -147,7 +278,7 @@ int
 dump ()
 {
   fputs ("program r2=", stderr);
-  stderr_ (r2);
+  display_error_ (r2);
   fputs ("\n", stderr);
 
   r1 = g_symbols;
@@ -236,21 +367,6 @@ bload_env (SCM a) ///((internal))
   return r2;
 }
 
-SCM
-values (SCM x) ///((arity . n))
-{
-  SCM v = cons (0, x);
-  TYPE (v) = TVALUES;
-  return v;
-}
-
-SCM
-arity_ (SCM x)
-{
-  assert (TYPE (x) == TFUNCTION);
-  return MAKE_NUMBER (FUNCTION (x).arity);
-}
-
 SCM
 xassq (SCM x, SCM a) ///for speed in core only
 {
diff --git a/math.c b/math.c
index 11917fa6810f18ccf1e0f34b858c2920c175e270..9fe8b9c229daf98d09cc2d5a004ecdf80f608f53 100644 (file)
--- a/math.c
+++ b/math.c
@@ -1,6 +1,6 @@
 /* -*-comment-start: "//";comment-end:""-*-
  * Mes --- Maxwell Equations of Software
- * Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
+ * Copyright © 2016,2017 Jan Nieuwenhuizen <janneke@gnu.org>
  *
  * This file is part of Mes.
  *
diff --git a/mes.c b/mes.c
index 25c08e2f1ed892ccd2a21da3b96dc735a71941f5..89a86103b4cb926de2e38d24362ea482f4062547 100644 (file)
--- a/mes.c
+++ b/mes.c
@@ -213,19 +213,19 @@ SCM r3 = 0; // continuation
 #define NTYPE(x) g_news[x].type
 
 #define CAAR(x) CAR (CAR (x))
+#define CADR(x) CAR (CDR (x))
 #define CDAR(x) CDR (CAR (x))
-#define CAAR(x) CAR (CAR (x))
+#define CDDR(x) CDR (CDR (x))
 #define CADAR(x) CAR (CDR (CAR (x)))
 #define CADDR(x) CAR (CDR (CDR (x)))
 #define CDDDR(x) CDR (CDR (CDR (x)))
 #define CDADAR(x) CAR (CDR (CAR (CDR (x))))
-#define CADR(x) CAR (CDR (x))
 
-#define MAKE_CHAR(n) make_cell (tmp_num_ (TCHAR), 0, tmp_num2_ (n))
-#define MAKE_CONTINUATION(n) make_cell (tmp_num_ (TCONTINUATION), n, g_stack)
-#define MAKE_NUMBER(n) make_cell (tmp_num_ (TNUMBER), 0, tmp_num2_ (n))
-#define MAKE_REF(n) make_cell (tmp_num_ (TREF), n, 0)
-#define MAKE_STRING(x) make_cell (tmp_num_ (TSTRING), x, 0)
+#define MAKE_CHAR(n) make_cell_ (tmp_num_ (TCHAR), 0, tmp_num2_ (n))
+#define MAKE_CONTINUATION(n) make_cell_ (tmp_num_ (TCONTINUATION), n, g_stack)
+#define MAKE_NUMBER(n) make_cell_ (tmp_num_ (TNUMBER), 0, tmp_num2_ (n))
+#define MAKE_REF(n) make_cell_ (tmp_num_ (TREF), n, 0)
+#define MAKE_STRING(x) make_cell_ (tmp_num_ (TSTRING), x, 0)
 
 SCM vm_call (function0_t f, SCM p1, SCM a);
 char const* itoa(int);
@@ -256,7 +256,7 @@ alloc (int n)
 }
 
 SCM
-make_cell (SCM type, SCM car, SCM cdr)
+make_cell_ (SCM type, SCM car, SCM cdr)
 {
   SCM x = alloc (1);
   assert (TYPE (type) == TNUMBER);
@@ -274,11 +274,79 @@ make_cell (SCM type, SCM car, SCM cdr)
   return x;
 }
 
+SCM
+make_symbol_ (SCM s)
+{
+  g_cells[tmp_num].value = TSYMBOL;
+  SCM x = make_cell_ (tmp_num, s, 0);
+  g_symbols = cons (x, g_symbols);
+  return x;
+}
+
+SCM
+list_of_char_equal_p (SCM a, SCM b) ///((internal))
+{
+  while (a != cell_nil && b != cell_nil && VALUE (car (a)) == VALUE (car (b))) {
+    assert (TYPE (car (a)) == TCHAR);
+    assert (TYPE (car (b)) == TCHAR);
+    a = cdr (a);
+    b = cdr (b);
+  }
+  return (a == cell_nil && b == cell_nil) ? cell_t : cell_f;
+}
+
+SCM
+lookup_symbol_ (SCM s)
+{
+  SCM x = g_symbols;
+  while (x) {
+    if (list_of_char_equal_p (STRING (car (x)), s) == cell_t) break;
+    x = cdr (x);
+  }
+  if (x) x = car (x);
+  if (!x) x = make_symbol_ (s);
+  return x;
+}
+
+SCM
+type_ (SCM x)
+{
+  return MAKE_NUMBER (TYPE (x));
+}
+
+SCM
+car_ (SCM x)
+{
+  return (TYPE (x) != TCONTINUATION
+          && (TYPE (CAR (x)) == TPAIR // FIXME: this is weird
+              || TYPE (CAR (x)) == TREF
+              || TYPE (CAR (x)) == TSPECIAL
+              || TYPE (CAR (x)) == TSYMBOL
+              || TYPE (CAR (x)) == TSTRING)) ? CAR (x) : MAKE_NUMBER (CAR (x));
+}
+
+SCM
+cdr_ (SCM x)
+{
+  return (TYPE (CDR (x)) == TPAIR
+          || TYPE (CDR (x)) == TREF
+          || TYPE (CAR (x)) == TSPECIAL
+          || TYPE (CDR (x)) == TSYMBOL
+          || TYPE (CDR (x)) == TSTRING) ? CDR (x) : MAKE_NUMBER (CDR (x));
+}
+
+SCM
+arity_ (SCM x)
+{
+  assert (TYPE (x) == TFUNCTION);
+  return MAKE_NUMBER (FUNCTION (x).arity);
+}
+
 SCM
 cons (SCM x, SCM y)
 {
   g_cells[tmp_num].value = TPAIR;
-  return make_cell (tmp_num, x, y);
+  return make_cell_ (tmp_num, x, y);
 }
 
 SCM
@@ -321,30 +389,17 @@ eq_p (SCM x, SCM y)
 }
 
 SCM
-type_ (SCM x)
+values (SCM x) ///((arity . n))
 {
-  return MAKE_NUMBER (TYPE (x));
+  SCM v = cons (0, x);
+  TYPE (v) = TVALUES;
+  return v;
 }
 
 SCM
-car_ (SCM x)
-{
-  return (TYPE (x) != TCONTINUATION
-          && (TYPE (CAR (x)) == TPAIR // FIXME: this is weird
-              || TYPE (CAR (x)) == TREF
-              || TYPE (CAR (x)) == TSPECIAL
-              || TYPE (CAR (x)) == TSYMBOL
-              || TYPE (CAR (x)) == TSTRING)) ? CAR (x) : MAKE_NUMBER (CAR (x));
-}
-
-SCM
-cdr_ (SCM x)
+acons (SCM key, SCM value, SCM alist)
 {
-  return (TYPE (CDR (x)) == TPAIR
-          || TYPE (CDR (x)) == TREF
-          || TYPE (CAR (x)) == TSPECIAL
-          || TYPE (CDR (x)) == TSYMBOL
-          || TYPE (CDR (x)) == TSTRING) ? CDR (x) : MAKE_NUMBER (CDR (x));
+  return cons (cons (key, value), alist);
 }
 
 // MIMI_MES lib.c?
@@ -367,6 +422,9 @@ error (SCM key, SCM x)
   SCM throw;
   if ((throw = assq_ref_env (cell_symbol_throw, r0)) != cell_undefined)
     return apply (throw, cons (key, cons (x, cell_nil)), r0);
+  display_error_ (key);
+  fputs (": ", stderr);
+  display_error_ (x);
   assert (!"error");
 }
 
@@ -408,18 +466,12 @@ call (SCM fn, SCM x)
   if ((FUNCTION (fn).arity > 1 || FUNCTION (fn).arity == -1)
       && x != cell_nil && TYPE (CDR (x)) == TPAIR && TYPE (CADR (x)) == TVALUES)
     x = cons (CAR (x), cons (CDADAR (x), CDR (x)));
-#if 0
-  eputs ("call: ");
-  if (FUNCTION (fn).name) eputs (FUNCTION (fn).name);
-  else eputs (itoa (CDR (fn)));
-  eputs ("\n");
-#endif
   switch (FUNCTION (fn).arity)
     {
     case 0: return FUNCTION (fn).function0 ();
     case 1: return FUNCTION (fn).function1 (car (x));
-    case 2: return FUNCTION (fn).function2 (car (x), cadr (x));
-    case 3: return FUNCTION (fn).function3 (car (x), cadr (x), car (cddr (x)));
+    case 2: return FUNCTION (fn).function2 (car (x), CADR (x));
+    case 3: return FUNCTION (fn).function3 (car (x), CADR (x), car (CDDR (x)));
     case -1: return FUNCTION (fn).functionn (x);
     }
 
@@ -430,7 +482,7 @@ SCM
 assq (SCM x, SCM a)
 {
   while (a != cell_nil && eq_p (x, CAAR (a)) == cell_f) a = CDR (a);
-  return a != cell_nil ? car (a) : cell_f;
+  return a != cell_nil ? CAR (a) : cell_f;
 }
 
 SCM
@@ -438,7 +490,7 @@ assq_ref_env (SCM x, SCM a)
 {
   x = assq (x, a);
   if (x == cell_f) return cell_undefined;
-  return cdr (x);
+  return CDR (x);
 }
 
 SCM
@@ -475,28 +527,16 @@ call_lambda (SCM e, SCM x, SCM aa, SCM a) ///((internal))
 }
 
 SCM
-make_closure (SCM args, SCM body, SCM a)
+make_closure_ (SCM args, SCM body, SCM a) ///((internal))xs
 {
-  return make_cell (tmp_num_ (TCLOSURE), cell_f, cons (cons (cell_circular, a), cons (args, body)));
+  return make_cell_ (tmp_num_ (TCLOSURE), cell_f, cons (cons (cell_circular, a), cons (args, body)));
 }
 
 SCM
-lookup_macro (SCM x, SCM a)
+lookup_macro_ (SCM x, SCM a) ///((internal))
 {
   if (TYPE (x) != TSYMBOL) return cell_f;
   SCM m = assq_ref_env (x, a);
-#if 0
-  if (TYPE (m) == TMACRO)
-    {
-      fputs ("XXmacro: ", stdout);
-      fputs ("[", stdout);
-      fputs (itoa (m), stdout);
-      fputs ("]: ", stdout);
-      display_ (m);
-      fputs ("\n", stdout);
-
-    }
-#endif
   if (TYPE (m) == TMACRO) return MACRO (m);
   return cell_f;
 }
@@ -514,11 +554,6 @@ push_cc (SCM p1, SCM p2, SCM a, SCM c) ///((internal))
   return cell_unspecified;
 }
 
-SCM caar (SCM x) {return car (car (x));}
-SCM cadr (SCM x) {return car (cdr (x));}
-SCM cdar (SCM x) {return cdr (car (x));}
-SCM cddr (SCM x) {return cdr (cdr (x));}
-
 SCM
 eval_apply ()
 {
@@ -582,9 +617,9 @@ eval_apply ()
     case TCLOSURE:
       {
         SCM cl = CLOSURE (car (r1));
-        SCM formals = cadr (cl);
-        SCM body = cddr (cl);
-        SCM aa = cdar (cl);
+        SCM formals = CADR (cl);
+        SCM body = CDDR (cl);
+        SCM aa = CDAR (cl);
         aa = cdr (aa);
         check_formals (car (r1), formals, cdr (r1));
         SCM p = pairlis (formals, cdr (r1), aa);
@@ -596,7 +631,7 @@ eval_apply ()
           x = r1;
           g_stack = CONTINUATION (CAR (r1));
           gc_pop_frame ();
-          r1 = cadr (x);
+          r1 = CADR (x);
           goto eval_apply;
         }
     case TSPECIAL:
@@ -637,12 +672,12 @@ eval_apply ()
       }
     case TPAIR:
       {
-        switch (caar (r1))
+        switch (CAAR (r1))
           {
           case cell_symbol_lambda:
             {
-              SCM formals = cadr (car (r1));
-              SCM body = cddr (car (r1));
+              SCM formals = CADR (car (r1));
+              SCM body = CDDR (car (r1));
               SCM p = pairlis (formals, cdr (r1), r0);
               check_formals (r1, formals, cdr (r1));
               call_lambda (body, p, p, r0);
@@ -696,27 +731,27 @@ eval_apply ()
 #endif // FIXED_PRIMITIVES
           case cell_symbol_quote:
             {
-              x = r1; gc_pop_frame (); r1 = cadr (x); goto eval_apply;
+              x = r1; gc_pop_frame (); r1 = CADR (x); goto eval_apply;
             }
           case cell_symbol_begin: goto begin;
           case cell_symbol_lambda:
             {
-              r1 = make_closure (cadr (r1), cddr (r1), assq (cell_closure, r0));
+              r1 = make_closure_ (CADR (r1), CDDR (r1), assq (cell_closure, r0));
               goto vm_return;
             }
           case cell_symbol_if: {r1=cdr (r1); goto vm_if;}
           case cell_symbol_set_x:
             {
-              push_cc (car (cddr (r1)), r1, r0, cell_vm_eval_set_x);
+              push_cc (car (CDDR (r1)), r1, r0, cell_vm_eval_set_x);
               goto eval;
             eval_set_x:
               x = r2;
-              r1 = set_env_x (cadr (x), r1, r0);
+              r1 = set_env_x (CADR (x), r1, r0);
               goto vm_return;
             }
           case cell_vm_macro_expand:
             {
-              push_cc (cadr (r1), r1, r0, cell_vm_return);
+              push_cc (CADR (r1), r1, r0, cell_vm_return);
               goto macro_expand;
             }
           default: {
@@ -752,17 +787,9 @@ eval_apply ()
   SCM expanders;
  macro_expand:
   if (TYPE (r1) == TPAIR
-      && (macro = lookup_macro (car (r1), r0)) != cell_f)
+      && (macro = lookup_macro_ (car (r1), r0)) != cell_f)
     {
       r1 = cons (macro, CDR (r1));
-#if 0
-      fputs ("macro: ", stdout);
-      display_ (macro);
-      fputs ("\n", stdout);
-      fputs ("r1: ", stdout);
-      display_ (r1);
-      fputs ("\n", stdout);
-#endif
       goto apply;
     }
   else if (TYPE (r1) == TPAIR
@@ -784,9 +811,9 @@ eval_apply ()
   while (r1 != cell_nil) {
     if (TYPE (r1) == TPAIR && TYPE (CAR (r1)) == TPAIR)
       {
-        if (caar (r1) == cell_symbol_begin)
-          r1 = append2 (cdar (r1), cdr (r1));
-        else if (caar (r1) == cell_symbol_primitive_load)
+        if (CAAR (r1) == cell_symbol_begin)
+          r1 = append2 (CDAR (r1), cdr (r1));
+        else if (CAAR (r1) == cell_symbol_primitive_load)
           {
             push_cc (cons (cell_symbol_read_input_file, cell_nil), r1, r0, cell_vm_begin_read_input_file);
             goto apply;
@@ -797,11 +824,6 @@ eval_apply ()
     if (CDR (r1) == cell_nil)
       {
         r1 = car (r1);
-#if 0
-        fputs ("begin: ", stdout);
-        display_ (r1);
-        fputs ("\n", stdout);
-#endif
         goto eval;
       }
     push_cc (CAR (r1), r1, r0, cell_vm_begin2);
@@ -821,12 +843,12 @@ eval_apply ()
   r1 = r2;
   if (x != cell_f)
     {
-      r1 = cadr (r1);
+      r1 = CADR (r1);
       goto eval;
     }
-  if (cddr (r1) != cell_nil)
+  if (CDDR (r1) != cell_nil)
     {
-      r1 = car (cddr (r1));
+      r1 = car (CDDR (r1));
       goto eval;
     }
   r1 = cell_unspecified;
@@ -848,7 +870,7 @@ eval_apply ()
  call_with_values2:
   if (TYPE (r1) == TVALUES)
     r1 = CDR (r1);
-  r1 = cons (cadr (r2), r1);
+  r1 = cons (CADR (r2), r1);
   goto apply;
 
  vm_return:
@@ -863,9 +885,9 @@ gc_peek_frame () ///((internal))
 {
   SCM frame = car (g_stack);
   r1 = car (frame);
-  r2 = cadr (frame);
-  r3 = car (cddr (frame));
-  r0 = cadr (cddr (frame));
+  r2 = CADR (frame);
+  r3 = car (CDDR (frame));
+  r0 = CADR (CDDR (frame));
   return frame;
 }
 
@@ -892,76 +914,6 @@ apply (SCM f, SCM x, SCM a) ///((internal))
   return eval_apply ();
 }
 
-SCM
-make_symbol_ (SCM s)
-{
-  g_cells[tmp_num].value = TSYMBOL;
-  SCM x = make_cell (tmp_num, s, 0);
-  g_symbols = cons (x, g_symbols);
-  return x;
-}
-
-SCM
-list_of_char_equal_p (SCM a, SCM b)
-{
-  while (a != cell_nil && b != cell_nil && VALUE (car (a)) == VALUE (car (b))) {
-    assert (TYPE (car (a)) == TCHAR);
-    assert (TYPE (car (b)) == TCHAR);
-    a = cdr (a);
-    b = cdr (b);
-  }
-  return (a == cell_nil && b == cell_nil) ? cell_t : cell_f;
-}
-
-SCM
-lookup_symbol_ (SCM s)
-{
-  SCM x = g_symbols;
-  while (x) {
-    if (list_of_char_equal_p (STRING (car (x)), s) == cell_t) break;
-    x = cdr (x);
-  }
-  if (x) x = car (x);
-  return x;
-}
-
-SCM
-make_symbol (SCM s)
-{
-  SCM x = lookup_symbol_ (s);
-  return x ? x : make_symbol_ (s);
-}
-
-//MINI_MES reader.c
-SCM
-lookup_ (SCM s, SCM a)
-{
-  if (isdigit (VALUE (car (s))) || (VALUE (car (s)) == '-' && cdr (s) != cell_nil)) {
-    SCM p = s;
-    int sign = 1;
-    if (VALUE (car (s)) == '-') {
-      sign = -1;
-      p = cdr (s);
-    }
-    int n = 0;
-    while (p != cell_nil && isdigit (VALUE (car (p)))) {
-      n *= 10;
-      n += VALUE (car (p)) - '0';
-      p = cdr (p);
-    }
-    if (p == cell_nil) return MAKE_NUMBER (n * sign);
-  }
-
-  SCM x = lookup_symbol_ (s);
-  return x ? x : make_symbol_ (s);
-}
-
-SCM
-acons (SCM key, SCM value, SCM alist)
-{
-  return cons (cons (key, value), alist);
-}
-
 void
 make_tmps (struct scm* cells)
 {
@@ -1041,8 +993,6 @@ mes_symbols () ///((internal))
   return a;
 }
 
-#define gputs(x) fputs(x,stdout);
-
 SCM
 mes_builtins (SCM a) ///((internal))
 {
@@ -1051,9 +1001,9 @@ mes_builtins (SCM a) ///((internal))
 #include "posix.i"
 #include "math.i"
 #include "lib.i"
-#include "reader.i"
 #include "vector.i"
 #include "gc.i"
+#include "reader.i"
 
 #include "gc.environment.i"
 #include "lib.environment.i"
@@ -1065,18 +1015,18 @@ mes_builtins (SCM a) ///((internal))
 
   if (g_debug)
     {
-      gputs ("functions: ");
-      gputs (itoa (g_function));
-      gputs ("\n");
+      fputs ("functions: ", stderr);
+      fputs (itoa (g_function), stderr);
+      fputs ("\n", stderr);
       for (int i = 0; i < g_function; i++)
         {
-          gputs ("[");
-          gputs (itoa (i));
-          gputs ("]: ");
-          gputs (g_functions[i].name);
-          gputs ("\n");
+          fputs ("[", stderr);
+          fputs (itoa (i), stderr);
+          fputs ("]: ", stderr);
+          fputs (g_functions[i].name, stderr);
+          fputs ("\n", stderr);
         }
-      gputs ("\n");
+      fputs ("\n", stderr);
     }
 
   return a;
@@ -1128,11 +1078,11 @@ main (int argc, char *argv[])
   for (int i=argc; i; i--) lst = cons (MAKE_STRING (cstring_to_list (argv[i-1])), lst);
   r0 = acons (cell_symbol_argv, lst, r0);
 
+  if (g_debug) {eputs ("program: "); display_error_ (r2); eputs ("\n");}
   push_cc (r2, cell_unspecified, r0, cell_unspecified);
   r3 = cell_vm_begin;
   r1 = eval_apply ();
-  ///stderr_ (r1);
-  display_ (r1);
+  display_error_ (r1);
   fputs ("", stdout);
   gc (g_stack);
 #if __GNUC__
diff --git a/mlibc.c b/mlibc.c
index 89d1d931f80b8a3e7aef5cc0309c9f243ef2a591..562079b6835ba14f35dc28af9ab3b411bc845430 100644 (file)
--- a/mlibc.c
+++ b/mlibc.c
@@ -29,6 +29,10 @@ void write (int fd, char const* s, int n);
 #define O_RDONLY 0
 #define INT_MIN -2147483648
 #define INT_MAX 2147483647
+#define EOF -1
+#define STDIN 0
+#define STDOUT 1
+#define STDERR 2
 
 void
 exit (int code)
@@ -128,12 +132,17 @@ brk (void *p)
   return r;
 }
 
+int
+putc (int c, int fd)
+{
+  write (fd, (char*)&c, 1);
+  return 0;
+}
+
 int
 putchar (int c)
 {
-  //write (STDOUT, s, strlen (s));
-  //int i = write (STDOUT, s, strlen (s));
-  write (1, (char*)&c, 1);
+  write (STDOUT, (char*)&c, 1);
   return 0;
 }
 
@@ -163,11 +172,6 @@ free (void *p)
   //munmap ((void*)p, *n);
 }
 
-#define EOF -1
-#define STDIN 0
-#define STDOUT 1
-#define STDERR 2
-
 size_t
 strlen (char const* s)
 {
@@ -186,16 +190,14 @@ strcmp (char const* a, char const* b)
 int
 eputs (char const* s)
 {
-  //int i = write (STDERR, s, strlen (s));
   int i = strlen (s);
-  write (2, s, i);
+  write (STDERR, s, i);
   return 0;
 }
 
 int
 fputs (char const* s, int fd)
 {
-  //int i = write (fd, s, strlen (s));
   int i = strlen (s);
   write (fd, s, i);
   return 0;
@@ -204,9 +206,8 @@ fputs (char const* s, int fd)
 int
 puts (char const* s)
 {
-  //int i = write (STDOUT, s, strlen (s));
   int i = strlen (s);
-  write (1, s, i);
+  write (STDOUT, s, i);
   return 0;
 }
 
index b505012dfeb63cdf539fd84700498286495ad040..871a86db62069d24079fbc62e5334c6fb6287e62 100644 (file)
 (define (primitive-eval e) (core:eval e (current-module)))
 (define eval core:eval)
 
+(define (caar x) (car (car x)))
+(define (cadr x) (car (cdr x)))
+(define (cdar x) (cdr (car x)))
+(define (cddr x) (cdr (cdr x)))
+
 (define-macro (defined? x)
   (list 'assq x '(cddr (current-module))))
 
   (list 'begin
         (list 'if (list getenv "MES_DEBUG")
               (list 'begin
-                    (list core:stderr "read ")
-                    (list core:stderr file)
-                    (list core:stderr "\n")))
+                    (list core:display-error "read ")
+                    (list core:display-error file)
+                    (list core:display-error "\n")))
      (list 'push! '*input-ports* (list current-input-port))
      (list 'set-current-input-port (list open-input-file file))
      (list 'primitive-load)
index 1c381805b4196305a25626e32d60a75803919799..d4d500e20c0615a676a88fb5d9a41a0116c0e000 100644 (file)
@@ -151,8 +151,6 @@ ungetc (int c, int fd)
 int
 putchar (int c)
 {
-  //write (STDOUT, s, strlen (s));
-  //int i = write (STDOUT, s, strlen (s));
   write (1, (char*)&c, 1);
   return 0;
 }
@@ -161,14 +159,26 @@ putchar (int c)
                 parse-c99)))
     ast))
 
+(define putc
+  (let* ((ast (with-input-from-string
+                  "
+int
+putc (int c, int fd)
+{
+  write (fd, (char*)&c, 1);
+  return 0;
+}
+"
+;;paredit:"
+                parse-c99)))
+    ast))
+
 (define eputs
   (let* ((ast (with-input-from-string
                   "
 int
 eputs (char const* s)
 {
-  //write (STDERR, s, strlen (s));
-  //write (2, s, strlen (s));
   int i = strlen (s);
   write (2, s, i);
   return 0;
@@ -199,8 +209,6 @@ fputs (char const* s, int fd)
 int
 puts (char const* s)
 {
-  //write (STDOUT, s, strlen (s));
-  //int i = write (STDOUT, s, strlen (s));
   int i = strlen (s);
   write (1, s, i);
   return 0;
@@ -323,6 +331,7 @@ realloc (int *p, int size)
    assert_fail
    ungetc
    putchar
+   putc
    eputs
    fputs
    puts
diff --git a/module/mes/read-0-32.mo b/module/mes/read-0-32.mo
new file mode 100644 (file)
index 0000000..5ddf8c2
Binary files /dev/null and b/module/mes/read-0-32.mo differ
index 1b2cef475e91d58efdb8dfe73c980f84cb28e9aa..8cf185a5ddd01b4f7aa9db67c11bf5a1a1c48109 100644 (file)
 
   (set! sexp:define
         (lambda (e a)
-          (if (atom? (cadr e)) (cons (cadr e) (core:eval (car (cddr e)) a))
-              (cons (car (cadr e)) (core:eval (cons (quote lambda) (cons (cdr (cadr e)) (cddr e))) a)))))
+          (if (atom? (car (cdr e))) (cons (car (cdr e)) (core:eval (car (cdr (cdr e))) a))
+              (cons (car (car (cdr e))) (core:eval (cons (quote lambda) (cons (cdr (car (cdr e))) (cdr (cdr e)))) a)))))
 
   (set! env:macro
         (lambda (name+entry)
           (cons
            (cons (car name+entry)
-                 (make-cell <cell:macro> (core:car (car name+entry)) (cdr name+entry)))
+                 (core:make-cell <cell:macro> (core:car (car name+entry)) (cdr name+entry)))
            (list))))
 
   (set! cons*
   (define <cell:keyword> 4)
   (define <cell:string> 10)
 
-  (define (newline . rest) (core:stderr (list->string (list (integer->char 10)))))
-  (define (display x . rest) (core:stderr x))
+  (define (newline . rest) (core:display (list->string (list (integer->char 10)))))
+  (define (display x . rest) core:display)
   
-  (define (list->symbol lst) (make-symbol lst))
+  (define (list->symbol lst) (core:lookup-symbol lst))
 
   (define (symbol->list s)
     (core:car s))
 
   (define (list->string lst)
-    (make-cell <cell:string> lst 0))
+    (core:make-cell <cell:string> lst 0))
 
   (define (integer->char x)
-    (make-cell <cell:character> 0 x))
+    (core:make-cell <cell:character> 0 x))
 
   (define (symbol->keyword s)
-    (make-cell <cell:keyword> (symbol->list s) 0))
+    (core:make-cell <cell:keyword> (symbol->list s) 0))
 
   (define (read)
     (read-word (read-byte) (list) (current-module)))
   (define-macro (cond . clauses)
     (list (quote if) (pair? clauses)
           (list (quote if) (car (car clauses))
-                (if (pair? (cdar clauses))
-                    (if (eq? (car (cdar clauses)) (quote =>))
-                        (append2 (cdr (cdar clauses)) (list (caar clauses)))
+                (if (pair? (cdr (car clauses)))
+                    (if (eq? (car (cdr (car clauses))) (quote =>))
+                        (append2 (cdr (cdr (car clauses))) (list (car (car clauses))))
                         (list (cons (quote lambda) (cons (list) (car clauses)))))
                     (list (cons (quote lambda) (cons (list) (car clauses)))))
                 (if (pair? (cdr clauses))
         (cons (f (car lst)) (map1 f (cdr lst)))))
 
   (define (lookup w a)
-    (core:lookup (map1 integer->char w) a))
+    (define (lookup-number c p s n)
+      (and (> c 47) (< c 58)
+           (if (null? p) (* s (+ (* n 10) (- c 48)))
+               (lookup-number (car p) (cdr p) s (+ (* n 10) (- c 48))))))
+    ((lambda (c p)
+       (or (cond ((and (> c 47) (< c 58)) (lookup-number c p 1 0))
+                 ((and (eq? c 45) (pair? p)) (lookup-number (car p) (cdr p) -1 0))
+                 (#t #f))
+           (core:lookup-symbol (map1 integer->char w))))
+     (car w) (cdr w)))
 
   (define (read-hash c w a)
     (cond
index 9ed66256fe2ea0ac07bbfdaf36108bb2cabbf317..af2f3e1eb0f9589bd82bab254ae6503f2146ae5f 100644 (file)
 \f
 ;;; core: accessors
 (define (string . lst)
-  (make-cell <cell:string> lst 0))
+  (core:make-cell <cell:string> lst 0))
 
 (define (string->list s)
   (core:car s))
 
 (define (string->symbol s)
   (if (not (pair? (core:car s))) '()
-      (make-symbol (core:car s))))
+      (core:lookup-symbol (core:car s))))
 
 (define (symbol->list s)
   (core:car s))
   (apply string (apply append (map1 string->list rest))))
 
 (define (integer->char x)
-  (make-cell <cell:character> 0 x))
+  (core:make-cell <cell:character> 0 x))
 
 (define (char->integer x)
-  (make-cell <cell:number> 0 x))
+  (core:make-cell <cell:number> 0 x))
diff --git a/posix.c b/posix.c
index 045eb1c41f72c66a4884857d58d7415006b4f33b..924b5a69b2a0f125f9bd1b001bb39ae1d01a11d0 100644 (file)
--- a/posix.c
+++ b/posix.c
@@ -97,139 +97,6 @@ string_to_cstring (SCM s)
   return buf;
 }
 
-int g_depth;
-
-SCM
-display_helper (SCM x, int cont, char* sep)
-{
-  gputs (sep);
-  if (g_depth == 0) return cell_unspecified;
-  //FIXME:
-  //g_depth--;
-  g_depth = g_depth - 1;
-  
-  // eputs ("<display>\n");
-  switch (TYPE (x))
-    {
-    case TCHAR:
-      {
-        //gputs ("<char>\n");
-        gputs ("#\\");
-        putchar (VALUE (x));
-        break;
-      }
-    case TFUNCTION:
-      {
-        gputs ("#<procedure ");
-        ///gputs (FUNCTION (x).name ? FUNCTION (x).name : "?");
-        char *p = "?";
-        if (FUNCTION (x).name != 0)
-          p = FUNCTION (x).name;
-        gputs (p);
-        gputs ("[");
-        gputs (itoa (CDR (x)));
-        gputs (",");
-        gputs (itoa (x));
-        gputs ("]>");
-        break;
-      }
-    case TMACRO:
-      {
-        gputs ("#<macro ");
-        display_helper (cdr (x), cont, "");
-        gputs (">");
-        break;
-      }
-    case TNUMBER:
-      {
-        //gputs ("<number>\n");
-        gputs (itoa (VALUE (x)));
-        break;
-      }
-    case TPAIR:
-      {
-        if (!cont) gputs ("(");
-        if (x && x != cell_nil) display_ (CAR (x));
-        if (CDR (x) && TYPE (CDR (x)) == TPAIR)
-          display_helper (CDR (x), 1, " ");
-        else if (CDR (x) && CDR (x) != cell_nil)
-          {
-            if (TYPE (CDR (x)) != TPAIR)
-              gputs (" . ");
-            display_ (CDR (x));
-          }
-        if (!cont) gputs (")");
-        break;
-      }
-    case TSPECIAL:
-#if __NYACC__
-      // FIXME
-      //{}
-      {
-        SCM t = CAR (x);
-        while (t && t != cell_nil)
-          {
-            putchar (VALUE (CAR (t)));
-            t = CDR (t);
-          }
-        break;
-      }
-#endif
-    case TSTRING:
-#if __NYACC__
-      // FIXME
-      {}
-#endif
-    case TSYMBOL:
-      {
-        SCM t = CAR (x);
-        while (t && t != cell_nil)
-          {
-            putchar (VALUE (CAR (t)));
-            t = CDR (t);
-          }
-        break;
-      }
-    default:
-      {
-        //gputs ("<default>\n");
-        gputs ("<");
-        gputs (itoa (TYPE (x)));
-        gputs (":");
-        gputs (itoa (x));
-        gputs (">");
-        break;
-      }
-    }
-  return 0;
-}
-
-SCM
-display_ (SCM x)
-{
-  g_depth = 5;
-  return display_helper (x, 0, "");
-}
-
-SCM
-stderr_ (SCM x)
-{
-  SCM write;
-  if (TYPE (x) == TSTRING)
-    eputs (string_to_cstring (x));
-#if __GNUC__
-  else if ((write = assq_ref_env (cell_symbol_write, r0)) != cell_undefined)
-    apply (assq_ref_env (cell_symbol_display, r0), cons (x, cons (MAKE_NUMBER (2), cell_nil)), r0);
-#endif
-  else if (TYPE (x) == TSPECIAL || TYPE (x) == TSTRING || TYPE (x) == TSYMBOL)
-    eputs (string_to_cstring (x));
-  else if (TYPE (x) == TNUMBER)
-    eputs (itoa (VALUE (x)));
-  else
-    eputs ("core:stderr: display undefined\n");
-  return cell_unspecified;
-}
-
 SCM
 getenv_ (SCM s) ///((name . "getenv"))
 {
index 842f3f6bdf3536a2d2589650261843648553f12a..ee09e365f478740d3d7c1c3f6e02b5d8412371b2 100644 (file)
--- a/reader.c
+++ b/reader.c
@@ -1,6 +1,6 @@
 /* -*-comment-start: "//";comment-end:""-*-
  * Mes --- Maxwell Equations of Software
- * Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
+ * Copyright © 2016,2017 Jan Nieuwenhuizen <janneke@gnu.org>
  *
  * This file is part of Mes.
  *
  * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+SCM
+___end_of_mes___ ()
+{
+  return 0;
+}
 
 SCM
 read_input_file_env_ (SCM e, SCM a)
@@ -86,26 +91,24 @@ read_env (SCM a)
   return read_word (getchar (), cell_nil, a);
 }
 
-//MINI_MES
-// SCM
-// lookup_ (SCM s, SCM a)
-// {
-//   if (isdigit (VALUE (car (s))) || (VALUE (car (s)) == '-' && cdr (s) != cell_nil)) {
-//     SCM p = s;
-//     int sign = 1;
-//     if (VALUE (car (s)) == '-') {
-//       sign = -1;
-//       p = cdr (s);
-//     }
-//     int n = 0;
-//     while (p != cell_nil && isdigit (VALUE (car (p)))) {
-//       n *= 10;
-//       n += VALUE (car (p)) - '0';
-//       p = cdr (p);
-//     }
-//     if (p == cell_nil) return MAKE_NUMBER (n * sign);
-//   }
+SCM
+lookup_ (SCM s, SCM a)
+{
+  if (isdigit (VALUE (car (s))) || (VALUE (car (s)) == '-' && cdr (s) != cell_nil)) {
+    SCM p = s;
+    int sign = 1;
+    if (VALUE (car (s)) == '-') {
+      sign = -1;
+      p = cdr (s);
+    }
+    int n = 0;
+    while (p != cell_nil && isdigit (VALUE (car (p)))) {
+      n *= 10;
+      n += VALUE (car (p)) - '0';
+      p = cdr (p);
+    }
+    if (p == cell_nil) return MAKE_NUMBER (n * sign);
+  }
 
-//   SCM x = lookup_symbol_ (s);
-//   return x ? x : make_symbol_ (s);
-// }
+  return lookup_symbol_ (s);
+}
index 94d21ece09b0713b29a109a3ada13a9bb55fede7..5c3d6d769d95af0e74d56f85a05a2b04a074d7a7 100644 (file)
 #define MES_MINI 1
 #define FIXED_PRIMITIVES 0
 
-#if __GNUC__
-#define FIXME_NYACC 1
-#define  __NYACC__ 0
-#define NYACC_CAR
-#define NYACC_CDR
-#else
-#define  __NYACC__ 1
-#define NYACC_CAR nyacc_car
-#define NYACC_CDR nyacc_cdr
-#endif
-
 char arena[2000];
 //char buf0[400];
 
@@ -59,11 +48,7 @@ SCM r2 = 0;
 // continuation
 SCM r3 = 0;
 
-#if __NYACC__ || FIXME_NYACC
-enum type_t {CHAR, CLOSURE, CONTINUATION, TFUNCTION, KEYWORD, MACRO, NUMBER, PAIR, REF, SPECIAL, TSTRING, SYMBOL, VALUES, TVECTOR, BROKEN_HEART};
-#else
-enum type_t {CHAR, CLOSURE, CONTINUATION, FUNCTION, KEYWORD, MACRO, NUMBER, PAIR, REF, SPECIAL, STRING, SYMBOL, VALUES, VECTOR, BROKEN_HEART};
-#endif
+enum type_t {CHAR, CLOSURE, CONTINUATION, TFUNCTION, KEYWORD, MACRO, NUMBER, PAIR, REF, SPECIAL, STRING, SYMBOL, VALUES, VECTOR, BROKEN_HEART};
 
 struct scm {
   enum type_t type;
@@ -117,11 +102,11 @@ struct function g_functions[5];
 int g_function = 0;
 
 
-SCM make_cell (SCM type, SCM car, SCM cdr);
-struct function fun_make_cell = {&make_cell,3,"make-cell"};
-struct scm scm_make_cell = {TFUNCTION,0,0};
-   //, "make-cell", 0};
-SCM cell_make_cell;
+SCM make_cell_ (SCM type, SCM car, SCM cdr);
+struct function fun_make_cell_ = {&make_cell_,3,"core:make-cell"};
+struct scm scm_make_cell_ = {TFUNCTION,0,0};
+   //, "core:make-cell", 0};
+SCM cell_make_cell_;
 
 SCM cons (SCM x, SCM y);
 struct function fun_cons = {&cons,2,"cons"};
@@ -153,38 +138,21 @@ SCM cell_cdr;
 #define STRING(x) g_cells[x].car
 
 #define CDR(x) g_cells[x].cdr
-#if __GNUC__
-//#define CLOSURE(x) g_cells[x].closure
-#endif
 #define CONTINUATION(x) g_cells[x].cdr
-#if __GNUC__
-//#define FUNCTION(x) g_functions[g_cells[x].function]
-#endif
 
 #define FUNCTION(x) g_functions[g_cells[x].cdr]
 #define VALUE(x) g_cells[x].cdr
 #define VECTOR(x) g_cells[x].cdr
 
-#define MAKE_CHAR(n) make_cell (tmp_num_ (CHAR), 0, tmp_num2_ (n))
-//#define MAKE_CONTINUATION(n) make_cell (tmp_num_ (CONTINUATION), n, g_stack)
-#define MAKE_NUMBER(n) make_cell (tmp_num_ (NUMBER), 0, tmp_num2_ (n))
-//#define MAKE_REF(n) make_cell (tmp_num_ (REF), n, 0)
-
+#define MAKE_CHAR(n) make_cell_ (tmp_num_ (CHAR), 0, tmp_num2_ (n))
+#define MAKE_NUMBER(n) make_cell_ (tmp_num_ (NUMBER), 0, tmp_num2_ (n))
 
 #define CAAR(x) CAR (CAR (x))
-// #define CDAR(x) CDR (CAR (x))
 #define CADAR(x) CAR (CDR (CAR (x)))
-// #define CADDR(x) CAR (CDR (CDR (x)))
-// #define CDDDR(x) CDR (CDR (CDR (x)))
 #define CDADAR(x) CAR (CDR (CAR (CDR (x))))
 #define CADR(x) CAR (CDR (x))
 
-
-#if __NYACC__ || FIXME_NYACC
-#define MAKE_STRING(x) make_cell (tmp_num_ (TSTRING), x, 0)
-// #else
-// #define MAKE_STRING(x) make_cell (tmp_num_ (STRING), x, 0)
-#endif
+#define MAKE_STRING(x) make_cell_ (tmp_num_ (TSTRING), x, 0)
 
 SCM
 alloc (int n)
@@ -196,7 +164,7 @@ alloc (int n)
 }
 
 SCM
-make_cell (SCM type, SCM car, SCM cdr)
+make_cell_ (SCM type, SCM car, SCM cdr)
 {
   SCM x = alloc (1);
   assert (TYPE (type) == NUMBER);
@@ -239,7 +207,7 @@ cons (SCM x, SCM y)
   puts ("\n");
 #endif
   VALUE (tmp_num) = PAIR;
-  return make_cell (tmp_num, x, y);
+  return make_cell_ (tmp_num, x, y);
 }
 
 SCM
@@ -464,7 +432,7 @@ SCM
 make_symbol_ (SCM s)
 {
   VALUE (tmp_num) = SYMBOL;
-  SCM x = make_cell (tmp_num, s, 0);
+  SCM x = make_cell_ (tmp_num, s, 0);
   g_symbols = cons (x, g_symbols);
   return x;
 }
@@ -584,7 +552,7 @@ g_free++;
 SCM
 make_closure (SCM args, SCM body, SCM a)
 {
-  return make_cell (tmp_num_ (CLOSURE), cell_f, cons (cons (cell_circular, a), cons (args, body)));
+  return make_cell_ (tmp_num_ (CLOSURE), cell_f, cons (cons (cell_circular, a), cons (args, body)));
 }
 
 SCM
@@ -614,10 +582,10 @@ mes_builtins (SCM a)
 // #include "posix.environment.i"
 // #include "reader.environment.i"
 #else
-scm_make_cell.cdr = g_function;
-g_functions[g_function++] = fun_make_cell;
-cell_make_cell = g_free++;
- g_cells[cell_make_cell] = scm_make_cell;
+scm_make_cell_.cdr = g_function;
+g_functions[g_function++] = fun_make_cell_;
+cell_make_cell_ = g_free++;
+ g_cells[cell_make_cell_] = scm_make_cell_;
  
 scm_cons.cdr = g_function;
 g_functions[g_function++] = fun_cons;
@@ -687,7 +655,7 @@ fill ()
 
   TYPE (11) = TFUNCTION;
   CAR (11) = 0x58585858;
-  // 0 = make_cell
+  // 0 = make_cell_
   // 1 = cons
   // 2 = car
   CDR (11) = 1;
@@ -729,7 +697,7 @@ display_ (SCM x)
       {
         //puts ("<function>\n");
         if (VALUE (x) == 0)
-          puts ("make-cell");
+          puts ("core:make-cell");
         if (VALUE (x) == 1)
           puts ("cons");
         if (VALUE (x) == 2)
@@ -934,49 +902,6 @@ simple_bload_env (SCM a) ///((internal))
   return r2;
 }
 
-char string_to_cstring_buf[1024];
-char const*
-string_to_cstring (SCM s)
-{
-  //static char buf[1024];
-  //char *p = buf;
-  char *p = string_to_cstring_buf;
-  s = STRING(s);
-  while (s != cell_nil)
-    {
-      *p++ = VALUE (car (s));
-      s = cdr (s);
-    }
-  *p = 0;
-  //return buf;
-  return string_to_cstring_buf;
-}
-
-SCM
-stderr_ (SCM x)
-{
-  //SCM write;
-#if __NYACC__ || FIXME_NYACC
-  if (TYPE (x) == TSTRING)
-// #else
-//   if (TYPE (x) == STRING)
-#endif
-    eputs (string_to_cstring (x));
-  // else if ((write = assq_ref_env (cell_symbol_write, r0)) != cell_undefined)
-  //   apply (assq_ref_env (cell_symbol_display, r0), cons (x, cons (MAKE_NUMBER (2), cell_nil)), r0);
-#if __NYACC__ || FIXME_NYACC
-  else if (TYPE (x) == SPECIAL || TYPE (x) == TSTRING || TYPE (x) == SYMBOL)
-// #else
-//   else if (TYPE (x) == SPECIAL || TYPE (x) == STRING || TYPE (x) == SYMBOL)
-#endif
-    eputs (string_to_cstring (x));
-  else if (TYPE (x) == NUMBER)
-    eputs (itoa (VALUE (x)));
-  else
-    eputs ("display: undefined\n");
-  return cell_unspecified;
-}
-
 int
 main (int argc, char *argv[])
 {
index d0be018a02ec610f78eb19e45b70d980a4dc3d48..6304c0ea412b343adebb6b893879411e459cb3e1 100644 (file)
 
 #define MES_MINI 1
 
-#if __GNUC__
-#define  __NYACC__ 0
-#define NYACC
-#define NYACC2
-#else
-#define  __NYACC__ 1
-#define NYACC nyacc
-#define NYACC2 nyacc2
-#endif
-
 typedef int SCM;
 
 #if __GNUC__
@@ -91,7 +81,6 @@ main (int argc, char *argv[])
   push_cc (r2, cell_unspecified, r0, cell_unspecified);
   r3 = cell_vm_begin;
   r1 = eval_apply ();
-  stderr_ (r1);
 
   eputs ("\n");
   gc (g_stack);
index 8ab0a706326c81a112acf5c2f86a21a20cbc4743..d3b85db23a2a3bb6e21b56e622cd9460da69a7f5 100644 (file)
 #endif
 #define assert(x) ((x) ? (void)0 : assert_fail (#x))
 
-#if __MESC__
-//void *g_malloc_base = 0;
-char *g_malloc_base = 0;
-// int ungetc_char = -1;
-// char ungetc_buf[2];
-#endif
-
 #define MES_MINI 1
 #define FIXED_PRIMITIVES 1
 
-#if __GNUC__
-#define FIXME_NYACC 1
-#define  __NYACC__ 0
-#define NYACC_CAR
-#define NYACC_CDR
-#else
-#define  __NYACC__ 1
-#define NYACC_CAR nyacc_car
-#define NYACC_CDR nyacc_cdr
-#endif
-
-
 //int ARENA_SIZE = 4000000;
 int ARENA_SIZE = 1000000000;
 char *arena = 0;
@@ -80,17 +61,15 @@ struct function {
   char *name;
 };
 
-//struct scm *g_cells = arena;
-int *foobar = 0;
 #if __GNUC__
-struct scm *g_cells;
+struct scm *g_cells = 0;
+//struct scm *g_news = 0;
 #else
+int *foobar = 0;
 struct scm *g_cells = foobar;
+//struct scm *g_news = foobar;
 #endif
 
-//FIXME
-//struct scm *g_news = 0;
-
 struct scm scm_nil = {TSPECIAL, "()",0};
 struct scm scm_f = {TSPECIAL, "#f",0};
 struct scm scm_t = {TSPECIAL, "#t",0};
@@ -201,29 +180,24 @@ int g_function = 0;
 #define VALUE(x) g_cells[x].cdr
 #define VECTOR(x) g_cells[x].cdr
 
-#define MAKE_CHAR(n) make_cell (tmp_num_ (TCHAR), 0, tmp_num2_ (n))
-#define MAKE_CONTINUATION(n) make_cell (tmp_num_ (TCONTINUATION), n, g_stack)
-#define MAKE_NUMBER(n) make_cell (tmp_num_ (TNUMBER), 0, tmp_num2_ (n))
-//#define MAKE_REF(n) make_cell (tmp_num_ (REF), n, 0)
-
+#define MAKE_CHAR(n) make_cell_ (tmp_num_ (TCHAR), 0, tmp_num2_ (n))
+#define MAKE_CONTINUATION(n) make_cell_ (tmp_num_ (TCONTINUATION), n, g_stack)
+#define MAKE_NUMBER(n) make_cell_ (tmp_num_ (TNUMBER), 0, tmp_num2_ (n))
 
 #define CAAR(x) CAR (CAR (x))
+#define CADR(x) CAR (CDR (x))
 #define CDAR(x) CDR (CAR (x))
+#define CDDR(x) CDR (CDR (x))
 #define CADAR(x) CAR (CDR (CAR (x)))
 #define CADDR(x) CAR (CDR (CDR (x)))
-// #define CDDDR(x) CDR (CDR (CDR (x)))
 #define CDADAR(x) CAR (CDR (CAR (CDR (x))))
-#define CADR(x) CAR (CDR (x))
 
-#define MAKE_STRING(x) make_cell (tmp_num_ (TSTRING), x, 0)
+#define MAKE_STRING(x) make_cell_ (tmp_num_ (TSTRING), x, 0)
 
 SCM
 alloc (int n)
 {
-#if 1
-  //__GNUC__
   assert (g_free + n < ARENA_SIZE);
-#endif
   SCM x = g_free;
   g_free += n;
   return x;
@@ -232,7 +206,21 @@ alloc (int n)
 #define DEBUG 0
 
 SCM
-make_cell (SCM type, SCM car, SCM cdr)
+tmp_num_ (int x)
+{
+  VALUE (tmp_num) = x;
+  return tmp_num;
+}
+
+SCM
+tmp_num2_ (int x)
+{
+  VALUE (tmp_num2) = x;
+  return tmp_num2;
+}
+
+SCM
+make_cell_ (SCM type, SCM car, SCM cdr)
 {
   SCM x = alloc (1);
 #if __GNUC__
@@ -254,25 +242,84 @@ make_cell (SCM type, SCM car, SCM cdr)
   return x;
 }
 
+
 SCM
-tmp_num_ (int x)
+make_symbol_ (SCM s) ///((internal))
 {
-  VALUE (tmp_num) = x;
-  return tmp_num;
+  VALUE (tmp_num) = TSYMBOL;
+  SCM x = make_cell_ (tmp_num, s, 0);
+  g_symbols = cons (x, g_symbols);
+  return x;
 }
 
 SCM
-tmp_num2_ (int x)
+lookup_symbol_ (SCM s)
 {
-  VALUE (tmp_num2) = x;
-  return tmp_num2;
+  SCM x = g_symbols;
+  while (x) {
+    //if (list_of_char_equal_p (STRING (car (x)), s) == cell_t) break;
+    if (list_of_char_equal_p (STRING (car (x)), s) == cell_t) goto dun;
+    x = cdr (x);
+  }
+ dun:
+  if (x) x = car (x);
+  if (!x) x = make_symbol_ (s);
+  return x;
+}
+
+SCM
+list_of_char_equal_p (SCM a, SCM b) ///((internal))
+{
+  while (a != cell_nil && b != cell_nil && VALUE (car (a)) == VALUE (car (b))) {
+#if __GNUC__
+    assert (TYPE (car (a)) == TCHAR);
+    assert (TYPE (car (b)) == TCHAR);
+#endif
+    a = cdr (a);
+    b = cdr (b);
+  }
+  return (a == cell_nil && b == cell_nil) ? cell_t : cell_f;
+}
+
+SCM
+type_ (SCM x)
+{
+  return MAKE_NUMBER (TYPE (x));
+}
+
+SCM
+car_ (SCM x)
+{
+  return (TYPE (x) != TCONTINUATION
+          && (TYPE (CAR (x)) == TPAIR // FIXME: this is weird
+              || TYPE (CAR (x)) == TREF
+              || TYPE (CAR (x)) == TSPECIAL
+              || TYPE (CAR (x)) == TSYMBOL
+              || TYPE (CAR (x)) == TSTRING)) ? CAR (x) : MAKE_NUMBER (CAR (x));
+}
+
+SCM
+cdr_ (SCM x)
+{
+  return (TYPE (CDR (x)) == TPAIR
+          || TYPE (CDR (x)) == TREF
+          || TYPE (CAR (x)) == TSPECIAL
+          || TYPE (CDR (x)) == TSYMBOL
+          || TYPE (CDR (x)) == TSTRING) ? CDR (x) : MAKE_NUMBER (CDR (x));
+}
+
+SCM
+arity_ (SCM x)
+{
+  assert (TYPE (x) == TFUNCTION);
+  return MAKE_NUMBER (FUNCTION (x).arity);
 }
 
 SCM
 cons (SCM x, SCM y)
 {
   VALUE (tmp_num) = TPAIR;
-  return make_cell (tmp_num, x, y);
+  return make_cell_ (tmp_num, x, y);
 }
 
 SCM
@@ -325,30 +372,17 @@ eq_p (SCM x, SCM y)
 }
 
 SCM
-type_ (SCM x)
-{
-  return MAKE_NUMBER (TYPE (x));
-}
-
-SCM
-car_ (SCM x)
+values (SCM x) ///((arity . n))
 {
-  return (TYPE (x) != TCONTINUATION
-          && (TYPE (CAR (x)) == TPAIR // FIXME: this is weird
-              || TYPE (CAR (x)) == TREF
-              || TYPE (CAR (x)) == TSPECIAL
-              || TYPE (CAR (x)) == TSYMBOL
-              || TYPE (CAR (x)) == TSTRING)) ? CAR (x) : MAKE_NUMBER (CAR (x));
+  SCM v = cons (0, x);
+  TYPE (v) = TVALUES;
+  return v;
 }
 
 SCM
-cdr_ (SCM x)
+acons (SCM key, SCM value, SCM alist)
 {
-  return (TYPE (CDR (x)) == TPAIR
-          || TYPE (CDR (x)) == TREF
-          || TYPE (CAR (x)) == TSPECIAL
-          || TYPE (CDR (x)) == TSYMBOL
-          || TYPE (CDR (x)) == TSTRING) ? CDR (x) : MAKE_NUMBER (CDR (x));
+  return cons (cons (key, value), alist);
 }
 
 SCM
@@ -370,7 +404,9 @@ error (SCM key, SCM x)
   SCM throw;
   if ((throw = assq_ref_env (cell_symbol_throw, r0)) != cell_undefined)
     return apply (throw, cons (key, cons (x, cell_nil)), r0);
-  eputs ("error");
+  display_ (key);
+  puts (": ");
+  display_ (x);
   assert (0);
 }
 
@@ -380,7 +416,7 @@ assert_defined (SCM x, SCM e) ///((internal))
   if (e != cell_undefined) return e;
   // error (cell_symbol_unbound_variable, x);
   eputs ("unbound variable: ");
-  display_ (x);
+  display_error_ (x);
   eputs ("\n");
   exit (33);
   return e;
@@ -416,7 +452,7 @@ check_formals (SCM f, SCM formals, SCM args) ///((internal))
       eputs (", got: ");
       eputs (itoa (alen));
       eputs ("\n");
-      display_ (f);
+      display_error_ (f);
       SCM e = MAKE_STRING (cstring_to_list (buf));
       return error (cell_symbol_wrong_number_of_args, cons (e, f));
     }
@@ -443,12 +479,12 @@ check_apply (SCM f, SCM e) ///((internal))
       char buf = "TODO:check_apply";
       // sprintf (buf, "cannot apply: %s:", type);
       // fprintf (stderr, " [");
-      // stderr_ (e);
+      // display_error_ (e);
       // fprintf (stderr, "]\n");
       eputs ("cannot apply: ");
       eputs (type);
       eputs ("[");
-      display_ (e);
+      display_error_ (e);
       eputs ("]\n");
       SCM e = MAKE_STRING (cstring_to_list (buf));
       return error (cell_symbol_wrong_type_arg, cons (e, f));
@@ -504,18 +540,12 @@ call (SCM fn, SCM x)
   if ((FUNCTION (fn).arity > 1 || FUNCTION (fn).arity == -1)
       && x != cell_nil && TYPE (CDR (x)) == TPAIR && TYPE (CADR (x)) == TVALUES)
     x = cons (CAR (x), cons (CDADAR (x), CDR (x)));
-#if 0
-  eputs ("call: ");
-  if (FUNCTION (fn).name) eputs (FUNCTION (fn).name);
-  else eputs (itoa (CDR (fn)));
-  eputs ("\n");
-#endif
   switch (FUNCTION (fn).arity)
     {
     case 0: {return (FUNCTION (fn).function) ();}
-    case 1: {return ((SCM(*)(SCM))(FUNCTION (fn).function)) (car (x));}
-    case 2: {return ((SCM(*)(SCM,SCM))(FUNCTION (fn).function)) (car (x), cadr (x));}
-    case 3: {return ((SCM(*)(SCM,SCM,SCM))(FUNCTION (fn).function)) (car (x), cadr (x), car (cddr (x)));}
+    case 1: {return ((SCM(*)(SCM))(FUNCTION (fn).function)) (CAR (x));}
+    case 2: {return ((SCM(*)(SCM,SCM))(FUNCTION (fn).function)) (CAR (x), CADR (x));}
+    case 3: {return ((SCM(*)(SCM,SCM,SCM))(FUNCTION (fn).function)) (CAR (x), CADR (x), car (CDDR (x)));}
     case -1: {return ((SCM(*)(SCM))(FUNCTION (fn).function)) (x);}
     default: {return ((SCM(*)(SCM))(FUNCTION (fn).function)) (x);}
     }
@@ -577,29 +607,17 @@ call_lambda (SCM e, SCM x, SCM aa, SCM a) ///((internal))
 }
 
 SCM
-make_closure (SCM args, SCM body, SCM a)
+make_closure_ (SCM args, SCM body, SCM a) ///((internal))
 {
-  return make_cell (tmp_num_ (TCLOSURE), cell_f, cons (cons (cell_circular, a), cons (args, body)));
+  return make_cell_ (tmp_num_ (TCLOSURE), cell_f, cons (cons (cell_circular, a), cons (args, body)));
 }
 
 SCM
-lookup_macro (SCM x, SCM a)
+lookup_macro_ (SCM x, SCM a) ///((internal))
 {
   if (TYPE (x) != TSYMBOL) return cell_f;
   SCM m = assq_ref_env (x, a);
-#if 0
-  if (TYPE (m) == TMACRO)
-    {
-      fputs ("XXmacro: ", 1);
-      fputs ("[", 1);
-      fputs (itoa (m), 1);
-      fputs ("]: ", 1);
-      display_ (m);
-      fputs ("\n", 1);
-
-    }
-#endif
-  if (TYPE (m) == TMACRO) return MACRO (m);
+ if (TYPE (m) == TMACRO) return MACRO (m);
   return cell_f;
 }
 
@@ -616,11 +634,6 @@ push_cc (SCM p1, SCM p2, SCM a, SCM c) ///((internal))
   return cell_unspecified;
 }
 
-SCM caar (SCM x) {return car (car (x));}
-SCM cadr (SCM x) {return car (cdr (x));}
-SCM cdar (SCM x) {return cdr (car (x));}
-SCM cddr (SCM x) {return cdr (cdr (x));}
-
 SCM gc_pop_frame (); //((internal))
 
 SCM
@@ -684,13 +697,13 @@ eval_apply ()
     }
     case TCLOSURE:
       {
-        SCM cl = CLOSURE (car (r1));
-        SCM formals = cadr (cl);
-        SCM body = cddr (cl);
-        SCM aa = cdar (cl);
-        aa = cdr (aa);
-        check_formals (car (r1), formals, cdr (r1));
-        SCM p = pairlis (formals, cdr (r1), aa);
+        SCM cl = CLOSURE (CAR (r1));
+        SCM formals = CADR (cl);
+        SCM body = CDDR (cl);
+        SCM aa = CDAR (cl);
+        aa = CDR (aa);
+        check_formals (CAR (r1), formals, CDR (r1));
+        SCM p = pairlis (formals, CDR (r1), aa);
         call_lambda (body, p, aa, r0);
         goto begin;
       }
@@ -699,7 +712,7 @@ eval_apply ()
           x = r1;
           g_stack = CONTINUATION (CAR (r1));
           gc_pop_frame ();
-          r1 = cadr (x);
+          r1 = CADR (x);
           goto eval_apply;
         }
     case TSPECIAL:
@@ -740,12 +753,12 @@ eval_apply ()
       }
     case TPAIR:
       {
-        switch (caar (r1))
+        switch (CAAR (r1))
           {
           case cell_symbol_lambda:
             {
-              SCM formals = cadr (car (r1));
-              SCM body = cddr (car (r1));
+              SCM formals = CADR (car (r1));
+              SCM body = CDDR (car (r1));
               SCM p = pairlis (formals, cdr (r1), r0);
               check_formals (r1, formals, cdr (r1));
               call_lambda (body, p, p, r0);
@@ -799,27 +812,27 @@ eval_apply ()
 #endif // FIXED_PRIMITIVES
           case cell_symbol_quote:
             {
-              x = r1; gc_pop_frame (); r1 = cadr (x); goto eval_apply;
+              x = r1; gc_pop_frame (); r1 = CADR (x); goto eval_apply;
             }
           case cell_symbol_begin: goto begin;
           case cell_symbol_lambda:
             {
-              r1 = make_closure (cadr (r1), cddr (r1), assq (cell_closure, r0));
+              r1 = make_closure_ (CADR (r1), CDDR (r1), assq (cell_closure, r0));
               goto vm_return;
             }
           case cell_symbol_if: {r1=cdr (r1); goto vm_if;}
           case cell_symbol_set_x:
             {
-              push_cc (car (cddr (r1)), r1, r0, cell_vm_eval_set_x);
+              push_cc (car (CDDR (r1)), r1, r0, cell_vm_eval_set_x);
               goto eval;
             eval_set_x:
               x = r2;
-              r1 = set_env_x (cadr (x), r1, r0);
+              r1 = set_env_x (CADR (x), r1, r0);
               goto vm_return;
             }
           case cell_vm_macro_expand:
             {
-              push_cc (cadr (r1), r1, r0, cell_vm_return);
+              push_cc (CADR (r1), r1, r0, cell_vm_return);
               goto macro_expand;
             }
           default: {
@@ -855,17 +868,9 @@ eval_apply ()
   SCM expanders;
  macro_expand:
   if (TYPE (r1) == TPAIR
-      && (macro = lookup_macro (car (r1), r0)) != cell_f)
+      && (macro = lookup_macro_ (car (r1), r0)) != cell_f)
     {
       r1 = cons (macro, CDR (r1));
-#if 0
-      puts ("macro: ");
-      display_ (macro);
-      puts ("\n");
-      puts ("r1: ");
-      display_ (r1);
-      puts ("\n");
-#endif
       goto apply;
     }
   else if (TYPE (r1) == TPAIR
@@ -886,9 +891,9 @@ eval_apply ()
   while (r1 != cell_nil) {
     if (TYPE (r1) == TPAIR && TYPE (CAR (r1)) == TPAIR)
       {
-        if (caar (r1) == cell_symbol_begin)
-          r1 = append2 (cdar (r1), cdr (r1));
-        else if (caar (r1) == cell_symbol_primitive_load)
+        if (CAAR (r1) == cell_symbol_begin)
+          r1 = append2 (CDAR (r1), cdr (r1));
+        else if (CAAR (r1) == cell_symbol_primitive_load)
           {
             push_cc (cons (cell_symbol_read_input_file, cell_nil), r1, r0, cell_vm_begin_read_input_file);
             goto apply;
@@ -899,11 +904,6 @@ eval_apply ()
     if (CDR (r1) == cell_nil)
       {
         r1 = car (r1);
-#if 0
-        puts ("begin: ");
-        display_ (r1);
-        puts ("\n");
-#endif
         goto eval;
       }
     push_cc (CAR (r1), r1, r0, cell_vm_begin2);
@@ -923,12 +923,12 @@ eval_apply ()
   r1 = r2;
   if (x != cell_f)
     {
-      r1 = cadr (r1);
+      r1 = CADR (r1);
       goto eval;
     }
-  if (cddr (r1) != cell_nil)
+  if (CDDR (r1) != cell_nil)
     {
-      r1 = car (cddr (r1));
+      r1 = car (CDDR (r1));
       goto eval;
     }
   r1 = cell_unspecified;
@@ -956,7 +956,7 @@ eval_apply ()
  call_with_values2:
   if (TYPE (r1) == TVALUES)
     r1 = CDR (r1);
-  r1 = cons (cadr (r2), r1);
+  r1 = cons (CADR (r2), r1);
   goto apply;
 
  vm_return:
@@ -969,11 +969,11 @@ eval_apply ()
 SCM
 gc_peek_frame () ///((internal))
 {
-  SCM frame = car (g_stack);
-  r1 = car (frame);
-  r2 = cadr (frame);
-  r3 = car (cddr (frame));
-  r0 = cadr (cddr (frame));
+  SCM frame = CAR (g_stack);
+  r1 = CAR (frame);
+  r2 = CADR (frame);
+  r3 = CAR (CDDR (frame));
+  r0 = CADR (CDDR (frame));
   return frame;
 }
 
@@ -1009,86 +1009,6 @@ make_tmps (struct scm* cells)
   return 0;
 }
 
-SCM
-make_symbol_ (SCM s)
-{
-  VALUE (tmp_num) = TSYMBOL;
-  SCM x = make_cell (tmp_num, s, 0);
-  g_symbols = cons (x, g_symbols);
-  return x;
-}
-
-SCM
-list_of_char_equal_p (SCM a, SCM b)
-{
-  while (a != cell_nil && b != cell_nil && VALUE (car (a)) == VALUE (car (b))) {
-#if __GNUC__
-    assert (TYPE (car (a)) == TCHAR);
-    assert (TYPE (car (b)) == TCHAR);
-#endif
-    a = cdr (a);
-    b = cdr (b);
-  }
-  return (a == cell_nil && b == cell_nil) ? cell_t : cell_f;
-}
-
-SCM
-lookup_symbol_ (SCM s)
-{
-  SCM x = g_symbols;
-  while (x) {
-    //if (list_of_char_equal_p (STRING (car (x)), s) == cell_t) break;
-    if (list_of_char_equal_p (STRING (car (x)), s) == cell_t) goto dun;
-    x = cdr (x);
-  }
- dun:
-  if (x) x = car (x);
-  return x;
-}
-
-SCM
-make_symbol (SCM s)
-{
-  SCM x = lookup_symbol_ (s);
-  return x ? x : make_symbol_ (s);
-}
-
-//MINI_MES reader.c
-SCM
-lookup_ (SCM s, SCM a)
-{
-  if (isdigit (VALUE (car (s))) || (VALUE (car (s)) == '-' && cdr (s) != cell_nil)) {
-    SCM p = s;
-    int sign = 1;
-    if (VALUE (car (s)) == '-') {
-      sign = -1;
-      p = cdr (s);
-    }
-    int n = 0;
-    while (p != cell_nil && isdigit (VALUE (car (p)))) {
-#if __GNUC__
-      //FIXME
-      n *= 10;
-      n += VALUE (car (p)) - '0';
-#else
-      n = n * 10;
-      n = n + VALUE (car (p)) - '0';
-#endif
-      p = cdr (p);
-    }
-    if (p == cell_nil) return MAKE_NUMBER (n * sign);
-  }
-
-  SCM x = lookup_symbol_ (s);
-  return x ? x : make_symbol_ (s);
-}
-
-SCM
-acons (SCM key, SCM value, SCM alist)
-{
-  return cons (cons (key, value), alist);
-}
-
 //\f Posix
 int
 ungetchar (int c)
@@ -1158,148 +1078,6 @@ string_to_cstring (SCM s)
   return string_to_cstring_buf;
 }
 
-int g_depth;
-
-SCM
-display_helper (SCM x, int cont, char* sep)
-{
-  puts (sep);
-  if (g_depth == 0) return cell_unspecified;
-  //FIXME:
-  //g_depth--;
-  g_depth = g_depth - 1;
-  
-  // eputs ("<display>\n");
-  switch (TYPE (x))
-    {
-    case TCHAR:
-      {
-        //puts ("<char>\n");
-        puts ("#\\");
-        putchar (VALUE (x));
-        break;
-      }
-    case TFUNCTION:
-      {
-        puts ("#<procedure ");
-        ///puts (FUNCTION (x).name ? FUNCTION (x).name : "?");
-        char *p = "?";
-        if (FUNCTION (x).name != 0)
-          p = FUNCTION (x).name;
-        puts (p);
-        puts ("[");
-        puts (itoa (CDR (x)));
-        puts (",");
-        puts (itoa (x));
-        puts ("]>");
-        break;
-      }
-    case TMACRO:
-      {
-        puts ("#<macro ");
-        display_helper (cdr (x), cont, "");
-        puts (">");
-        break;
-      }
-    case TNUMBER:
-      {
-        //puts ("<number>\n");
-        puts (itoa (VALUE (x)));
-        break;
-      }
-    case TPAIR:
-      {
-        if (!cont) puts ("(");
-        if (x && x != cell_nil) display_ (CAR (x));
-        if (CDR (x) && TYPE (CDR (x)) == TPAIR)
-          display_helper (CDR (x), 1, " ");
-        else if (CDR (x) && CDR (x) != cell_nil)
-          {
-            if (TYPE (CDR (x)) != TPAIR)
-              puts (" . ");
-            display_ (CDR (x));
-          }
-        if (!cont) puts (")");
-        break;
-      }
-    case TSPECIAL:
-#if __NYACC__
-      // FIXME
-      //{}
-      {
-        SCM t = CAR (x);
-        while (t && t != cell_nil)
-          {
-            putchar (VALUE (CAR (t)));
-            t = CDR (t);
-          }
-        break;
-      }
-#endif
-    case TSTRING:
-#if __NYACC__
-      // FIXME
-      //{}
-      {
-        SCM t = CAR (x);
-        while (t && t != cell_nil)
-          {
-            putchar (VALUE (CAR (t)));
-            t = CDR (t);
-          }
-        break;
-      }
-#endif
-    case TSYMBOL:
-      {
-        SCM t = CAR (x);
-        while (t && t != cell_nil)
-          {
-            putchar (VALUE (CAR (t)));
-            t = CDR (t);
-          }
-        break;
-      }
-    default:
-      {
-        //puts ("<default>\n");
-        puts ("<");
-        puts (itoa (TYPE (x)));
-        puts (":");
-        puts (itoa (x));
-        puts (">");
-        break;
-      }
-    }
-  return 0;
-}
-
-SCM
-display_ (SCM x)
-{
-  g_depth = 5;
-  return display_helper (x, 0, "");
-}
-
-SCM
-stderr_ (SCM x)
-{
-  SCM write;
-  if (TYPE (x) == TSTRING)
-    eputs (string_to_cstring (x));
-#if __GNUC__
-  else if ((write = assq_ref_env (cell_symbol_write, r0)) != cell_undefined)
-    apply (assq_ref_env (cell_symbol_display, r0), cons (x, cons (MAKE_NUMBER (2), cell_nil)), r0);
-#endif
-  else if (TYPE (x) == TSPECIAL || TYPE (x) == TSTRING || TYPE (x) == TSYMBOL)
-    eputs (string_to_cstring (x));
-  else if (TYPE (x) == TNUMBER)
-    eputs (itoa (VALUE (x)));
-  else
-    eputs ("core:stderr: display undefined\n");
-  return cell_unspecified;
-}
-
 SCM
 getenv_ (SCM s) ///((name . "getenv"))
 {
@@ -1513,34 +1291,148 @@ ash (SCM n, SCM count)
 
 //\f Lib [rest of]
 
+int g_depth;
+
 SCM
-exit_ (SCM x) ///((name . "exit"))
+display_helper (SCM x, int cont, char* sep, int fd)
 {
-  assert (TYPE (x) == TNUMBER);
-  exit (VALUE (x));
+  fputs (sep, fd);
+  if (g_depth == 0) return cell_unspecified;
+  g_depth = g_depth - 1;
+  
+  switch (TYPE (x))
+    {
+    case TCHAR:
+      {
+        fputs ("#\\", fd);
+        putc (VALUE (x), fd);
+        break;
+      }
+    case TFUNCTION:
+      {
+        fputs ("#<procedure ", fd);
+        char *p = "?";
+        if (FUNCTION (x).name != 0)
+          p = FUNCTION (x).name;
+        fputs (p, fd);
+        fputs ("[", fd);
+        fputs (itoa (CDR (x)), fd);
+        fputs (",", fd);
+        fputs (itoa (x), fd);
+        fputs ("]>", fd);
+        break;
+      }
+    case TMACRO:
+      {
+        fputs ("#<macro ", fd);
+        display_helper (cdr (x), cont, "", fd);
+        fputs (">", fd);
+        break;
+      }
+    case TNUMBER:
+      {
+        fputs (itoa (VALUE (x)), fd);
+        break;
+      }
+    case TPAIR:
+      {
+        if (!cont) fputs ("(", fd);
+        if (x && x != cell_nil) fdisplay_ (CAR (x), fd);
+        if (CDR (x) && TYPE (CDR (x)) == TPAIR)
+          display_helper (CDR (x), 1, " ", fd);
+        else if (CDR (x) && CDR (x) != cell_nil)
+          {
+            if (TYPE (CDR (x)) != TPAIR)
+              fputs (" . ", fd);
+            fdisplay_ (CDR (x), fd);
+          }
+        if (!cont) fputs (")", fd);
+        break;
+      }
+    case TSPECIAL:
+#if __NYACC__
+      // FIXME
+      //{}
+      {
+        SCM t = CAR (x);
+        while (t && t != cell_nil)
+          {
+            putc (VALUE (CAR (t)), fd);
+            t = CDR (t);
+          }
+        break;
+      }
+#endif
+    case TSTRING:
+#if __NYACC__
+      // FIXME
+      {
+        SCM t = CAR (x);
+        while (t && t != cell_nil)
+          {
+            putc (VALUE (CAR (t)), fd);
+            t = CDR (t);
+          }
+        break;
+      }
+#endif
+    case TSYMBOL:
+      {
+        SCM t = CAR (x);
+        while (t && t != cell_nil)
+          {
+            putc (VALUE (CAR (t)), fd);
+            t = CDR (t);
+          }
+        break;
+      }
+    default:
+      {
+        fputs ("<", fd);
+        fputs (itoa (TYPE (x)), fd);
+        fputs (":", fd);
+        fputs (itoa (x), fd);
+        fputs (">", fd);
+        break;
+      }
+    }
+  return 0;
 }
 
 SCM
-append (SCM x) ///((arity . n))
+display_ (SCM x)
 {
-  if (x == cell_nil) return cell_nil;
-  if (cdr (x) == cell_nil) return car (x);
-  return append2 (car (x), append (cdr (x)));
+  g_depth = 5;
+  return display_helper (x, 0, "", STDOUT);
 }
 
 SCM
-values (SCM x) ///((arity . n))
+display_error_ (SCM x)
 {
-  SCM v = cons (0, x);
-  TYPE (v) = TVALUES;
-  return v;
+  g_depth = 5;
+  return display_helper (x, 0, "", STDERR);
 }
 
 SCM
-arity_ (SCM x)
+fdisplay_ (SCM x, int fd) ///((internal))
 {
-  assert (TYPE (x) == TFUNCTION);
-  return MAKE_NUMBER (FUNCTION (x).arity);
+  g_depth = 5;
+  return display_helper (x, 0, "", fd);
+}
+
+SCM
+exit_ (SCM x) ///((name . "exit"))
+{
+  assert (TYPE (x) == TNUMBER);
+  exit (VALUE (x));
+}
+
+SCM
+append (SCM x) ///((arity . n))
+{
+  if (x == cell_nil) return cell_nil;
+  if (cdr (x) == cell_nil) return car (x);
+  return append2 (car (x), append (cdr (x)));
 }
 
 SCM
index 3498e1c239573b7e89500b8d62845226fe6669a0..23a0a607722956f394051017273048e803ee404f 100644 (file)
@@ -198,7 +198,7 @@ display_ (SCM x)
       {
         //puts ("<function>\n");
         if (VALUE (x) == 0)
-          puts ("make-cell");
+          puts ("core:make-cell");
         if (VALUE (x) == 1)
           puts ("cons");
         if (VALUE (x) == 2)
index fbac8b4645fd59e949656ecd3c0276b771814c47..0a2aa4b7de5a059872a678c4ce95c47e47ae93b9 100755 (executable)
@@ -26,15 +26,15 @@ exit $?
 ;;; You should have received a copy of the GNU General Public License
 ;;; along with Mes.  If not, see <http://www.gnu.org/licenses/>.
 
-(define zero (make-cell 2 0 0))
-(define one (make-cell 2 0 1))
-(define pair (make-cell 3 zero one)) 
-(define zero-list (make-cell 3 zero '()))
+(define zero (core:make-cell 2 0 0))
+(define one (core:make-cell 2 0 1))
+(define pair (core:make-cell 3 zero one)) 
+(define zero-list (core:make-cell 3 zero '()))
 (define v (make-vector 1))
 (display v) (newline)
 (vector-set! v 0 88)
-(define zero-v-list (make-cell 3 v zero-list))
-(define list (make-cell 3 (make-cell 3 zero one) zero-v-list))
+(define zero-v-list (core:make-cell 3 v zero-list))
+(define list (core:make-cell 3 (make-cell 3 zero one) zero-v-list))
 (display "list: ") (display list) (newline)
 (display "v: ") (display v) (newline)
 (gc)
index 6b2da74d59be2f3d7880ac3ebce4f27e254823be..4508d6db03f6236e3eb51a01a92cf3dd489507e4 100755 (executable)
@@ -26,24 +26,24 @@ exit $?
 ;;; You should have received a copy of the GNU General Public License
 ;;; along with Mes.  If not, see <http://www.gnu.org/licenses/>.
 
-(define first (make-cell 0 0 #\F)) (newline)
+(define first (core:make-cell 0 0 #\F)) (newline)
 
-(define one (make-cell 2 0 1))
+(define one (core:make-cell 2 0 1))
 (display "\n one=") (display one) (newline)
-(define two (make-cell 2 0 2))
-(define pair2-nil (make-cell 3 two '()))
+(define two (core:make-cell 2 0 2))
+(define pair2-nil (core:make-cell 3 two '()))
 (display "\npair2-nil=") (display pair2-nil) (newline)
 (gc-show)
 
-(define list1-2 (make-cell 3 one pair2-nil))
+(define list1-2 (core:make-cell 3 one pair2-nil))
 (display "\nlist1-2=") (display list1-2) (newline)
 (gc-show)
 
-(define three (make-cell 2 0 3))
-(define four (make-cell 2 0 4))
-(define pair4-nil (make-cell 3 four '()))
-(define list3-4 (make-cell 3 three pair4-nil))
-(define list1234 (make-cell 3 list1-2 list3-4))
+(define three (core:make-cell 2 0 3))
+(define four (core:make-cell 2 0 4))
+(define pair4-nil (core:make-cell 3 four '()))
+(define list3-4 (core:make-cell 3 three pair4-nil))
+(define list1234 (core:make-cell 3 list1-2 list3-4))
 (gc-show)
 (gc list1234)
 (gc-show)
index ea1f1d27b24e1478101d97acb9de7fa118718943..f016612ee03446bf32788d90d9a2eaf1d9011c7a 100755 (executable)
@@ -72,10 +72,10 @@ exit $?
   (if (= gc-free gc-size) (gc))
   ((lambda (index)
      (set! gc-free (+ gc-free 1))
-     (make-cell 'p index))
+     (core:make-cell 'p index))
    gc-free))
 
-(define (make-cell type . x)
+(define (core:make-cell type . x)
   (cons type (if (pair? x) (car x) '*)))
 
 (define (cell-index c)
index abbeba3a2f0fbdce32989c97c0722652300df09f..134b317f6b50e9913175dbca5bb57cd1f220373a 100644 (file)
--- a/vector.c
+++ b/vector.c
@@ -24,7 +24,7 @@ make_vector (SCM n)
   int k = VALUE (n);
   g_cells[tmp_num].value = TVECTOR;
   SCM v = alloc (k);
-  SCM x = make_cell (tmp_num, k, v);
+  SCM x = make_cell_ (tmp_num, k, v);
   for (int i=0; i<k; i++) g_cells[v+i] = g_cells[vector_entry (cell_unspecified)];
   return x;
 }