On Saturday, January 24, 2015 at 1:43:15 PM UTC-5, Elric Erkose wrote:
>
> Hello,
>
> I have an app which specifies a protocol and a record name. At runtime, it 
> searches the classpath for files implementing the specification and creates 
> a map of namespace to instance for each. Before I implemented the protocol, 
> I just specified function names. I was able to lookup the function names 
> and call them. After I switched to using a protocol, I get a 
> CompilerException.
>
> Here's the question: How do I instantiate a known record from an unknown 
> namespace?
>
> Here is the sample code. Thanks for you help.
>
> ```clojure
> (ns proto)
>
> (defprotocol Proto
>   (meth [this]))
>
> ;; use clojure.tools.namespace.find to locate the namespace.
> ;; for simplicity, we just def it here.
> (def that 'rec)
>
> (require that)
>
> ;; the symbol "Rec" is part of the specification
> (let [inst (ns-resolve that (symbol "Rec"))]
>   (when (class? inst)
>     (println "inst:" (type inst) inst)
>     ;; => java.lang.Class rec.Rec
>     
>     (println "meth:" (meth (new rec.Rec)))
>     ;; => it works when I know it.
>
>     ;; uncomment this for a CompilerException
>     ;;(println "meth:" (meth (new inst)))
>     ;; => CompilerException java.lang.IllegalArgumentException:
>     ;;      Unable to resolve classname: inst, compiling:(proto.clj:21:28)
>     ))
> ```
>
> ```clojure
> (ns rec
>   (:require proto))
>
> (defrecord Rec []
>   proto.Proto
>   (meth [this] "it works when I know it"))
> ```
>

The new special form doesn't evaluate its argument, so "inst" results in 
looking for a classname of "inst", not whatever inst is bound to. (eval 
`(new ~inst)) might work though. 

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
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 clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to