(defmacro my-and ([] true) ([exp] exp) ([exp1 & exps] `(let [t# ~exp1] (if t# (my-and ~@exps) t#)))) (defmacro debug [exp] `(let [t# ~exp] (println (quote ~exp) "=>" t#) t#)) (defn switch-aux [t lst] (if (= 1 (count lst)) (first lst) `(if (= ~t ~(first lst)) ~(second lst) ~(switch-aux t (rest (rest lst)))))) (defmacro switch [exp & others] (switch-aux (eval exp) others))