On Mon, Sep 7, 2009 at 1:17 AM, Cliff Wells<[email protected]> wrote:
>
> What I've tried (no laughing!) is this bit of code:
>
> (ns site.database
> (:use [compojure])
> (:use [clojure.contrib.sql])
> (:use [site.setup])
>
> (if (= *db-adapter* "mysql")
> (:use [site.adapters.mysql :as adapter]))
> (if (= *db-adapter* "postgresql")
> (:use [site.adapters.postgresql :as adapter])))
>
> But this throws an error:
>
> java.lang.Exception: No such var: clojure.core/if (database.clj:1)
The 'ns' there is a macro call, so the forms inside it don't
have to (and in this case very much do not) follow normal
evaluation rules. That's why (:use ...) does something
other than looking up a keyword in a map, and also why (if
...) doesn't work.
Fortunately, the 'ns' macro expands into a bunch of regular
function calls. You can find out exactly what any macro
expands to by using the 'macroexpand' function:
site.adapters.muser=> (macroexpand '(ns site.database
(:use [compojure])
(:use [site.adapters.mysql :as adapter])))
(do
(clojure.core/in-ns (quote site.database))
(clojure.core/with-loading-context (clojure.core/refer (quote clojure.core))
(clojure.core/use (quote [compojure]))
(clojure.core/use (quote [site.adapters.mysql :as adapter]))))
You can see each (:use ...) clause expands to a call to
a function named 'use'. You can try one of these alone at
the REPL:
(use 'site.adapters.mysql)
So that should be all you need to know to call 'use'
selectively. Outside the 'ns' macro call, after you're done
:use'ing the namespaces that won't change, you can use call
'use' or 'require' inside an 'if'.
> In any case, this code smells funny, even if it were to work. It seems
> I should be able to somehow build a string such as (str "site.adapters."
> *db-adapter*) and use that instead (or something else equally concise).
'use' and 'require' except a symbol instead of a string, so
you could do something like:
(use (symbol (str "site.adapters." *db-adapter*)))
--Chouser
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
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
-~----------~----~----~----~------~----~------~--~---