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.

Reply via email to