Mercurial > lasercutter
diff 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 |
line wrap: on
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/src/clojure/contrib/agent_utils.clj Sat Aug 21 06:25:44 2010 -0400 1.3 @@ -0,0 +1,35 @@ 1.4 +; Copyright (c) Christophe Grand, November 2008. All rights reserved. 1.5 + 1.6 +; The use and distribution terms for this software are covered by the 1.7 +; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php) 1.8 +; which can be found in the file epl-v10.html at the root of this 1.9 +; distribution. 1.10 +; By using this software in any fashion, you are agreeing to be bound by 1.11 +; the terms of this license. 1.12 +; You must not remove this notice, or any other, from this software. 1.13 + 1.14 +;; misc agent utilities 1.15 + 1.16 +;; note to other contrib members: feel free to add to this lib 1.17 + 1.18 +(ns 1.19 + ^{:author "Christophe Grande", 1.20 + :doc "Miscellaneous agent utilities 1.21 + (note to other contrib members: feel free to add to this lib)", 1.22 +} 1.23 + clojure.contrib.agent-utils) 1.24 + 1.25 +(defmacro capture-and-send 1.26 + "Capture the current value of the specified vars and rebind 1.27 + them on the agent thread before executing the action. 1.28 + 1.29 + Example: 1.30 + (capture-and-send [*out*] a f b c)" 1.31 + 1.32 + [vars agent action & args] 1.33 + (let [locals (map #(gensym (name %)) vars)] 1.34 + `(let [~@(interleave locals vars) 1.35 + action# (fn [& args#] 1.36 + (binding [~@(interleave vars locals)] 1.37 + (apply ~action args#)))] 1.38 + (send ~agent action# ~@args))))