From ad1ca1d7960900bb4ca28dc61a7bb065e5c244f4 Mon Sep 17 00:00:00 2001 From: Yiyun Liu Date: Fri, 6 Jun 2025 13:59:34 -0400 Subject: [PATCH] Add let bindings --- semantics.rkt | 20 ++++++++++++++++++++ tests/eval.rkt | 2 ++ 2 files changed, 22 insertions(+) diff --git a/semantics.rkt b/semantics.rkt index 15b4f47..8e65454 100644 --- a/semantics.rkt +++ b/semantics.rkt @@ -134,6 +134,26 @@ [(heap1 addr-a) (instantiate-body a env heap0)]) (allocate-node heap1 (list addr-f addr-a)))] [(? 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")])) +(: 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)) diff --git a/tests/eval.rkt b/tests/eval.rkt index 00befa9..4537d4f 100644 --- a/tests/eval.rkt +++ b/tests/eval.rkt @@ -28,3 +28,5 @@ (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 `(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)