You're viewing version 1.2.0 of macroexpand-all. The latest stable version of Clojure Core is 1.3.0.
1.2.0 Arrow_down_16x16

macroexpand-all

clojure.walk

  • (macroexpand-all form)
Recursively performs all possible macroexpansions in form.

3 Examples top

  • user=> (use 'clojure.walk)
    user=> (macroexpand-all '(-> c (+ 3) (* 2)))
    (* (+ c 3) 2)
  • user=> (use 'clojure.walk)
    
    ; tryclj.com and lazybot on #clojure get the following wrong
    user=> (let [-> inc] (-> 5)) 
    6
    
    ; Below macroexpansion is supposed to result in equivalent code to the above
    user=> (macroexpand-all '(let [-> inc] (-> 5)))
    (let* [-> inc] 5)
    user=> (let* [-> inc] 5)
    5
    
    ; However, as is clear above, it does not
  • ;; differences between macroexpand-1, macroexpand and macroexpand-all 
    
    (require '[clojure.pprint :as pp]
             '[clojure.walk :as walk])
    
    (alter-var-root #'pp/*print-suppress-namespaces* (constantly true))
    
    
    (defmacro plus [n1 n2]
      `(+ ~n1 ~n2))
    
    (pp/pprint (macroexpand-1 '(plus 3 4)))   ;=> (+ 3 4)
    (pp/pprint (macroexpand   '(plus 3 4)))   ;=> (+ 3 4)
    
    
    (defmacro pl [p1 p2]
      `(plus ~p1 ~p2))
    
    (pp/pprint (macroexpand-1 '(pl 3 4)))     ;=> (plus 3 4)
    (pp/pprint (macroexpand   '(pl 3 4)))     ;=> (+ 3 4)
    
    
    (defmacro minus [m1 m2]
      `(- ~m1 ~m2))
    
    (defmacro calc [c1 c2]
      `(pl ~c1 (minus ~c1 ~c2)))
    
    (pp/pprint (macroexpand-1 '(calc 20 30)))
    ;=> (pl 20 (minus 20 30))
    
    (pp/pprint (macroexpand   '(calc 20 30)))
    ;=> (+ 20 (minus 20 30))
    
    (pp/pprint (walk/macroexpand-all '(calc 20 30)))
    ;=> (+ 20 (- 20 30))
Log in to add / edit an example.

See Also top

Log in to add a see also.

Plus_12x12 Minus_12x12 Source clojure/walk.clj:127 top

(defn macroexpand-all
  "Recursively performs all possible macroexpansions in form."
  {:added "1.1"}
  [form]
  (prewalk (fn [x] (if (seq? x) (macroexpand x) x)) form))
Vars in clojure.walk/macroexpand-all: defn fn macroexpand seq?
Used in 0 other vars

Comments top

No comments for macroexpand-all. Log in to add a comment.