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