Interesting !

BTW, I think you can simplify (eval `^(var ~fn)) into (meta (resolve fn)).

Regards,

-- 
Laurent

2009/7/17 Mark Addleman <mark_addle...@bigfoot.com>

>
> A few days ago, Chouser and I had a discussion on IRC about the
> viability of named arguments (a la Smalltalk) for Clojure.  In clojure-
> contrib, there is the macro "defnk" which provides this sort of
> capability, but it's performance characteristics are worse than than
> normal function call.  I wanted to try my hand at a better performing
> macro and here is what I came up with:
>
>   (defmacro named-call [fn & named-args]
>        (let [named-args-map (apply hash-map named-args)
>              meta-data (eval `^(var ~fn))
>              arg-names (:arg-names meta-data)
>              arg-list (for [arg-key arg-names] (get named-args-map arg-
> key))]
>          `(~fn ~...@arg-list)))
>
> It is used on the call site instead of the definition like so:
>
>   (defn subtract [from take] (- from take))
>   (call subtract :from 10 :take 2)
>
> The macro assumes some meta data on the function variable which
> describes the argument list keyed by :arg-names like so:
> (def #^{:arg-names [:from :take]} subtract subtract)
>
> The macro isn't as sophisticated as I'd like yet.  It doesn't deal
> with multiple function signatures and I'd like a way to define default
> values.  I'd also like it to return useful error messages if the
> caller's signature is wrong.
>
> Thanks to Chouser, Rich and others from IRC for helping me with this
> stuff.  Even if the macro isn't all that valuable, I learned a lot
> about Clojure in the process.  If anyone has any suggestions, I'd love
> to hear them.
> >
>

--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---

Reply via email to