Build out helper

This commit is contained in:
Justin Ethier 2016-05-31 21:53:10 -04:00
parent d499c6fc49
commit 5b29ae4e86

View file

@ -87,11 +87,26 @@
(app-arg-count adbv:app-arg-count adbv:set-app-arg-count!) (app-arg-count adbv:app-arg-count adbv:set-app-arg-count!)
) )
(define (adbv-set-assigned-value-helper! var value) (define (adbv-set-assigned-value-helper! sym var value)
(define (update-lambda-atv! syms value)
(cond
((ast:lambda? value)
(let ((id (ast:lambda-id value)))
(with-var! id (lambda (fnc)
(adbf:set-assigned-to-var!
fnc
(append syms (adbf:assigned-to-var fnc)))))))
;; TODO: follow references
;((ref? value)
; (update-lambda-atv! (cons value
(else
#f))
)
(adbv:set-assigned-value! var value) (adbv:set-assigned-value! var value)
;; TODO: if value is a lambda, update the lambda's var ref's ;; TODO: if value is a lambda, update the lambda's var ref's
;; BUT, what if other vars point to var? do we need to add ;; BUT, what if other vars point to var? do we need to add
;; them to the lambda's list as well? ;; them to the lambda's list as well?
(update-lambda-atv! (list sym) value)
) )
(define (adb:make-var) (define (adb:make-var)
@ -165,7 +180,7 @@
(with-var! (define->var exp) (lambda (var) (with-var! (define->var exp) (lambda (var)
(adbv:set-defined-by! var lid) (adbv:set-defined-by! var lid)
(adbv:set-ref-by! var (cons lid (adbv:ref-by var))) (adbv:set-ref-by! var (cons lid (adbv:ref-by var)))
(adbv-set-assigned-value-helper! var (define->exp exp)) (adbv-set-assigned-value-helper! (define->var exp) var (define->exp exp))
(adbv:set-const! var #f) (adbv:set-const! var #f)
(adbv:set-const-value! var #f))) (adbv:set-const-value! var #f)))
(analyze (define->exp exp) lid)) (analyze (define->exp exp) lid))
@ -174,7 +189,7 @@
(with-var! (set!->var exp) (lambda (var) (with-var! (set!->var exp) (lambda (var)
(if (adbv:assigned-value var) (if (adbv:assigned-value var)
(adbv:set-reassigned! var #t)) (adbv:set-reassigned! var #t))
(adbv-set-assigned-value-helper! var (set!->exp exp)) (adbv-set-assigned-value-helper! (set!->var exp) var (set!->exp exp))
(adbv:set-ref-by! var (cons lid (adbv:ref-by var))) (adbv:set-ref-by! var (cons lid (adbv:ref-by var)))
(adbv:set-const! var #f) (adbv:set-const! var #f)
(adbv:set-const-value! var #f))) (adbv:set-const-value! var #f)))
@ -209,7 +224,7 @@
(lambda (arg) (lambda (arg)
;(trace:error `(app check arg ,arg ,(car params) ,(const-atomic? arg))) ;(trace:error `(app check arg ,arg ,(car params) ,(const-atomic? arg)))
(with-var! (car params) (lambda (var) (with-var! (car params) (lambda (var)
(adbv-set-assigned-value-helper! var arg) (adbv-set-assigned-value-helper! (car params) var arg)
(cond (cond
((const-atomic? arg) ((const-atomic? arg)
(adbv:set-const! var #t) (adbv:set-const! var #t)