Skip to content

Instantly share code, notes, and snippets.

@rpav
Created May 17, 2017 14:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rpav/b6691aa33dafc664f2698eae7144a87c to your computer and use it in GitHub Desktop.
Save rpav/b6691aa33dafc664f2698eae7144a87c to your computer and use it in GitHub Desktop.
Trivial event handler
(defparameter *handlers* (make-hash-table))
(defun register (ev fun)
(vector-push-extend fun (alexandria:ensure-gethash
ev *handlers*
(make-array 1 :fill-pointer 0
:adjustable t))))
(defun send (type msg from)
(let ((handler-list (gethash type *handlers*)))
(loop for fun across handler-list do
(when (funcall fun type msg from)
(return)))))
(defun my-handler (type msg from)
(format t "Got ~S from ~S (type ~S)~%" msg from type)
nil)
(defun handle-it (type msg from)
(format t "Handled ~S~%" type)
t)
(defun didnt-get-called (type msg from)
(format t "I shouldn't be called")
nil)
(progn
(register 'some-event #'my-handler)
(register 'some-event #'handle-it)
(register 'some-event #'didnt-get-called))
(send 'some-event "foo msg" 'me)
@borodust
Copy link

borodust commented May 17, 2017

vs

(defmessage exit-request ())

(defmessage join-request ())

(defclass message-consumer ()
  ((some-context-here)))

(defmethod receive-message ((this message-consumer) (message exit-request))
  (format t "Exiting: ~S~%" (type-of message)))

(defmethod receive-message ((this message-consumer) (message join-request))
  (format t "Joining: ~S~%" (type-of message)))

;; somewhere in the init code
(defun init ()
  (let ((consumer (make-instance 'message-consumer)))
    (open-connection *host* *port0* consumer)
    (open-connection *host* *port1* consumer)))

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment