Hey David,

> I guess its got something to do with the fact that match itself is a macro?

Correct. The match macro just takes the list `(!nil? a)`, which isn't
a valid match form, so it complains about it.

> Is there some other way that I could extend match to only match when the 
> variable is not nil?

Yep! You just need to replace the match macro itself, rather than
trying to change the rows.

Here's my go at it:

(def not-nil? (complement nil?))

(defmacro match-nn [expr & matches]
  (let [add-guard (fn [e]
                    (if (symbol? e)
                      (list e :guard `not-nil?)
                      e))
        guard-row (fn [[cond result]]
                    (if (vector? cond)
                      [(vec (map add-guard cond)) result]
                      [cond result]))
        rows (partition 2 matches)
        new-rows (mapcat guard-row rows)]
    `(match ~expr
            ~@new-rows)))

(defmacro match-pred [expr & matches]
  (let [add-guard (fn [e]
                    (if (and (seq? e)
                             (not= (second e) :guard))
                      (list (second e) :guard (first e))
                      e))
        guard-row (fn [[cond result]]
                    (if (vector? cond)
                      [(vec (map add-guard cond)) result]
                      [cond result]))
        rows (partition 2 matches)
        new-rows (mapcat guard-row rows)]
    `(match ~expr
            ~@new-rows)))



`match-nn` will make sure all matched variables satisfy the `not-nil?`
predicate. `match-pred` will allow you to write guards like `(not-nil?
a)` and have it translated to `(a :guard not-nil?)`.

I hope that helps!

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