Hi Mark, I've used the following macro to achieve something like what
you're doing;
In the file/namespace module (say eg_globs/fns.clj);
(ns eg-globs.fns)
(declare *gravity*)
(defmacro with-grav
[grav & body]
`(let [gr# ~grav]
(binding [*gravity* gr#]
~...@body)))
(defn say-grav []
(prn "Gravity is:" *gravity*))
(defn halve-grav []
(/ *gravity* 2.0))
(defn mult-grav [x]
(* *gravity* x))
Then in the calling module;
(use 'eg-globs.fns)
(with-grav 2.0
(say-grav)
(prn "half:" (halve-grav))
(mult-grav 2.5))
"Gravity is:" 2.0
"half:" 1.0
5.0
(with-grav 1.5
(mult-grav 3.0))
4.5
Hth, Adrian.
On Sun, May 17, 2009 at 4:45 AM, Mark Engelberg
<[email protected]> wrote:
>
> So I've built a file/namespace with several functions. There are
> several globals defined at the top of the file (for example,
> *gravity*) which many of the functions refer to. I made them globals
> precisely because it would have been a pain to thread them through
> every single function that uses them.
>
> Now, I need to maintain two versions of this module. For example,
> let's say I want one module where the *gravity* constant is defined to
> be 1.0, and one where it is defined as 2.0.
>
> I know how to do this in other languages, especially OO ones, but I'm
> scratching my head trying to think of a clean solution in Clojure for
> this seemingly simple problem. I've tried various namespace trickery
> with vars and bindings, but I haven't found a workable solution yet.
> What am I missing? Thanks.
>
> >
>
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---