Thanks, Let me study this a bit. Maybe I have additional questions. ranko
On Saturday, February 8, 2014 12:01:37 PM UTC-5, juan.facorro wrote: > > 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.