anchor.diff:  ;;; macros
   
   (define-js-compiler-macro macrolet (macros &rest body)
  -  (let* ((macro-env (make-hash-table))
  +  (let* ((macro-env (make-hash-table :test 'equal))
   	 (*js-macro-env* (cons macro-env *js-macro-env*)))
       (dolist (macro macros)
         (destructuring-bind (name arglist &rest body) macro
  -	(setf (gethash name macro-env)
  +	(setf (gethash (symbol-name name) macro-env)
   	      (compile nil `(lambda ,arglist ,@body)))))
       (js-compile `(progn ,@body))))
   
  
positive.code: ;;; compiler macros
  
  (eval-when (:compile-toplevel :load-toplevel :execute)
    (defvar *js-compiler-macros* (make-hash-table)
      "*JS-COMPILER-MACROS* is a hash-table containing the functions corresponding
  to javascript special forms, indexed by their name. Javascript special
  forms are compiler macros for JS expressions."))
  
  
negative.code:   (let ((js-name (intern (concatenate 'string "JS-" (symbol-name name)) #.*package*)))
      `(eval-when (:compile-toplevel :load-toplevel :execute)
        (defun ,js-name ,lambda-list ,@body)
        (setf (gethash ,(symbol-name name) *js-compiler-macros*) #',js-name))))
  
  (defun js-compiler-macro-form-p (form)
    (when (gethash (symbol-name (car form)) *js-compiler-macros*)
      t))
  
  (defun js-get-compiler-macro (name)
    (gethash (symbol-name name) *js-compiler-macros*))
  
  ;;; macro expansion
  
  (eval-when (:compile-toplevel :load-toplevel :execute)
    (defvar *js-macro-toplevel* (make-hash-table :test 'equal)
      "Toplevel of macro expansion, holds all the toplevel javascript macros.")
    (defvar *js-macro-env* (list *js-macro-toplevel*)
      "Current macro environment."))
  