Depending on how deep your investment in Compojure is, I've found Silk's ability to derive a path once defined (bidirectional routes) to be quite handy and very clean. I also prefer its general philosophy, though the library's in its early days and I haven't tested it extensively. However, it does appear to provide a nice solution for the problem you're trying to solve. https://github.com/DomKM/silk
On Thu, Oct 23, 2014 at 11:06 PM, James Reeves <[email protected]> wrote: > I have some code that looks like this: > > (ns foo.bar.endpoint.example > (:require [compojure.core :refer [routes GET]] > [duct.util.resource :as resource])) > > (defn endpoint [config] > (routes > (GET "/" [] > (resource/url "foo/bar/endpoint/example/index.html")))) > > In this case the resource/url function acts the same as > clojure.java.io/resource. > > The problem is that I'd like to remove the repetition, so I extended > resource/url with the ability to derive the resource path from a namespace > object. > > (defn endpoint [config] > (routes > (GET "/" [] (resource/url *ns* "index.html")))) > > The problem with this approach is that the *ns* binding changes, and I > want to fix it at compile time. I could write: > > (def this-ns *ns*) > > (defn endpoint [config] > (routes > (GET "/" [] (resource/url this-ns "index.html")))) > > But it's very tempting to use the eval reader form: > > (defn endpoint [config] > (routes > (GET "/" [] #=(resource/url *ns* "index.html")))) > > Or a macro: > > (defn endpoint [config] > (routes > (GET "/" [] (resource/url (this-ns) "index.html")))) > > Alternatively, I could do something with a quoted symbol: > > (defn endpoint [config] > (routes > (GET "/" [] (resource/url `index ".html")))) > > Or a keyword: > > (defn endpoint [config] > (routes > (GET "/" [] (resource/url ::index ".html")))) > > What does everything think is the best solution? > > I must admit I'm tempted to use the eval reader, as it makes it very > explicit as to what's happening, while at the same time being very concise. > > On the other hand, the eval reader isn't often used, and isn't actually > documented in the reader docs, just in the *read-eval* docs. > > - James > > -- > 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 > --- > You received this message because you are subscribed to the Google Groups > "Clojure" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > For more options, visit https://groups.google.com/d/optout. > -- 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 --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
