private/env.ss
#lang scheme
(require "../ast.ss")

(define env/c
  (and/c hash? immutable?))
(define (empty-env)
  (make-immutable-hash empty))
(define (lookup env var [def #f])
  (hash-ref env var def))
(define (extend env var val)
  (hash-set env var val))

(provide/contract
 [env/c contract?]
 [empty-env (-> env/c)]
 [lookup ((env/c symbol?) (term/c) . ->* . (or/c false/c term/c))]
 [extend (env/c symbol? term/c . -> . void)])