Hi all!
Here's a set of macros I have found useful for creating simulated
thread-local bindings for specific agents:
(defmacro bind-agent
"Adds bindings to an agent's metadata"
[#^clojure.lang.Agent a bindings]
(list 'let (vector 'ba# a)
(list 'do (list 'alter-meta!
'ba#
'assoc
:agent-bindings
(list 'quote bindings))
'ba#)))
(defmacro send-bound
"Send to an agent with metadata bindings"
[#^clojure.lang.Agent a fun]
(list 'send
a
(list 'fn ['& 'x#]
(list 'binding (-> a qualify-sym find-var var-get
meta :agent-bindings)
(list 'apply fun 'x#)))))
Where qualify-sym is a private function in clojure.contrib.error-kit
which was referred to me by the helpful chaps in #clojure, and
attributed to Chouser. Example:
user> (def z 1)
#'user/z
user> (def x (bind-agent (agent 1) [z 2]))
#'user/x
user> (+ @x z)
2
user> (send-bound x #(+ % z))
#<ag...@19c205b: 3>
user> @x
3
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Clojure" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---