From 41dc8ff1207145a081c4450d88246620094601bd Mon Sep 17 00:00:00 2001 From: Justin Ethier Date: Wed, 14 Feb 2018 13:00:54 -0500 Subject: [PATCH] Speedup local env lookup --- scheme/eval.sld | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/scheme/eval.sld b/scheme/eval.sld index 96b1fbf4..faddd255 100644 --- a/scheme/eval.sld +++ b/scheme/eval.sld @@ -437,27 +437,20 @@ (let ((qval (cadr exp))) (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) (let* ((lookup (assoc exp local-renamed)) - ;; TODO: doing too much here, need to figure out a way to speed things up! (sym (cond ((pair? lookup) -(write `(lookup var ,lookup)) -(newline) (car lookup)) (else - (call/cc (lambda (return) - (for-each - (lambda (v/r) - ;; Map renamed symbol back to one in env - (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 + (let ((lookup-by-renamed (assoc-cdr exp local-renamed))) + (if lookup-by-renamed + (car lookup-by-renamed) ;; Map renamed symbol back to one in env + exp)))))) ;; Not found, keep input symbol (lambda (env) (env:lookup-variable-value sym env))))