anchor.diff:          (values))))
   
   ;; TODO: add timeout and keepalive parameters if it seems reasonable
  -(declaim (ftype (function (rpc-connection id id list &key (:notification boolean))
  -                          blackbird:promise)
  -                invoke-rpc-method))
   (defun invoke-rpc-method (con service method args &key notification)
  +  (check-type con rpc-connection)
     (let ((call (make-call-obj service method args :notification notification)))
       (declare (special *rpc-batch*))
       (cond
  
positive.code: ;; the stored condition (is it reasonable to re-throw the same
  ;; condition more than once? What if error handling has been done
  ;; in-between?).
  (declaim (ftype (function (rpc-connection id) rpc-result)
                  read-result-with-id))
  (defun read-result-with-id (con id)
    "Read responses from CON, storing results until a request containing
  a response with id ID arrives. Will process all results in a response
  before returning."
    (check-type id id)
    ;; FIXME: This needs a timeout, or we might keep chipmunking results
    ;; forever if the remote end never sends the right id back.
  
negative.code:       (finished (values-list result-vals))
        (t (error 'event-loop-exited "No more events to process")))))
  
  (defun make-call-obj (service method parameters &key notification)
    (check-type service (or symbol string))
    (check-type method (or symbol string))
    (make-rpc-call :service (if (typep service 'string) service (symbol-name service))
                   :method (if (typep method 'string) method (symbol-name method))
                   :args parameters
  