anchor.diff:         (generate-bind-body (car exp) (cdr exp) 'normal)))
   
   (defmacro match (exp)
  +   (print `(match ,exp))
      (let ((end-of-chain? (not (cdr exp))))
         (if (listp (car exp))
             (aif (gethash (string (caar exp)) destr-match-clauses)
  
positive.code: ;; [w] sublists
  ;; [ ] modify match so clause names without arguments are bindings
  ;; [?] full literal value matching, using quotes for symbols
  ;; [w] fix indentation and maybe line length
  ;; [w] single/multiple modes
  ;; [w] make the variables update during matching
  ;; [?] scan for free symbols in normal expressions, like (member foo '(bar baz)) 
  ;;       would need some way of detecting already-bound local variables? 
  ;; [?] optimize matching more
  ;; [ ] another layer of expansion so you can overload macro names
  
  (defparameter destr-match-clauses (make-hash-table :test #'equalp))
  (defparameter matching-style 'symbol) ;; symbol, string, case-sensitive, regex, symbol-regex
  (defparameter single-mode t)
  
  (defmacro def-match-clause (name ll &rest rest)
     `(setf (gethash ,(string name) destr-match-clauses) (lambda ,ll ,@rest)))
  
negative.code:          (setf exp (first body))
           (setf match-form (second body))
           (setf body (cddr body)))
     (when (and (symbolp (car match-form)) 
                (gethash (string (car match-form)) destr-match-clauses))
           (setf match-form (list match-form)))
     (print 'foo)
     (multiple-value-bind (match-form bindings) (expand-main match-form)
        `(let ,(append `((list ,exp)) (simple-pair bindings nil))
               (if (match ,match-form)
  