When you use *`~p* what you are actually doing is using the symbol of the predicate as a function. For example if you call *(partial-pbm f symbol? 1 x 3)*, the quote-unquote (`~) will return the symbol *symbol?* which is not what you want. What you can do is use the *resolve <http://clojuredocs.org/clojure_core/clojure.core/resolve>* function to get the var associated with that symbol, if it exists.
I haven't tried this but the following should work: *(defmacro partial-pbm [f p & args] (let [argseq (flatten args) nargs (vec (filter (resolve p) argseq))]* * `(fn ~nargs (~f ~@argseq))))* Hope it help, Juan On Monday, February 3, 2014 8:09:55 PM UTC-3, r wrote: > > Hello all, > > For various reasons, and despite the convenience of anonymous functions, > I'd like to have a proper positional parameter binding partial function > application. (Actually, > I'd like to have by-name parameter binding, but that's another story.) > > For example, the following seems to work: > > > (defmacro partial-pbm > [f & args] > (let [argseq (flatten args) > nargs (vec (filter symbol? argseq))] > `(fn ~nargs (~f ~@argseq)))) > > > and I can do my partials like: > > > 1. tools.core=> > 2. > 3. tools.core=> (defn f [a b c] (/ a (- b c))) > 4. #'tools.core/f > 5. tools.core=> (partial-pbm f 1 x 3) > 6. #<core$eval2368$fn__2369 tools.core$eval2368$fn__2369@2d7cdb8> > 7. tools.core=> ((partial-pbm f 1 x 3) 2) > 8. -1 > 9. tools.core=> (f 1 2 3) > 10. -1 > 11. tools.core=> > > > And it is almost ok. However, I'd like to be able to pass in the > predicate that should recognize what the resulting function's new formal > params > should be. In other words I'd like "symbol?" in the macro definition above > to > be passed in. This brings me to the first, general, question (about > macros): > > This means that some of the invocation arguments to this macro should be > evaluated, and some should not (e.g. the one specifying the predicate > should > be evaluated/dereferenced to enable filtering, but the one specifying the > new formal parameters and constants for the rest should not, until the > unbound variables in that param are safely captured in the param list of > the (fn ...) form). How is this, usually, resolved? Eval? > > In other words: If there is a need to do some computation _before_ the > quoted (template) form of the macro, how is it usually done? Most > macros I've seen start with the quoted form. > > Now, my various attempts to make this work have been quite confusing > (and I thought I almost got this ...). > > First, it seems that the quote must move to the beginning, because > I can't find a way to refer to the actual function (predicate) passed, > not its symbol. Something like this fails: > > (defmacro partial-pbm > [f p & args] > (let [argseq (flatten args) > nargs (vec (filter `~p argseq))] > ...) > > > which made me realize I don't understand the scope of `/~. > > I can calculate this properly by: > > (defmacro ppbm > [f vp & argdef] > `(let [argseq# (flatten '~argdef) > nargs# (vec (filter ~vp argseq#))] > > (fn nargs# (~f argseq#)))) > > But this fails to compile with > > CompilerException java.lang.IllegalArgumentException: Parameter > declaration f should be a vector, > compiling:(/tmp/form-init5231854403593049721.clj:1:1) , > > and I'm unsure why. This type of error is obtained when one forgets [] > parameter list in fn form. > But if I try to print or examine (class, ..) stuff passed to (fn ...) form > they seem correct. Furthermore, > this does not look all that different from the functional version at the > beginning. > > I'm going to InfoQ to re-watch all Macros talks, but if someone could > kick-start me on this, it'd be much appreciated. > > Cheers! > -- 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.