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 *name = cadr (x);
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 {
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 (make_lambda (cdadr (x), cddr (x)), p);
}
if (eq_p (car (x), &symbol_define_macro) == &scm_t)
e = make_macro (name, e);

73
mes.c
View File

@ -330,8 +330,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 (m, a);
scm *e = eval (car (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_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)
@ -370,15 +373,63 @@ 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 (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");
return apply_env (efn, x, a);
}
scm *mes_eval = 0;
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 (e->type == SCM) return e;
@ -429,14 +480,14 @@ 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 (caddr (e), a), a);
#if QUASIQUOTE
if (e->car == &symbol_unquote)
return builtin_eval (cadr (e), a);
return eval (cadr (e), a);
if (e->car == &symbol_quasiquote)
return eval_quasiquote (cadr (e), add_unquoters (a));
if (e->car == &symbol_unsyntax)
return builtin_eval (cadr (e), a);
return eval (cadr (e), a);
if (e->car == &symbol_quasisyntax)
return eval_quasisyntax (cadr (e), add_unsyntaxers (a));
#endif //QUASIQUOTE
@ -459,7 +510,7 @@ begin (scm *e, scm *a)
{
scm *r = &scm_unspecified;
while (e != &scm_nil) {
r = builtin_eval (e->car, a);
r = eval (e->car, a);
e = e->cdr;
}
return r;
@ -468,10 +519,10 @@ begin (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 (car (e), a) != &scm_f)
return eval (cadr (e), a);
if (cddr (e) != &scm_nil)
return builtin_eval (caddr (e), a);
return eval (caddr (e), a);
return &scm_unspecified;
}

View File

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

View File

@ -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 m a))
(#t (cons (eval (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 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,15 +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 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))
@ -122,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 (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) (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))
@ -140,39 +181,40 @@
(define (add-unquoters a)
(cons %the-unquoters a))
(define (eval e a)
(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 (car e) a)
(if (null? (cdr e)) (mes:eval (car e) a)
(begin
(eval (car e) a)
(mes:eval (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 (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 (cadr e) a))
((eq? (car e) 'unquote) (mes:eval (cadr e) a))
((and (pair? (car e))
(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)))))
(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) (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))
@ -189,4 +231,16 @@
;; boot into loop-0
(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;
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 (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 (cadar (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;
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 (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 (cadar (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;
}
scm *
internal_p (scm *x)
{
return x->type == SCM ? &scm_t : &scm_f;
}
scm *
symbol_p (scm *x)
{