(defun morris-counter ()
  "Returns a closure which accepts two messages
     :PLUS - probabilistically increments counter
     :SIZE - returns approximate # of times :PLUS was sent
   Any other message raises an error."
  (let ((c 0))
    (lambda (msg)
      (ecase msg
        (:plus (when (zerop (random (expt 2 c)))
                 (incf c)))
        (:size (1- (expt 2 c)))))))

(defvar *mc* (morris-counter))
(dotimes (i 12 t) (funcall *mc* :plus))
(pprint (funcall *mc* :size))