Yes, you need to revisit the fundamentals of macros. Macros are functions that take in data (the forms), and return data (possibly altered forms).
In your example, you're checking if the expression itself, a list or some kind of value or something is equal to the value 0, at compile-time, then you're returning either the true-expr or the false-expr. Essentially, this will always macro-expand to the false-expr unless you happen to put the literal '0' _ (- 4 2 2) will not work_. Get it? What you probably want is something that will evaluate the test-expr at runtime: I'm too lazy to check if this works: (defmacro if-zero [test-expr true-expr false-expr] (list `if (list `= test-expr 0) true-expr false-expr)) or equivalently (defmacro if-zero [test-expr true-expr false-expr] `(if (= ~test-expr 0) ~true-expr ~false-expr)) On Mon, Jun 16, 2014 at 5:14 PM, Christopher Howard <cmhowa...@alaska.edu> wrote: > Disclosure: I'm rather fascinated with macros (the things they are > supposed to allow us to do), but I'm still rather mystified about how > they actually work. It seems like every time I try to write one, it > rarely behaves anything like I expect. > > Question: Is there any obvious problems with this seemingly innocent > macro?: > > (defmacro if-zero [test-expr true-expr false-expr] > (if (= test-expr 0) true-expr false-expr)) > > It doesn't seem to work the way I would expect when used inside other > functions. > > -- > 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/d/optout. > -- 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/d/optout.