fork download
  1. (defun morris-counter ()
  2. "Returns a closure which accepts two messages
  3. :PLUS - probabilistically increments counter
  4. :SIZE - returns approximate # of times :PLUS was sent
  5. Any other message raises an error."
  6. (let ((c 0))
  7. (lambda (msg)
  8. (ecase msg
  9. (:plus (when (zerop (random (expt 2 c)))
  10. (incf c)))
  11. (:size (1- (expt 2 c)))))))
  12.  
  13. (defvar *mc* (morris-counter))
  14. (dotimes (i 12 t) (funcall *mc* :plus))
  15. (pprint (funcall *mc* :size))
Success #stdin #stdout 0.01s 10712KB
stdin
Standard input is empty
stdout
31