When writing a somewhat complex macro, it is always a good idea to start by
writing the code you would like to write (using the macro), rather than
begin with the implementation.

Could you perhaps provide an example use of the macro you would like to
have? Not one that works, obviously, but what you would like to be able to
write.


On 8 February 2014 18:01, juan.facorro <juan.faco...@gmail.com> 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.
>

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

Reply via email to