Compare commits

...

7 Commits
master ... boot

Author SHA1 Message Date
Jan Nieuwenhuizen 0751f51493 boot woo 2016-12-12 20:38:06 +01:00
Jan Nieuwenhuizen f959b57825 Revert "Speedup boot eval/apply."
This reverts commit 2258614a01e746f029d020d9f5f985c6506b2810.
2016-12-12 20:38:06 +01:00
Jan Nieuwenhuizen fce7824d8f Revert "comment-out COND"
This reverts commit 0d799d85f69730340c6ef827e553e0a0bfc11c22.
2016-12-12 20:38:06 +01:00
Jan Nieuwenhuizen 091203b3d0 extra PROGRAMA
* module/mes/mes-0.mes:
2016-12-12 20:38:06 +01:00
Jan Nieuwenhuizen 0e1c969dab comment-out COND 2016-12-12 20:38:06 +01:00
Jan Nieuwenhuizen 98f7102224 Speedup boot eval/apply.
* module/mes/mes-0.scm (apply-env, evlis, eval-expand,
  eval-quasiquote): use IF iso COND: factor 3.
  (apply-env): Use lambda iso let: another 30%.
2016-12-12 20:38:06 +01:00
Jan Nieuwenhuizen 6553b88599 BOOT hack 2016-12-12 20:38:06 +01:00
6 changed files with 177 additions and 51 deletions

View File

@ -25,12 +25,12 @@ define (scm *x, scm *a)
scm *e; scm *e;
scm *name = cadr (x); scm *name = cadr (x);
if (name->type != PAIR) if (name->type != PAIR)
e = builtin_eval (caddr (x), cons (cons (cadr (x), cadr (x)), a)); e = eval (caddr (x), cons (cons (cadr (x), cadr (x)), a));
else { else {
name = car (name); name = car (name);
scm *p = pairlis (cadr (x), cadr (x), a); scm *p = pairlis (cadr (x), cadr (x), a);
cache_invalidate_range (p, a); cache_invalidate_range (p, a);
e = builtin_eval (make_lambda (cdadr (x), cddr (x)), p); e = eval (make_lambda (cdadr (x), cddr (x)), p);
} }
if (eq_p (car (x), &symbol_define_macro) == &scm_t) if (eq_p (car (x), &symbol_define_macro) == &scm_t)
e = make_macro (name, e); e = make_macro (name, e);

73
mes.c
View File

@ -330,8 +330,8 @@ scm *
evlis_env (scm *m, scm *a) evlis_env (scm *m, scm *a)
{ {
if (m == &scm_nil) return &scm_nil; if (m == &scm_nil) return &scm_nil;
if (m->type != PAIR) return builtin_eval (m, a); if (m->type != PAIR) return eval (m, a);
scm *e = builtin_eval (car (m), a); scm *e = eval (car (m), a);
return cons (e, evlis_env (cdr (m), a)); return cons (e, evlis_env (cdr (m), a));
} }
@ -342,6 +342,9 @@ apply_env (scm *fn, scm *x, scm *a)
{ {
if (fn == &scm_car) return x->car->car; if (fn == &scm_car) return x->car->car;
if (fn == &scm_cdr) return x->car->cdr; if (fn == &scm_cdr) return x->car->cdr;
#if BOOT
if (fn == &scm_eval) assert (!"JA HEE!");
#endif
if (builtin_p (fn) == &scm_t) if (builtin_p (fn) == &scm_t)
return call (fn, x); return call (fn, x);
if (eq_p (fn, &symbol_call_with_values) == &scm_t) if (eq_p (fn, &symbol_call_with_values) == &scm_t)
@ -370,15 +373,63 @@ apply_env (scm *fn, scm *x, scm *a)
else if (fn->car == &scm_label) else if (fn->car == &scm_label)
return apply_env (caddr (fn), x, cons (cons (cadr (fn), caddr (fn)), a)); return apply_env (caddr (fn), x, cons (cons (cadr (fn), caddr (fn)), a));
#endif #endif
scm *efn = builtin_eval (fn, a); scm *efn = eval (fn, a);
if (efn == &scm_f || efn == &scm_t) assert (!"apply bool"); if (efn == &scm_f || efn == &scm_t) assert (!"apply bool");
if (efn->type == NUMBER) assert (!"apply number"); if (efn->type == NUMBER) assert (!"apply number");
if (efn->type == STRING) assert (!"apply string"); if (efn->type == STRING) assert (!"apply string");
return apply_env (efn, x, a); return apply_env (efn, x, a);
} }
scm *mes_eval = 0;
scm * scm *
builtin_eval (scm *e, scm *a) boot (scm *eval)
{
mes_eval = eval;
}
scm *
eval (scm *e, scm *a)
{
#if 0
static scm s = {SYMBOL, "mes:eval"};
static scm *x = 0;
// fprintf (stderr, "c:eval e=");
// display_ (stderr, e);
// fprintf (stderr, "\n");
if (!x) x = make_symbol (&s);
scm *eval = assq_ref_cache (x, a);
// fprintf (stderr, "eval=");
// display_ (stderr, eval);
// fprintf (stderr, "\n");
if (eval != &scm_undefined && builtin_p (eval) == &scm_f) {
fprintf (stderr, "gotta eval=");
display_ (stderr, eval);
fprintf (stderr, "\n");
// 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 *
eval_ (scm *e, scm *a)
{ {
if (builtin_p (e) == &scm_t) return e; if (builtin_p (e) == &scm_t) return e;
if (e->type == SCM) return e; if (e->type == SCM) return e;
@ -429,14 +480,14 @@ builtin_eval (scm *e, scm *a)
assert (e->car != &symbol_define_macro); assert (e->car != &symbol_define_macro);
#endif #endif
if (e->car == &symbol_set_x) 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 (caddr (e), a), a);
#if QUASIQUOTE #if QUASIQUOTE
if (e->car == &symbol_unquote) if (e->car == &symbol_unquote)
return builtin_eval (cadr (e), a); return eval (cadr (e), a);
if (e->car == &symbol_quasiquote) if (e->car == &symbol_quasiquote)
return eval_quasiquote (cadr (e), add_unquoters (a)); return eval_quasiquote (cadr (e), add_unquoters (a));
if (e->car == &symbol_unsyntax) if (e->car == &symbol_unsyntax)
return builtin_eval (cadr (e), a); return eval (cadr (e), a);
if (e->car == &symbol_quasisyntax) if (e->car == &symbol_quasisyntax)
return eval_quasisyntax (cadr (e), add_unsyntaxers (a)); return eval_quasisyntax (cadr (e), add_unsyntaxers (a));
#endif //QUASIQUOTE #endif //QUASIQUOTE
@ -459,7 +510,7 @@ begin (scm *e, scm *a)
{ {
scm *r = &scm_unspecified; scm *r = &scm_unspecified;
while (e != &scm_nil) { while (e != &scm_nil) {
r = builtin_eval (e->car, a); r = eval (e->car, a);
e = e->cdr; e = e->cdr;
} }
return r; return r;
@ -468,10 +519,10 @@ begin (scm *e, scm *a)
scm * scm *
builtin_if (scm *e, scm *a) builtin_if (scm *e, scm *a)
{ {
if (builtin_eval (car (e), a) != &scm_f) if (eval (car (e), a) != &scm_f)
return builtin_eval (cadr (e), a); return eval (cadr (e), a);
if (cddr (e) != &scm_nil) if (cddr (e) != &scm_nil)
return builtin_eval (caddr (e), a); return eval (caddr (e), a);
return &scm_unspecified; return &scm_unspecified;
} }

View File

@ -36,9 +36,24 @@
((label loop-0 ((label loop-0
(lambda (r e a) (lambda (r e a)
;; (display "***LOOP-0*** ... e=") (display e) (newline) (display "***LOOP-0*** ... e=") (display e) (newline)
(if (null? e) (eval (read-file (read-env a) a) a) (if (null? e) ;;(eval (read-file (read-env a) a) a)
(if (atom? e) (loop-0 (eval e a) (read-env a) a) ((lambda (program)
(display "LOOP done eval=")
(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 program a)
)
(read-file (read-env a) a)
)
(if (atom? e) (loop-0 (eval- e a) (read-env a) a)
(if (eq? (car e) 'define) (if (eq? (car e) 'define)
((lambda (aa) ; env:define ((lambda (aa) ; env:define
;; (display "0DEFINE name=") (display (cadr e)) (newline) ;; (display "0DEFINE name=") (display (cadr e)) (newline)
@ -47,8 +62,8 @@
(set-cdr! (assq '*closure* a) a) (set-cdr! (assq '*closure* a) a)
(loop-0 *unspecified* (read-env a) a)) (loop-0 *unspecified* (read-env a) a))
(cons ; sexp:define (cons ; sexp:define
(if (atom? (cadr e)) (cons (cadr e) (eval (caddr 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))) (cons (caadr e) (eval- (cons 'lambda (cons (cdadr e) (cddr e))) a)))
'())) '()))
(if (eq? (car e) 'define-macro) (if (eq? (car e) 'define-macro)
((lambda (name+entry) ; env:macro ((lambda (name+entry) ; env:macro
@ -64,10 +79,10 @@
(cdr name+entry))) (cdr name+entry)))
'()))) '())))
; sexp:define ; sexp:define
(if (atom? (cadr e)) (cons (cadr e) (eval (caddr 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))) (cons (caadr e) (eval- (cons 'lambda (cons (cdadr e) (cddr e))) a)))
'()) '())
(loop-0 (eval e a) (read-env a) a))))))) (loop-0 (eval- e a) (read-env a) a)))))))
*unspecified* (read-env '()) (current-module)) *unspecified* (read-env '()) (current-module))
() ()

View File

@ -76,20 +76,23 @@
(define (not x) (define (not x)
(if x #f #t)) (if x #f #t))
(define (evlis-env m a) (define (mes:evlis-env m a)
;; (display "mes:evlis-env m=") (display m) (newline)
(cond (cond
((null? m) '()) ((null? m) '())
((not (pair? m)) (eval m a)) ((not (pair? m)) (mes:eval m a))
(#t (cons (eval (car m) a) (evlis-env (cdr 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 (cond
((atom? fn) ((atom? fn)
(cond (cond
((builtin? fn) (call fn x)) ((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) ((eq? fn 'current-module) a)
(#t (apply-env (eval 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) ((eq? (car fn) 'lambda)
(let ((p (pairlis (cadr fn) x a))) (let ((p (pairlis (cadr fn) x a)))
(cache-invalidate-range p (cdr a)) (cache-invalidate-range p (cdr a))
@ -105,15 +108,52 @@
(let ((r (eval-begin-env body (cons (cons '*closure* p) p)))) (let ((r (eval-begin-env body (cons (cons '*closure* p) p))))
(cache-invalidate-range p (cdr a)) (cache-invalidate-range p (cdr a))
r)))) r))))
;;((eq? (car fn) 'label) (apply-env (caddr fn) x (cons (cons (cadr fn) (caddr fn)) a))) ;;((eq? (car fn) 'label) (mes:apply-env (caddr fn) x (cons (cons (cadr fn) (caddr fn)) a)))
(#t (apply-env (eval fn a) x a)))) (#t (mes:apply-env (mes:eval fn a) x a))))
(define (eval-expand e a) (define (eval-expand e a)
(display "mes:eval-expand e=") (display e) (newline)
(cond (cond
((internal? e) e)
((builtin? e) e)
((symbol? e) (assq-ref-cache e a)) ((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? e) e)
((atom? (car e)) ((atom? (car e))
(cond (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) 'quote) (cadr e))
((eq? (car e) 'syntax) (cadr e)) ((eq? (car e) 'syntax) (cadr e))
((eq? (car e) 'begin) (eval-begin-env e a)) ((eq? (car e) 'begin) (eval-begin-env e a))
@ -122,12 +162,13 @@
((eq? (car e) 'if) (eval-if-env (cdr e) a)) ((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) (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) '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) 'set!) (set-env! (cadr e) (mes: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) 'mes:apply-env) (mes:apply-env (mes:eval (cadr e) a) (mes:evlis-env (caddr e) a) a))
((eq? (car e) 'unquote) (eval (cadr e) 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))) ((eq? (car e) 'quasiquote) (eval-quasiquote (cadr e) (add-unquoters 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 (apply-env (car e) (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 x) (cons 'unquote x))
(define (unquote-splicing x) (cons 'quasiquote x)) (define (unquote-splicing x) (cons 'quasiquote x))
@ -140,39 +181,40 @@
(define (add-unquoters a) (define (add-unquoters a)
(cons %the-unquoters a)) (cons %the-unquoters a))
(define (eval e a) (define (mes:eval e a)
(eval-expand (expand-macro-env e a) 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 (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)) e))
(lookup-macro (car e) a)) (lookup-macro (car e) a))
e)) e))
(define (eval-begin-env e a) (define (eval-begin-env e a)
(if (null? e) *unspecified* (if (null? e) *unspecified*
(if (null? (cdr e)) (eval (car e) a) (if (null? (cdr e)) (mes:eval (car e) a)
(begin (begin
(eval (car e) a) (mes:eval (car e) a)
(eval-begin-env (cdr e) a))))) (eval-begin-env (cdr e) a)))))
(define (eval-if-env e a) (define (eval-if-env e a)
(if (eval (car e) a) (eval (cadr e) a) (if (mes:eval (car e) a) (mes:eval (cadr e) a)
(if (pair? (cddr e)) (eval (caddr e) a)))) (if (pair? (cddr e)) (mes:eval (caddr e) a))))
(define (eval-quasiquote e a) (define (eval-quasiquote e a)
(cond ((null? e) e) (cond ((null? e) e)
((atom? e) e) ((atom? e) e)
((eq? (car e) 'unquote) (eval (cadr e) a)) ((eq? (car e) 'unquote) (mes:eval (cadr e) a))
((and (pair? (car e)) ((and (pair? (car e))
(eq? (caar e) 'unquote-splicing)) (eq? (caar e) 'unquote-splicing))
(append2 (eval (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))))) (#t (cons (eval-quasiquote (car e) a) (eval-quasiquote (cdr e) a)))))
(define (sexp:define e a) (define (sexp:define e a)
(if (atom? (cadr e)) (cons (cadr e) (eval (caddr e) a)) (if (atom? (cadr e)) (cons (cadr e) (mes:eval (caddr e) a))
(cons (caadr e) (eval (cons 'lambda (cons (cdadr e) (cddr e))) a)))) (cons (caadr e) (mes:eval (cons 'lambda (cons (cdadr e) (cddr e))) a))))
(define (env:define a+ a) (define (env:define a+ a)
(set-cdr! a+ (cdr a)) (set-cdr! a+ (cdr a))
@ -189,4 +231,16 @@
;; boot into loop-0 ;; boot into loop-0
(cache-invalidate-range (current-module) '()) (cache-invalidate-range (current-module) '())
() ()
ignored ;;ignored
begin
((lambda (program)
;;(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) '())
()
;;ignored
begin

View File

@ -55,10 +55,10 @@ eval_quasiquote (scm *e, scm *a)
if (e == &scm_nil) return e; if (e == &scm_nil) return e;
else if (atom_p (e) == &scm_t) return e; else if (atom_p (e) == &scm_t) return e;
else if (eq_p (car (e), &symbol_unquote) == &scm_t) else if (eq_p (car (e), &symbol_unquote) == &scm_t)
return builtin_eval (cadr (e), a); return eval (cadr (e), a);
else if (e->type == PAIR && e->car->type == PAIR else if (e->type == PAIR && e->car->type == PAIR
&& eq_p (caar (e), &symbol_unquote_splicing) == &scm_t) && eq_p (caar (e), &symbol_unquote_splicing) == &scm_t)
return append2 (builtin_eval (cadar (e), a), eval_quasiquote (cdr (e), a)); return append2 (eval (cadar (e), a), eval_quasiquote (cdr (e), a));
return cons (eval_quasiquote (car (e), a), eval_quasiquote (cdr (e), a)); return cons (eval_quasiquote (car (e), a), eval_quasiquote (cdr (e), a));
} }
@ -68,10 +68,10 @@ eval_quasisyntax (scm *e, scm *a)
if (e == &scm_nil) return e; if (e == &scm_nil) return e;
else if (atom_p (e) == &scm_t) return e; else if (atom_p (e) == &scm_t) return e;
else if (eq_p (car (e), &symbol_unsyntax) == &scm_t) else if (eq_p (car (e), &symbol_unsyntax) == &scm_t)
return builtin_eval (cadr (e), a); return eval (cadr (e), a);
else if (e->type == PAIR && e->car->type == PAIR else if (e->type == PAIR && e->car->type == PAIR
&& eq_p (caar (e), &symbol_unsyntax_splicing) == &scm_t) && eq_p (caar (e), &symbol_unsyntax_splicing) == &scm_t)
return append2 (builtin_eval (cadar (e), a), eval_quasisyntax (cdr (e), a)); return append2 (eval (cadar (e), a), eval_quasisyntax (cdr (e), a));
return cons (eval_quasisyntax (car (e), a), eval_quasisyntax (cdr (e), a)); return cons (eval_quasisyntax (car (e), a), eval_quasisyntax (cdr (e), a));
} }

6
type.c
View File

@ -56,6 +56,12 @@ string_p (scm *x)
return x->type == STRING ? &scm_t : &scm_f; return x->type == STRING ? &scm_t : &scm_f;
} }
scm *
internal_p (scm *x)
{
return x->type == SCM ? &scm_t : &scm_f;
}
scm * scm *
symbol_p (scm *x) symbol_p (scm *x)
{ {