Hi all,

I've stumbled upon some interesting behaviour regarding macros and
anonymous functions. I couldn't find doco anywhere on this so if you
have any pointers please let me know.

Considering the macro:

(defmacro splicer [a] `(list ~@ a))

What's the expected result of:

(macroexpand-1 '(splicer #(true)))

?

What I am getting now is:

behaviors.t-canary> (macroexpand-1 '(splicer #(true)))
(clojure.core/list fn* [] (true))
behaviors.t-canary> (macroexpand-1 '(splicer (list true)))
(clojure.core/list list true)

I've found this issue while using Midje to test my code. This simple test case:

(fact "splice for lambdas"
      (let [a #(true)]
        (a) => true))

Expands to:

behaviors.t-canary> (macroexpand-1 '(fact "splice is broken for lambdas"
      (let [a #(true)]
        (a) => true)))
(midje.util.wrapping/midje-wrapped (clojure.core/every?
clojure.core/true? (clojure.core/list "splice is broken for lambdas"
(let [a (fn* [] (true))] (midje.util.wrapping/midje-wrapped
(midje.semi-sweet/expect (a) midje.semi-sweet/=> true :file-position
(midje.util.file-position/line-number-known 1)))))))


And results in:
;.;. FAIL at (NO_SOURCE_FILE:1)
;.;.     Expected: true
;.;.       Actual: java.lang.ClassCastException: java.lang.Boolean
cannot be cast to clojure.lang.IFn
;.;.               behaviors.t_canary$eval7514$a__7515.invoke(NO_SOURCE_FILE:1)
;.;.               behaviors.t_canary$eval7514$fn__7517.invoke(NO_SOURCE_FILE:1)

Can anyone shed a light on this? Expected behaviour, bug or am I
missing something?

Cheers
-- 
Phil Calçado
http://fragmental.tw
http://www.fragmental.com.br

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

Reply via email to