anchor.diff:  };
   
   function addMsg() {
  -  var val = $('#what-user-said').val();
  -  $('#what-user-said').val('');
  -  $.get('ajax', { 'f' : 'ADD-MESSAGE', 'msg' : val }, callback);
  +  var action = $('#user-action').val();
  +  var dialogue = $('#user-dialogue').val();
  +  $('#user-action').val('');
  +  $('#user-dialogue').val('');
  +  $.get('ajax', { 'f' : 'ADD-ACTION', 'action' : action, 'dialogue' : dialogue }, callback);
   }
   
   function updateChat() {
  
positive.code:     (<:html
       (<:head
        (<:title "Hello!")
        (<:script :src "http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js" :type "text/javascript")
        (<:script :type "text/javascript" (<:ai "
  function callback(data) {
  
negative.code:      (setf (gethash ,(string name) *ajax-funcs*)
             (defun ,name ,lambda-list ,@body))))
  
  (defajax add-action (action dialogue)
    (add-user-action (session-value 'username) action dialogue)
    (update-chat))
  
  (defun render-user-action (user-action)
    (let ((action (user-action-action user-action))
          (dialogue (user-action-dialogue user-action)))
      (<:div :class "user-entry"
        (if (and (not (emptyp action)) (emptyp dialogue))
            (<:li :class "action"
                 (<:ah action))
            (progn
              (<:li :class "character"
                   (<:ah (user-action-user user-action)))
              (unless (emptyp action)
                (<:li :class "parenthetical"
                     (<:ah "(" action ")")))
              (<:li :class "dialogue"
                   (<:ah
                    (if (emptyp dialogue)
                        "..."
                        dialogue))))))))
  
  (defajax update-chat ()
    (prog1 (with-yaclml-output-to-string
             (mapc #'render-user-action
                   (get-recent-actions (session-value 'last-action-id))))
      (setf (session-value 'last-action-id) *max-action-id*)))
  