anchor.diff:               (keymap->map keymap))
       (sort result #'string<)))
   
  -(declaim (ftype (function (symbol &rest keymap) list) symbol-keys))
  -(defun symbol-keys (symbol &rest keymaps) ; TODO: Return hash-table or alist?
  +(declaim (ftype (function (symbol keymap &rest keymap) list) symbol-keys))
  +(defun symbol-keys (symbol keymap &rest more-keymaps) ; TODO: Return hash-table or alist?
     "Return a the list of `keyspec's bound to SYMBOL in KEYMAP."
     (coerce (alex:mappend (lambda (keymap)
                             (let ((hit (symbol-keys* symbol keymap)))
                               (when hit
                                 (mapcar (alex:rcurry #'list keymap) hit))))
  -                        keymaps)
  +                        (cons keymap more-keymaps))
             'list))
   
   ;; TODO: Remap binding, e.g.
  
positive.code:                   :initial-value (fset:empty-map))
       'fset:map)))
  
  (declaim (ftype (function (&rest keymap) hash-table) keymap->map))
  (defun keymap->map (&rest keymaps)
    "Return a hash-table of (KEYSPEC SYM) from KEYMAP.
  Parent bindings are not listed; see `keymap-with-parents->map' instead.
  This is convenient if the caller wants to list all the bindings.
  When multiple keymaps are provided, return the union of the `fset:map' of each arguments.
  Keymaps are ordered by precedence, highest precedence comes first."
    (let ((keymaps (reverse keymaps)))
      (coerce
       (fset:convert 'hash-table
                     (reduce #'fset:map-union
  
negative.code: ;; We can verify this with:
  ;;
  ;;   (compile 'foo (lambda () (keymap::define-key keymap "C-x C-f" 'find-file)))
  (defmacro define-key (keymap binding sym &rest more-binding-sym-pairs)
    "Bind BINDING to SYM in KEYMAP.
  Return KEYMAP.
  
  