anchor.diff:  
   (defpackage #:fexpr-clutter (:use :cl :alexandria))
   (in-package #:fexpr-clutter)
  +
  +(defstruct env
  +  parent bindings)
   
   (defun clutter-eval (expression environment)
     (cond ((symbolp expression) (eval/symbol expression environment))
  
positive.code:   (make-clutter-operator 
     :function
     (lambda (*denv* values)
       (let ((env (extend env variables values)))
         (loop for sexp in body
            for last-value = (clutter-eval sexp env)
            finally (return last-value))))))
  
negative.code:         (invoke f env (cdr expression))
          (error "Not an operator: ~A." f))))
  
  (defun lookup (symbol &optional (env *global-env*))
    (if env
        (or (gethash symbol (env-bindings env))
            (lookup symbol (env-parent env)))
        (error "No binding for ~A." symbol)))
  
  (defun (setf lookup) (new-value symbol env)
    (if env
        (if (gethash symbol (env-bindings env))
            (setf (gethash symbol (env-bindings env)) new-value)
            (setf (lookup symbol (env-parent env)) new-value))
        (error "No binding for ~A." symbol)))
  
  (defun extend (env symbol value)
    (if (nth-value 1 (gethash symbol (env-bindings env)))
        (warn "Redefinition of ~A." symbol))
    (setf (gethash symbol (env-bindings env)) value))
  
  (defun make-child-env (env variables values)
    (make-env :parent env
              :bindings (loop :for name :in variables
                              :for binding :in values
                              :with table = (make-hash-table :test 'eq)
                              :do (setf (gethash name table) binding)
                              :finally (return table))))
  
  (defvar *denv* nil)
  (defstruct clutter-operator function)
  