anchor.diff:      (if (adverbp adverb)
           (result `(:adverb . ,adverb))
           (fail :error (format nil "'~A' is not an adverb." adverb)))))
  -
  -;;;
  -;;; Dialogue
  -;;;
  -(defun to/at-someone ()
  -  (=let* ((at/to (=or (=string "at")
  -                      (=string "to")
  -                      (=string "@")))
  -          (_ (ws))
  -          (target-name (dashed-word)))
  -    (result `(:at/to . ,(concatenate 'string at/to " " target-name)))))
  -
  -;; parenthetical = "(" ("@"|"to"|"at") name | adverb ")"
  -(defun parenthetical ()
  -  (=let* ((_ (=char #\())
  -          (content (=or (to/at-someone) (adverb)))
  -          (_ (=char #\))))
  -    (result `(:parenthetical . ,(cdr content)))))
  -
  -;; dialogue = [parenthetical ws] text
  -(defun dialogue ()
  -  (=let* ((parenthetical (maybe (=prog1 (parenthetical) (ws))))
  -          (dialogue-text (if parenthetical
  -                             (text)
  -                             (=and (=not (=char #\())
  -                                   (text)))))
  -    (result `(:dialogue
  -              (:parenthetical . ,(cdr parenthetical))
  -              (:dialogue . ,dialogue-text)))))
  -
  -(defun parse-dialogue (message)
  -  (let ((results (invoke-parser (either (dialogue) 'error) message)))
  -    (cond ((cdr results)
  -           (error "Parse was ambiguous."))
  -          ((typep (car results) 'error)
  -           (error (car results)))
  -          (t (values (cdr (assoc :dialogue (cdar results)))
  -                     (cdr (assoc :parenthetical (cdar results))))))))
   
   ;;;
   ;;; Full-sentence action parser
  
positive.code:            (error (car results)))
            (t (let ((sentence (cdar results)))
                 (apply #'invoke-verb-command :actor actor (alist-plist sentence)))))))
  
  ;;;
  ;;; Partial-sentence completion
  
negative.code:   (partial-vocabulary-word #'verb-completions))
  (defun partial-adverb ()
    (partial-vocabulary-word #'adverb-completions))
  