expr: 69.29%

#lang typed/racket
(provide Context
         lookup
         update-context)
(require "ast.rkt"
         "eval.rkt")

(define-type Context (HashTable Symbol Value))
(: lookup : Symbol Context -> Value)
(define (lookup x c) (hash-ref c x))

(: update-context : Context Pat Value Value -> Context)
(define (update-context ctx pat v1 v2)
  (match (list pat v1)
    [(list (Pat:Unit) _) ctx]
    [(list (Pat:Var x) t) (hash-set ctx x t)]
    [(list (Pat:Pair p1 p2) (V:Sigma t g))
     (define new-ctx (update-context ctx p1 t (vfst v2)))
     (update-context new-ctx p2 (Inst g (vfst v2)) (vsnd v2))]
    [else (error 'update-context "p = ~a" pat)]))