On Wednesday, 11 December 2013 14:50:36 UTC, Phillip Lord wrote:
>
> Mikera <mike.r.an...@gmail.com <javascript:>> writes: 
>
> > On Wednesday, 11 December 2013 13:37:24 UTC, Philipp Meier wrote: 
> >> Implementing a clojure protocol will give you fast dispatch on the 
> first 
> >> argument's type. 
> >> 
> > 
> > Very true... it's a tradeoff: 
> > - protocols allow open extension (which doesn't appear to be needed 
> here?) 
> > - instance? checks are even faster (although protocol dispatch is still 
> > pretty fast) 
> > - protocols have some other quirks (e.g. not allowing primitive 
> arguments) 
> > 
> > In the case we have here (a small fixed number of types, no open 
> dispatch 
> > required) I think I would prefer instance? checks (especially given a 
> nice 
> > macro to remove the boilerplate). 
>
>
> Yeah, unfortunately I do need dispatch on primitive arguments, so 
> protocols fail for me. 
>
> I've been trying to get this to work as a macro, but am having problems 
> with this. The instance? check is easy to do, but adding the type hint 
> is much harder; I think that the ^macro expands at read time, so before 
> the macro expands, so it's not possible to construct the type hint. 
>
> I've tried to rewrite this with `with-meta' but can't get this to work 
> either since I think the meta is being added to the value. 
>
> My hope was to get something like this... 
>
> (defn ^IRI iri 
>   [name] 
>   (with-type-hint 
>      [name [String java.net.URL java.io.File]] 
>      (IRI/create name))) 
>
> Am I really the first person to get this problem? 
>
> Phil 
>

Macros that generate type hints can get pretty ugly. I ran into the same 
problem with vectorz-clj

The following pattern ended up working for me: the trick to to create a 
local symbol that you can tag

(defmacro tag-symbol [tag form]
  (let [tagged-sym (vary-meta (gensym "res") assoc :tag tag)]
    `(let [~tagged-sym ~form] ~tagged-sym)))


 

-- 
-- 
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/groups/opt_out.

Reply via email to