anchor.diff:  
   ;;; cf. https://github.com/HackerNews/API
   
  -(defvar *period* 10 #|seconds|#)
  -(defvar *last-story* nil)
  +(defvar *period* 10 #|seconds|#
  +  "The minimum period for fetching new news from Hacker News.")
  +(defvar *last-story* nil
  +  "The id of the last story sent to the IRC channel.")
   
   (defun monitor-initialize ()
  +  "Initialize the Hacker News monitor.
  +Resets the *LAST-STORY*."
     (unless (find '("application" . "json") *text-content-types*
                   :test (function equalp))
       (push '("application" . "json") *text-content-types*))
     (setf *last-story* nil))
   
   (defun new-stories ()
  -  (multiple-value-bind (value status) (http-request "https://hacker-news.firebaseio.com/v0/newstories.json")
  +  "Fetch and return the list of new stories from the HackerNews API
  +server."
  +  (multiple-value-bind (value status)
  +      (http-request "https://hacker-news.firebaseio.com/v0/newstories.json")
       (when (= 200 status)
         (decode-json-from-string value))))
   
   (defun story (id)
  -  (multiple-value-bind (value status) (http-request (format nil "https://hacker-news.firebaseio.com/v0/item/~A.json" id))
  +  "Fetch and return an a-list containing the data of the story
  +identified by number ID."
  +  (multiple-value-bind (value status)
  +      (http-request (format nil "https://hacker-news.firebaseio.com/v0/item/~A.json" id))
       (when (= 200 status)
         (decode-json-from-string value))))
   
   (defun get-new-stories ()
  +  "Return the list of the new stories IDs that haven't been sent to
  +the IRC server yet, in chronological order."
     (let ((news (new-stories)))
       (if *last-story*
            (reverse (subseq news 0 (or (position *last-story* news) 1)))
           (list (first news)))))
   
  -(defun hn-url (story)
  -  (format nil "https://news.ycombinator.com/item?id=~A" story))
  +(defun hn-url (story-id)
  +  "Return the URL to the HackerNews story page for the given STORY-ID."
  +  (format nil "https://news.ycombinator.com/item?id=~A" story-id))
   
   (defun format-story (story)
  +  "Returns a single line message containing the story title and the story URL,
  +extracted from the give STORY a-list."
     (let ((title  (aget story :title))
           (url    (aget story :url))
           (id     (aget story :id)))
  
positive.code: 
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  
  (defvar *server*   "irc.freenode.org")
  (defvar *nickname* "botihn")
  (defvar *channel*  "#hn")
  (defvar *sources-url* "https://gitlab.com/com-informatimago/com-informatimago/tree/master/small-cl-pgms/botihn/")
  (defvar *connection* nil)
  
  (defun msg-hook (message)
    (when (string= *nickname* (first (arguments message)))
      (privmsg *connection* (source message)
               (format nil "I'm an IRC bot forwarding HackerNews news to ~A; ~
  
negative.code:                                       url)))))
  
  (defun monitor-hacker-news (send)
    "Sends the new news message lines by calling the SEND function.
  Updates the *LAST-STORY* ID."
    (dolist (story (get-new-stories))
      (let ((message (format-story (story story))))
        (when message
  