diff --git a/mes.c b/mes.c index 0e0a840d..0d1d8f36 100644 --- a/mes.c +++ b/mes.c @@ -342,7 +342,9 @@ apply_env (scm *fn, scm *x, scm *a) { if (fn == &scm_car) return x->car->car; if (fn == &scm_cdr) return x->car->cdr; +#if BOOT if (fn == &scm_eval) assert (!"JA HEE!"); +#endif if (builtin_p (fn) == &scm_t) return call (fn, x); if (eq_p (fn, &symbol_call_with_values) == &scm_t) @@ -378,14 +380,22 @@ apply_env (scm *fn, scm *x, scm *a) return apply_env (efn, x, a); } +scm *mes_eval = 0; +scm * +boot (scm *eval) +{ + mes_eval = eval; +} + scm * eval (scm *e, scm *a) { - static scm s = {SYMBOL, "eval"}; +#if 0 + static scm s = {SYMBOL, "mes:eval"}; static scm *x = 0; - fprintf (stderr, "c:eval e="); - display_ (stderr, e); - fprintf (stderr, "\n"); + // fprintf (stderr, "c:eval e="); + // display_ (stderr, e); + // fprintf (stderr, "\n"); if (!x) x = make_symbol (&s); scm *eval = assq_ref_cache (x, a); @@ -402,6 +412,20 @@ eval (scm *e, scm *a) // return apply_env (eval, cons (e, cons (a, &scm_nil)), a); } return eval_ (e, a); +#else + //if (mes_eval) return apply_env (mes_eval, cons (e, cons (a, &scm_nil)), a); + if (mes_eval) { + fprintf (stderr, "gotta eval e="); + // display_ (stderr, mes_eval); + // fprintf (stderr, "e="); + display_ (stderr, e); + fprintf (stderr, "\n"); + return apply_env (mes_eval, cons (e, cons (a, &scm_nil)), a); + //return eval_ (e, a); //cons (mes_eval, cons (e, a)), a); + } + + return eval_ (e, a); +#endif } scm * diff --git a/module/mes/loop-0.mes b/module/mes/loop-0.mes index 01856e15..30be4ed5 100644 --- a/module/mes/loop-0.mes +++ b/module/mes/loop-0.mes @@ -40,15 +40,16 @@ (if (null? e) ;;(eval (read-file (read-env a) a) a) ((lambda (program) (display "LOOP done eval=") - (display (cddr evlis-env)) + (display (cddr mes:evlis-env)) (newline) (display "program=") (display program) (newline) + (boot mes:eval) ;;(eval (read-file (read-env a) a) a) ;;(apply-env eval (read-file (read-env a) a) a) ;;(loop-1 (read-file (read-env a) a) a) - (eval-expand program a) + (eval program a) ) (read-file (read-env a) a) ) diff --git a/module/mes/mes-0.mes b/module/mes/mes-0.mes index afce962b..e8dd6ae7 100644 --- a/module/mes/mes-0.mes +++ b/module/mes/mes-0.mes @@ -76,20 +76,23 @@ (define (not x) (if x #f #t)) -(define (evlis-env m a) +(define (mes:evlis-env m a) + ;; (display "mes:evlis-env m=") (display m) (newline) (cond ((null? m) '()) - ((not (pair? m)) (eval-expand m a)) - (#t (cons (eval-expand (car m) a) (evlis-env (cdr m) a))))) + ((not (pair? m)) (mes:eval m a)) + (#t (cons (mes:eval (car m) a) (mes:evlis-env (cdr m) a))))) -(define (apply-env fn x a) +(define (mes:apply-env fn x a) + (display "mes:apply fn=") (display fn) (newline) (cond ((atom? fn) (cond ((builtin? fn) (call fn x)) - ((eq? fn 'call-with-values) (c:apply-env 'call-with-values x a)) + ((eq? fn 'call-with-values) (c:mes:apply-env 'call-with-values x a)) ((eq? fn 'current-module) a) - (#t (apply-env (eval-expand fn a) x a)))) + ((eq? fn 'eval-expand) (eval-expand x a)) + (#t (mes:apply-env (mes:eval fn a) x a)))) ((eq? (car fn) 'lambda) (let ((p (pairlis (cadr fn) x a))) (cache-invalidate-range p (cdr a)) @@ -105,16 +108,52 @@ (let ((r (eval-begin-env body (cons (cons '*closure* p) p)))) (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-expand fn a) x a)))) + ;;((eq? (car fn) 'label) (mes:apply-env (caddr fn) x (cons (cons (cadr fn) (caddr fn)) a))) + (#t (mes:apply-env (mes:eval fn a) x a)))) (define (eval-expand e a) (display "mes:eval-expand e=") (display e) (newline) (cond + ((internal? e) e) + ((builtin? e) e) ((symbol? e) (assq-ref-cache e a)) + ;; ((symbol? e) + ;; (display "symbol! e=") (display e) (newline) + ;; (call assq-ref-cache (cons e (cons a '()))) + ;; ;;e + ;; ) ((atom? e) e) ((atom? (car e)) (cond + ;; ((and (eq? (car e) 'eq?) + ;; (eq? (cadr e) 'builtin?)) + ;; (mes:apply-env (cadr e) (cddr e) a) + ;; ) + + ;; ((and (eq? (car e) 'eq?) + ;; (eq? (cadr e) 'internal?)) + ;; ;;(mes:apply-env (cadr e) (cddr e) a) + ;; (call internal? (cddr e)) + ;; ) + ;; ((and (eq? (car e) 'eq?) + ;; (eq? (cadr e) 'symbol?)) + ;; (mes:apply-env (cadr e) (cddr e) a) + ;; ) + ;;((eq? (car e) 'assq-ref-cache) (mes:apply-env (car e) (cdr e) a)) + ;;((eq? (car e) 'internal?) (mes:apply-env (car e) (cdr e) a)) + ;;((eq? (car e) 'builtin?) (mes:apply-env (car e) (cdr e) a)) + ;;((eq? (car e) 'symbol?) (mes:apply-env (car e) (cdr e) a)) + + ;; ((eq? (car e) 'assq-ref-cache) (call (car e) (cdr e))) + ;; ((eq? (car e) 'symbol?) (call (car e) (cdr e))) + ;; ((eq? (car e) 'internal?) (call (car e) (cdr e))) + ;; ((eq? (car e) 'builtin?) (call (car e) (cdr e))) + + ;;((eq? (car e) 'assq-ref-cache) (call assq-ref-cache (cdr e))) + ((eq? (car e) 'symbol?) (call symbol? (cdr e))) + ((eq? (car e) 'internal?) (call internal? (cdr e))) + ((eq? (car e) 'builtin?) (call builtin? (cdr e))) + ((eq? (car e) 'quote) (cadr e)) ((eq? (car e) 'syntax) (cadr e)) ((eq? (car e) 'begin) (eval-begin-env e a)) @@ -123,12 +162,13 @@ ((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-expand (caddr e) a) a)) - ((eq? (car e) 'apply-env) (apply-env (eval-expand (cadr e) a) (evlis-env (caddr e) a) a)) - ((eq? (car e) 'unquote) (eval-expand (cadr e) a)) + ((eq? (car e) 'set!) (set-env! (cadr e) (mes:eval (caddr e) a) a)) + ((eq? (car e) 'mes:apply-env) (mes:apply-env (mes:eval (cadr e) a) (mes:evlis-env (caddr e) a) a)) +;; ((eq? (car e) 'eval-expand) (eval-expand e a)) + ((eq? (car e) 'unquote) (mes:eval (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)))) + (#t (mes:apply-env (car e) (mes:evlis-env (cdr e) a) a)))) + (#t (mes:apply-env (car e) (mes:evlis-env (cdr e) a) a)))) (define (unquote x) (cons 'unquote x)) (define (unquote-splicing x) (cons 'quasiquote x)) @@ -141,40 +181,40 @@ (define (add-unquoters a) (cons %the-unquoters a)) -(define (eval e a) - (display "mes:eval-expand e=") (display e) (newline) - (eval-expand (expand-macro-env e a) a)) +(define (mes:eval e a) + ;;(display "mes:mes:eval e=") (display e) (newline) + (eval-expand (mes:expand-macro-env e a) a)) -(define (expand-macro-env e a) +(define (mes:expand-macro-env e a) (if (pair? e) ((lambda (macro) - (if macro (expand-macro-env (apply-env macro (cdr e) a) a) + (if macro (mes:expand-macro-env (mes:apply-env macro (cdr e) a) a) e)) (lookup-macro (car e) a)) e)) (define (eval-begin-env e a) (if (null? e) *unspecified* - (if (null? (cdr e)) (eval-expand (car e) a) + (if (null? (cdr e)) (mes:eval (car e) a) (begin - (eval-expand (car e) a) + (mes:eval (car e) a) (eval-begin-env (cdr e) a))))) (define (eval-if-env e a) - (if (eval-expand (car e) a) (eval-expand (cadr e) a) - (if (pair? (cddr e)) (eval-expand (caddr e) a)))) + (if (mes:eval (car e) a) (mes:eval (cadr e) a) + (if (pair? (cddr e)) (mes:eval (caddr e) a)))) (define (eval-quasiquote e a) (cond ((null? e) e) ((atom? e) e) - ((eq? (car e) 'unquote) (eval-expand (cadr e) a)) + ((eq? (car e) 'unquote) (mes:eval (cadr e) a)) ((and (pair? (car e)) (eq? (caar e) 'unquote-splicing)) - (append2 (eval-expand (cadar e) a) (eval-quasiquote (cdr e) a))) + (append2 (mes:eval (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-expand (caddr e) a)) - (cons (caadr e) (eval-expand (cons 'lambda (cons (cdadr e) (cddr e))) a)))) + (if (atom? (cadr e)) (cons (cadr e) (mes:eval (caddr e) a)) + (cons (caadr e) (mes:eval (cons 'lambda (cons (cdadr e) (cddr e))) a)))) (define (env:define a+ a) (set-cdr! a+ (cdr a)) @@ -195,18 +235,12 @@ begin ((lambda (program) - (display "PROGRAM done program=") - ;; (display "program=") - ;; (display program) - ;; (newline) - ;;(eval (read-file (read-env a) a) a) - ;;(apply-env eval (read-file (read-env a) a) a) - ;;(loop-1 (read-file (read-env a) a) a) - (eval-expand program (current-module)) - ) + ;;(boot (current-module)) + ;; (boot mes:eval) + (eval program (current-module))) (read-file (read-env (current-module)) (current-module))) ;; boot into mes-0 -(cache-invalidate-range (current-module) '()) +;; (cache-invalidate-range (current-module) '()) () ;;ignored begin diff --git a/type.c b/type.c index ca7119c8..c1916b8e 100644 --- a/type.c +++ b/type.c @@ -56,6 +56,12 @@ string_p (scm *x) return x->type == STRING ? &scm_t : &scm_f; } +scm * +internal_p (scm *x) +{ + return x->type == SCM ? &scm_t : &scm_f; +} + scm * symbol_p (scm *x) {