Speedup local env lookup

This commit is contained in:
Justin Ethier 2018-02-14 13:00:54 -05:00
parent 2cd96058eb
commit 41dc8ff120

View file

@ -437,27 +437,20 @@
(let ((qval (cadr exp))) (let ((qval (cadr exp)))
(lambda (env) qval))) (lambda (env) qval)))
(define-c assoc-cdr
"(void *data, int argc, closure _, object k, object x, object lis)"
" return_closcall1(data, k, assoc_cdr(data, x, lis)); ")
(define (analyze-variable exp local-renamed) (define (analyze-variable exp local-renamed)
(let* ((lookup (assoc exp local-renamed)) (let* ((lookup (assoc exp local-renamed))
;; TODO: doing too much here, need to figure out a way to speed things up!
(sym (cond (sym (cond
((pair? lookup) ((pair? lookup)
(write `(lookup var ,lookup))
(newline)
(car lookup)) (car lookup))
(else (else
(call/cc (lambda (return) (let ((lookup-by-renamed (assoc-cdr exp local-renamed)))
(for-each (if lookup-by-renamed
(lambda (v/r) (car lookup-by-renamed) ;; Map renamed symbol back to one in env
;; Map renamed symbol back to one in env exp)))))) ;; Not found, keep input symbol
(when (eq? exp (cdr v/r))
(write `(reverse lookup var ,v/r))
(newline)
(return (car v/r))))
local-renamed)
(write `(NO lookup var ,exp ,local-renamed))
(newline)
(return exp))))))) ;; Not found, keep input symbol
(lambda (env) (lambda (env)
(env:lookup-variable-value sym env)))) (env:lookup-variable-value sym env))))