On Mon, Jan 26, 2009 at 10:03 PM, Daniel Jomphe <[email protected]> wrote:
>
> Perry Trolard wrote:
>
>> You can get the symbol that names the function from the Var's
>> metadata, like:
>>
>> user=> (:name (meta (var =)))
>> =
>
> Thank you Perry.
>
> What is (var ...)? I didn't find it in the api docs, nor in the Vars
> and Environment page.
>
> I'm yet to make your code work for my specific needs:
>
> (defn with-test-report [test fn]
> (let [assert# (first test)
> expect# (second test)
> params# (last test)
> result# (assert# expect# (apply fn params#))]
You are shadowing clojure.core/fn here. Not a problem really, but
perhaps it would be better to use a different name? Oh, and
clojure.core/test.
> (if result#
> (print ".")
> (do (newline)
> (println (format "FAIL: %s" (:name (meta (var
> expect#)))))))
> result#))
I've seen various code snippets where people use something# in
functions. Is there any point to this or gensym except in a macro?
> Exception: Unable to resolve var: expect# in this context
How about using a macro. e.g.:
user=>
(defmacro with-test-report [tst f]
`(let [pred# (first ~tst)
pname# '~(first tst)
expect# (second ~tst)
params# (last ~tst)
result# (pred# expect# (apply ~f params#))]
(if result#
(print ".")
(do (newline)
(println (format "FAIL: [%s %s]" pname# params#))))
result#))
nil
user=> (with-test-report [= 3 [1 3]] +)
FAIL: [= [1 3]]
false
I suppose fn-with-tests could be a macro that calls a function
(with-test-report pname pred expect params f) or something like that.
--
Michael Wood <[email protected]>
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Clojure" group.
To post to this group, send email to [email protected]
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
-~----------~----~----~----~------~----~------~--~---