anchor.diff:  
   (defpackage #:fexpr-clutter (:use :cl :alexandria :anaphora))
   (in-package #:fexpr-clutter)
  +
  +(declaim (optimize debug))
   
   (defstruct env
     parent
  
positive.code: 
  (defun invoke (operator env args)
    (if (clutter-operator-p operator)
        (funcall (clutter-operator-function operator) env args)
        (error "Not a function: ~A." operator)))
  
  (defmacro defprimitive (name value)
  
negative.code: 
  (defprimitive vau
      (make-clutter-operator
       :function (lambda (static-env lambda-list env-var &rest body)
                   (make-clutter-operator
                    :function
                    (lambda (*denv* &rest values)
                      (let ((env (make-child-env static-env
                                                 (cons env-var lambda-list)
                                                 (cons *denv* values))))
                        (loop for sexp in body
                              for last-value = (clutter-eval sexp env)
                              finally (return last-value))))))))
  
  (defprimitive wrap
      (make-function
       (make-clutter-operator
        :function (lambda (*denv* &rest values)
                    (make-function (car values))))))
  
  (defprimitive unwrap
      (make-function
       (make-clutter-operator
        :function (lambda (*denv* &rest values)
                    (clutter-function-operator (car values))))))
  
  (defprimitive eval
      (make-clutter-operator
       :function (lambda (*denv* &rest values)
                   (let ((values (mapcar (rcurry #'clutter-eval *denv*)
                                         values)))
                     (clutter-eval (first values) (second values))))))
  