Skip to content

Instantly share code, notes, and snippets.

@nbeloglazov
Last active December 19, 2015 03:39
Show Gist options
  • Select an option

  • Save nbeloglazov/5891789 to your computer and use it in GitHub Desktop.

Select an option

Save nbeloglazov/5891789 to your computer and use it in GitHub Desktop.
actors
(def ^:dynamic *self*)
(def ^:dynamic *sender*)
(defn process [f sender message]
(binding [*self* *agent*
*sender* sender]
(f message) f))
(defn tell [actor message]
(send actor process *self* message))
(defmacro defactor [name args & body]
`(def ~name (agent (fn ~args ~@body)
:meta {:name '~name})))
;;; Utility functions
(defn aname [actor]
(-> actor meta :name))
(defn log [& args]
(apply println (aname *self*) "-" args))
;;; Test actors
(defactor ponger [message]
(when (= message :ping)
(log "Got ping from" (aname *sender*))
(tell *sender* :pong)))
(defactor pinger [message]
(case message
:run (do (log "Send ping message")
(tell ponger :ping))
:pong (log "Got pong message")))
;;; Run ping/pong
(tell pinger :run)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment