Specification

Introduction

Environment Interface

Constructors

Observers

Grammar

Env-exp ::= (empty-env) Env-exp ::= (extend-env Identifier Scheme-value Env-exp)

Representation

The Interpreter Recipe

  1. Look at a piece of data.
  2. Decide what kind of data it represents.
  3. Extract the components of the datum and do the right thing with them.

Data Structure (Tagged Data) Representation

In the most basic implementation, we represent environments as tagged data: (list tag ...)

;; empty-env : () -> Env
(define empty-env
	(lambda () (list 'empty-env)))

;; extend-env : Var x SchemeVal x Env -> Env
(define extend-env
	(lambda (var val env)
		(list 'extend-env var val env)))

;; apply-env : Env x Var -> SchemeVal
(define apply-env
	(lambda (env search-var)
		(cond ((eqv? (car env) 'empty-env)
					 (report-no-binding-found search-var)
					((eqv? (car env) 'extend-env)
					 (let ((saved-var (cadr env))
								 (saved-val (caddr env))
								 (saved-env (cadddr env)))
								(if (eqv? search-var saved-var)
										saved-val
										(apply-env saved-env search-var))))
					(else (report-invalid-env env)))))