Add let bindings

This commit is contained in:
Yiyun Liu 2025-06-06 13:59:34 -04:00
parent 4176d439e5
commit ad1ca1d796
2 changed files with 22 additions and 0 deletions

View file

@ -134,6 +134,26 @@
[(heap1 addr-a) (instantiate-body a env heap0)]) [(heap1 addr-a) (instantiate-body a env heap0)])
(allocate-node heap1 (list addr-f addr-a)))] (allocate-node heap1 (list addr-f addr-a)))]
[(? symbol?) (values heap (lookup-globals env e))] [(? symbol?) (values heap (lookup-globals env e))]
[(list 'let binds e)
(let-values ([(env heap) (instantiate-binds binds env heap)])
(instantiate-body e env heap))]
[_ (error "unimplemented")])) [_ (error "unimplemented")]))
(: instantiate-binds (-> CoreBinds Globals Heap (Values Globals Heap)))
(define (instantiate-binds binds old-env heap)
(for/fold
([env : Globals old-env]
[heap : Heap heap])
([bind : CoreBind binds])
(instantiate-bind bind old-env env heap)))
(: instantiate-bind (-> CoreBind Globals Globals Heap (Values Globals Heap)))
(define (instantiate-bind bind old-env new-env heap)
(let ([x (first bind)]
[e (second bind)])
(let-values ([(heap addr) (instantiate-body e old-env heap)])
(values (update-globals new-env x addr) heap))))
(provide (all-defined-out)) (provide (all-defined-out))

View file

@ -28,3 +28,5 @@
(check-equal? (exp-final-node (ap-exp 'S 'K 'K 3)) 3) (check-equal? (exp-final-node (ap-exp 'S 'K 'K 3)) 3)
(check-equal? (exp-final-node (ap-exp 'K 100 99)) 100) (check-equal? (exp-final-node (ap-exp 'K 100 99)) 100)
(check-equal? (exp-final-node `(let ((x ,(ap-exp 'S 'K 'K 3)) (y 5)) ,(ap-exp 'K 'x 'x))) 3)
(check-equal? (exp-final-node `(let ((x ,(ap-exp 'S 'K 'K 3)) (y 5)) ,(ap-exp 'K 'y 'x))) 5)