annotate src/clojure/contrib/agent_utils.clj @ 10:ef7dbbd6452c

added clojure source goodness
author Robert McIntyre <rlm@mit.edu>
date Sat, 21 Aug 2010 06:25:44 -0400
parents
children
rev   line source
rlm@10 1 ; Copyright (c) Christophe Grand, November 2008. All rights reserved.
rlm@10 2
rlm@10 3 ; The use and distribution terms for this software are covered by the
rlm@10 4 ; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php)
rlm@10 5 ; which can be found in the file epl-v10.html at the root of this
rlm@10 6 ; distribution.
rlm@10 7 ; By using this software in any fashion, you are agreeing to be bound by
rlm@10 8 ; the terms of this license.
rlm@10 9 ; You must not remove this notice, or any other, from this software.
rlm@10 10
rlm@10 11 ;; misc agent utilities
rlm@10 12
rlm@10 13 ;; note to other contrib members: feel free to add to this lib
rlm@10 14
rlm@10 15 (ns
rlm@10 16 ^{:author "Christophe Grande",
rlm@10 17 :doc "Miscellaneous agent utilities
rlm@10 18 (note to other contrib members: feel free to add to this lib)",
rlm@10 19 }
rlm@10 20 clojure.contrib.agent-utils)
rlm@10 21
rlm@10 22 (defmacro capture-and-send
rlm@10 23 "Capture the current value of the specified vars and rebind
rlm@10 24 them on the agent thread before executing the action.
rlm@10 25
rlm@10 26 Example:
rlm@10 27 (capture-and-send [*out*] a f b c)"
rlm@10 28
rlm@10 29 [vars agent action & args]
rlm@10 30 (let [locals (map #(gensym (name %)) vars)]
rlm@10 31 `(let [~@(interleave locals vars)
rlm@10 32 action# (fn [& args#]
rlm@10 33 (binding [~@(interleave vars locals)]
rlm@10 34 (apply ~action args#)))]
rlm@10 35 (send ~agent action# ~@args))))