Hi all,
I have a core.match pattern that looks something like this:
(def !nil? (complement nil?))
(match [*a* *b*]
[(a :guard !nil?) nil] (dosomething a)
[nil (b :guard !nil?)] (dosomething b)
[(a :guard !nil?) (b :guard !nil?)] (dosomething a b)
:else (throw (Exception. "Not allowed"))
The point is that in every case I guard the variable using !nil?
I would like to shorten my code:
(match [*a* *b*]
[(!nil a) nil] (dosomething a)
[nil (!nil b)] (dosomething b)
[(!nil a) (!nil b) (dosomething a b)
:else (throw (Exception. "Not allowed"))
But I can't figure out how to write the !nil macro.
I've tried:
(defmacro notnil [sym]
`(~sym :guard (complement nil?)))
Which looks right in expansion:
(macroexpand-1 '(!nil foo))
-> (foo :guard (clojure.core/complement clojure.core/nil?))
But I cannot use this in a match:
(let [foo nil bar 2]
(match [foo bar]
[(!nil foo) 2] foo
:else :notfound))
CompilerException java.lang.AssertionError: Invalid list syntax foo in
(!nil foo)
Why!!?!??!
I guess its got something to do with the fact that match itself is a macro?
Is there some other way that I could extend match to only match when the
variable is not nil?
Thanks,
David
--
David Jagoe
[email protected]
+18053284389
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
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