Hello,

Can this construct handle higher-order functions?
(I mean a function with named arguments as an argument to another
function).
It seems quite difficult to do a function dependent transformation on
the call site when the function is unknown.

Best regards,

Nicolas.

On Thu, 2009-07-16 at 18:46 -0700, Mark Addleman wrote:
> 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