core: Refactor eval.
authorJan Nieuwenhuizen <janneke@gnu.org>
Thu, 3 Nov 2016 20:43:01 +0000 (21:43 +0100)
committerJan Nieuwenhuizen <janneke@gnu.org>
Mon, 12 Dec 2016 19:33:50 +0000 (20:33 +0100)
* mes.c (eval_env): Rename from builtin_eval, Update callers.  Use switch.

define.c
mes.c
module/mes/base-0.mes
module/mes/loop-0.mes
module/mes/mes-0.mes
module/mes/repl.mes
quasiquote.c

index 50f41eb373640edb81f693cde96b373f81cd5a70..e068772195426dd60231a924ca0d246467992b0f 100644 (file)
--- a/define.c
+++ b/define.c
@@ -25,12 +25,12 @@ define_env (scm *x, scm *a)
   scm *e;
   scm *name = cadr (x);
   if (name->type != PAIR)
-    e = builtin_eval (caddr (x), cons (cons (cadr (x), cadr (x)), a));
+    e = eval_env (caddr (x), cons (cons (cadr (x), cadr (x)), a));
   else {
     name = car (name);
     scm *p = pairlis (cadr (x), cadr (x), a);
     cache_invalidate_range (p, a);
-    e = builtin_eval (make_lambda (cdadr (x), cddr (x)), p);
+    e = eval_env (make_lambda (cdadr (x), cddr (x)), p);
   }
   if (eq_p (car (x), &symbol_define_macro) == &scm_t)
     e = make_macro (name, e);
diff --git a/mes.c b/mes.c
index 0d953f40ed144b5594c2b3927cbc52bb60ebe358..f049b784539ac596317ff6cf72854fba0d1c9d9d 100644 (file)
--- a/mes.c
+++ b/mes.c
@@ -355,8 +355,8 @@ scm *
 evlis_env (scm *m, scm *a)
 {
   if (m == &scm_nil) return &scm_nil;
-  if (m->type != PAIR) return builtin_eval (m, a);
-  scm *e = builtin_eval (car (m), a);
+  if (m->type != PAIR) return eval_env (m, a);
+  scm *e = eval_env (car (m), a);
   return cons (e, evlis_env (cdr (m), a));
 }
 
@@ -392,7 +392,7 @@ apply_env (scm *fn, scm *x, scm *a)
   else if (fn->car == &scm_label)
     return apply_env (caddr (fn), x, cons (cons (cadr (fn), caddr (fn)), a));
 #endif
-  scm *efn = builtin_eval (fn, a);
+  scm *efn = eval_env (fn, a);
   if (efn == &scm_f || efn == &scm_t) assert (!"apply bool");
   if (efn->type == NUMBER) assert (!"apply number");
   if (efn->type == STRING) assert (!"apply string");
@@ -401,37 +401,35 @@ apply_env (scm *fn, scm *x, scm *a)
 }
 
 scm *
-builtin_eval (scm *e, scm *a)
+eval_env (scm *e, scm *a)
 {
-  if (e->type == FUNCTION) return e;
-  if (e->type == SCM) return e;
-  if (e->type == SYMBOL) return assert_defined (assq_ref_cache (e, a));
-  if (e->type != PAIR) return e;
-  if (e->car->type != PAIR)
+  switch (e->type)
     {
-      if (e->car == &symbol_quote)
-        return cadr (e);
+    case PAIR:
+      {
+        if (e->car == &symbol_quote)
+          return cadr (e);
 #if QUASISYNTAX
-      if (e->car == &symbol_syntax)
-        return e;
+        if (e->car == &symbol_syntax)
+          return e;
 #endif
-      if (e->car == &symbol_begin)
-        return begin_env (e, a);
-      if (e->car == &symbol_lambda)
-        return make_closure (cadr (e), cddr (e), assq (&scm_closure, a));
-      if (e->car == &scm_closure)
-        return e;
-      if (e->car == &symbol_if)
-        return builtin_if (cdr (e), a);
+        if (e->car == &symbol_begin)
+          return begin_env (e, a);
+        if (e->car == &symbol_lambda)
+          return make_closure (cadr (e), cddr (e), assq (&scm_closure, a));
+        if (e->car == &scm_closure)
+          return e;
+        if (e->car == &symbol_if)
+          return builtin_if (cdr (e), a);
 #if !BOOT
-      if (e->car == &symbol_define)
-        return define_env (e, a);
-      if (e->car == &symbol_define_macro)
-        return define_env (e, a);
-      if (e->car == &symbol_primitive_load)
-        return load_env (a);
+        if (e->car == &symbol_define)
+          return define_env (e, a);
+        if (e->car == &symbol_define_macro)
+          return define_env (e, a);
+        if (e->car == &symbol_primitive_load)
+          return load_env (a);
 #else
-      if (e->car == &symbol_define) {
+if (e->car == &symbol_define) {
         fprintf (stderr, "C DEFINE: ");
         display_ (stderr,
                   e->cdr->car->type == SYMBOL
@@ -443,23 +441,26 @@ builtin_eval (scm *e, scm *a)
       assert (e->car != &symbol_define_macro);
 #endif
       if (e->car == &symbol_set_x)
-        return set_env_x (cadr (e), builtin_eval (caddr (e), a), a);
+        return set_env_x (cadr (e), eval_env (caddr (e), a), a);
 #if QUASIQUOTE
       if (e->car == &symbol_unquote)
-        return builtin_eval (cadr (e), a);
+        return eval_env (cadr (e), a);
       if (e->car == &symbol_quasiquote)
         return eval_quasiquote (cadr (e), add_unquoters (a));
 #endif //QUASIQUOTE
 #if QUASISYNTAX
       if (e->car == &symbol_unsyntax)
-        return builtin_eval (cadr (e), a);
+        return eval_env (cadr (e), a);
       if (e->car == &symbol_quasisyntax)
         return eval_quasisyntax (cadr (e), add_unsyntaxers (a));
 #endif //QUASISYNTAX
       scm *x = expand_macro_env (e, a);
-      if (x != e) return builtin_eval (x, a);
+      if (x != e) return eval_env (x, a);
+      return apply_env (e->car, evlis_env (e->cdr, a), a);
+      }
+    case SYMBOL: return assert_defined (assq_ref_cache (e, a));
+    default: return e;
     }
-  return apply_env (e->car, evlis_env (e->cdr, a), a);
 }
 
 scm *
@@ -491,7 +492,7 @@ begin_env (scm *e, scm *a)
 {
   scm *r = &scm_unspecified;
   while (e != &scm_nil) {
-    r = builtin_eval (e->car, a);
+    r = eval_env (e->car, a);
     e = e->cdr;
   }
   return r;
@@ -500,10 +501,10 @@ begin_env (scm *e, scm *a)
 scm *
 builtin_if (scm *e, scm *a)
 {
-  if (builtin_eval (car (e), a) != &scm_f)
-    return builtin_eval (cadr (e), a);
+  if (eval_env (car (e), a) != &scm_f)
+    return eval_env (cadr (e), a);
   if (cddr (e) != &scm_nil)
-    return builtin_eval (caddr (e), a);
+    return eval_env (caddr (e), a);
   return &scm_unspecified;
 }
 
index 55e496b3f0a9541a0c0031e67df5d7a9f1e0c7ca..f589c3cb39368ca677ac4be33e263812245200d2 100644 (file)
@@ -26,8 +26,8 @@
 
 ;;; Code:
 
-;;(define (apply f x) (apply-env f x (current-module)))
-(define (primitive-eval e) (eval e (current-module)))
+(define (primitive-eval e) (eval-env e (current-module)))
+(define eval eval-env)
 (define (expand-macro e) (expand-macro-env e (current-module)))
 
 (define quotient /)
index 9e4b2fad513758ca69ce17f348fc32144b999820..7a1e3c20f76e174cf32e8f5776f1f45de84092f6 100644 (file)
@@ -37,8 +37,8 @@
 ((label loop-0
         (lambda (r e a)
           ;; (display "***LOOP-0*** ... e=") (display e) (newline)
-          (if (null? e) (eval (cons 'begin (read-file-env (read-env a) a)) a)
-              (if (atom? e) (loop-0 (eval e a) (read-env a) a)
+          (if (null? e) (eval-env (cons 'begin (read-file-env (read-env a) a)) a)
+              (if (atom? e) (loop-0 (eval-env e a) (read-env a) a)
                   (if (eq? (car e) 'define)
                       ((lambda (aa)     ; env:define
                          ;; (display "0DEFINE name=") (display (cadr e)) (newline)
@@ -47,8 +47,8 @@
                          (set-cdr! (assq '*closure* a) a)
                          (loop-0 *unspecified* (read-env a) a))
                        (cons            ; sexp:define
-                        (if (atom? (cadr e)) (cons (cadr e) (eval (caddr e) a))
-                            (cons (caadr e) (eval (cons 'lambda (cons (cdadr e) (cddr e))) a)))
+                        (if (atom? (cadr e)) (cons (cadr e) (eval-env (caddr e) a))
+                            (cons (caadr e) (eval-env (cons 'lambda (cons (cdadr e) (cddr e))) a)))
                         '()))
                       (if (eq? (car e) 'define-macro)
                           ((lambda (name+entry) ; env:macro
                                                  (cdr name+entry)))
                                '())))
                                         ; sexp:define
-                           (if (atom? (cadr e)) (cons (cadr e) (eval (caddr e) a))
-                               (cons (caadr e) (eval (cons 'lambda (cons (cdadr e) (cddr e))) a)))
+                           (if (atom? (cadr e)) (cons (cadr e) (eval-env (caddr e) a))
+                               (cons (caadr e) (eval-env (cons 'lambda (cons (cdadr e) (cddr e))) a)))
                            '())
-                          (loop-0 (eval e a) (read-env a) a)))))))
+                          (loop-0 (eval-env e a) (read-env a) a)))))))
  *unspecified* (read-env '()) (current-module))
 
 ()
index 7f67cbf7d92a19a151537922c8413b8174375378..0854a1dea6d776ba0f2f8fd890228d8d10436f64 100644 (file)
@@ -79,8 +79,8 @@
 (define (evlis-env m a)
   (cond
    ((null? m) '())
-   ((not (pair? m)) (eval m a))
-   (#t (cons (eval (car m) a) (evlis-env (cdr m) a)))))
+   ((not (pair? m)) (eval-env m a))
+   (#t (cons (eval-env (car m) a) (evlis-env (cdr m) a)))))
 
 (define (apply-env fn x a) 
   (cond
@@ -89,7 +89,7 @@
      ((builtin? fn) (call fn x))
      ((eq? fn 'call-with-values) (call call-with-values-env (append x (cons a '()))))
      ((eq? fn 'current-module) a)
-     (#t (apply-env (eval fn a) x a))))
+     (#t (apply-env (eval-env fn a) x a))))
    ((eq? (car fn) 'lambda)
     (let ((p (pairlis (cadr fn) x a)))
       (cache-invalidate-range p (cdr a))
           (cache-invalidate-range p (cdr a))
           r))))
    ;;((eq? (car fn) 'label) (apply-env (caddr fn) x (cons (cons (cadr fn) (caddr fn)) a)))
-   (#t (apply-env (eval fn a) x a))))
+   (#t (apply-env (eval-env fn a) x a))))
 
 (define (eval-expand e a)
   (cond
      ((eq? (car e) 'if) (eval-if-env (cdr e) a))
      ((eq? (car e) 'define) (env:define (cons (sexp:define e a) '()) a))
      ((eq? (car e) 'define-macro) (env:define (env:macro (sexp:define e a)) a))
-     ((eq? (car e) 'set!) (set-env! (cadr e) (eval (caddr e) a) a))
-     ((eq? (car e) 'apply-env) (apply-env (eval (cadr e) a) (evlis-env (caddr e) a) a))
-     ((eq? (car e) 'unquote) (eval (cadr e) a))
+     ((eq? (car e) 'set!) (set-env! (cadr e) (eval-env (caddr e) a) a))
+     ((eq? (car e) 'apply-env) (apply-env (eval-env (cadr e) a) (evlis-env (caddr e) a) a))
+     ((eq? (car e) 'unquote) (eval-env (cadr e) a))
      ((eq? (car e) 'quasiquote) (eval-quasiquote (cadr e) (add-unquoters a)))
      (#t (apply-env (car e) (evlis-env (cdr e) a) a))))
    (#t (apply-env (car e) (evlis-env (cdr e) a) a))))
 (define (add-unquoters a)
   (cons %the-unquoters a))
 
-(define (eval e a)
+(define (eval-env e a)
   (eval-expand (expand-macro-env e a) a))
 
 (define (expand-macro-env e a)
 
 (define (eval-begin-env e a)
   (if (null? e) *unspecified*
-      (if (null? (cdr e)) (eval (car e) a)
+      (if (null? (cdr e)) (eval-env (car e) a)
           (begin
-            (eval (car e) a)
+            (eval-env (car e) a)
             (eval-begin-env (cdr e) a)))))
 
 (define (eval-if-env e a)
-  (if (eval (car e) a) (eval (cadr e) a)
-      (if (pair? (cddr e)) (eval (caddr e) a))))
+  (if (eval-env (car e) a) (eval-env (cadr e) a)
+      (if (pair? (cddr e)) (eval-env (caddr e) a))))
 
 (define (eval-quasiquote e a)
   (cond ((null? e) e)
         ((atom? e) e)
-        ((eq? (car e) 'unquote) (eval (cadr e) a))
+        ((eq? (car e) 'unquote) (eval-env (cadr e) a))
         ((and (pair? (car e))
               (eq? (caar e) 'unquote-splicing))
-         (append2 (eval (cadar e) a) (eval-quasiquote (cdr e) a)))
+         (append2 (eval-env (cadar e) a) (eval-quasiquote (cdr e) a)))
         (#t (cons (eval-quasiquote (car e) a) (eval-quasiquote (cdr e) a)))))
 
 (define (sexp:define e a)
-  (if (atom? (cadr e)) (cons (cadr e) (eval (caddr e) a))
-      (cons (caadr e) (eval (cons 'lambda (cons (cdadr e) (cddr e))) a))))
+  (if (atom? (cadr e)) (cons (cadr e) (eval-env (caddr e) a))
+      (cons (caadr e) (eval-env (cons 'lambda (cons (cdadr e) (cddr e))) a))))
 
 (define (env:define a+ a)
   (set-cdr! a+ (cdr a))
index d221937fbbc588bc07b0fd12ae28e31aff7e04e5..579c3f585c96097ce7e2fb837a88b38cb9650043 100644 (file)
@@ -160,7 +160,7 @@ along with Mes.  If not, see <http://www.gnu.org/licenses/>.
               (begin
                 (meta (cadr sexp))
                 (loop a))
-              (let ((e (eval sexp a)))
+              (let ((e (eval-env sexp a)))
                 (if (eq? e *unspecified*) (loop a)
                     (let ((id (string->symbol (string-append "$" (number->string count)))))
                       (set! count (+ count 1))
index 11a3d596383f11f4ed5ad599fda52489c7052c8e..e2518e72e6228aee8056132b04e513927dd3415a 100644 (file)
@@ -39,10 +39,10 @@ eval_quasiquote (scm *e, scm *a)
   if (e == &scm_nil) return e;
   else if (atom_p (e) == &scm_t) return e;
   else if (eq_p (car (e), &symbol_unquote) == &scm_t)
-    return builtin_eval (cadr (e), a);
+    return eval_env (cadr (e), a);
   else if (e->type == PAIR && e->car->type == PAIR
            && eq_p (caar (e), &symbol_unquote_splicing) == &scm_t)
-      return append2 (builtin_eval (cadar (e), a), eval_quasiquote (cdr (e), a));
+      return append2 (eval_env (cadar (e), a), eval_quasiquote (cdr (e), a));
   return cons (eval_quasiquote (car (e), a), eval_quasiquote (cdr (e), a));
 }
 
@@ -90,10 +90,10 @@ eval_quasisyntax (scm *e, scm *a)
   if (e == &scm_nil) return e;
   else if (atom_p (e) == &scm_t) return e;
   else if (eq_p (car (e), &symbol_unsyntax) == &scm_t)
-    return builtin_eval (cadr (e), a);
+    return eval_env (cadr (e), a);
   else if (e->type == PAIR && e->car->type == PAIR
            && eq_p (caar (e), &symbol_unsyntax_splicing) == &scm_t)
-      return append2 (builtin_eval (cadar (e), a), eval_quasisyntax (cdr (e), a));
+      return append2 (eval_env (cadar (e), a), eval_quasisyntax (cdr (e), a));
   return cons (eval_quasisyntax (car (e), a), eval_quasisyntax (cdr (e), a));
 }