anchor.diff:    "Lookup the macro NAME in the current macro expansion
   environment. Returns the macro and the parent macro environment of
   this macro."
  +  (unless (symbolp name)
  +    (return-from lookup-macro nil))
     (do ((env *js-macro-env* (cdr env)))
         ((null env) nil)
  -    (let ((val (gethash name (car env))))
  +    (let ((val (gethash (symbol-name name) (car env))))
         (when val
   	(return-from lookup-macro
   	  (values val (or (cdr env)
  
positive.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 ',name *js-compiler-macros*) #',js-name))))
  
  (defun js-compiler-macro-form-p (form)
    (when (gethash (car form) *js-compiler-macros*)
      t))
  
  (defun js-get-compiler-macro (name)
    (gethash name *js-compiler-macros*))
  
  ;;; macro expansion
  
  (eval-when (:compile-toplevel :load-toplevel :execute)
    (defvar *js-macro-toplevel* (make-hash-table)
      "Toplevel of macro expansion, holds all the toplevel javascript macros.")
    (defvar *js-macro-env* (list *js-macro-toplevel*)
      "Current macro environment."))
  
negative.code: 
  (defmacro defjsmacro (name args &rest body)
    "Define a javascript macro, and store it in the toplevel macro environment."
    (when (gethash (symbol-name name) *js-compiler-macros*)
      (warn "Redefining compiler macro ~S" name)
      (remhash (symbol-name name) *js-compiler-macros*))
    (let ((lambda-list (gensym)))
      `(setf (gethash ,(symbol-name name) *js-macro-toplevel*)
        #'(lambda (&rest ,lambda-list)
  	  (destructuring-bind ,args ,lambda-list ,@body)))))
    
  