noprompt / meander

Tools for transparent data transformation
MIT License
918 stars 55 forks source link

Bad expansion #194

Closed noprompt closed 3 years ago

noprompt commented 3 years ago

The following bug was reported in Slack and appears to be new in epsilon 626.

(defn bug [expr]
  (m/match expr
           (m/pred number?) {:num expr}
           (?verb & ?args) {:verb ?verb :args (map bug ?args)}
           _ {:any expr}))
(bug '(+ 1 (- 2 3)))
;; => {:any (+ 1 (- 2 3))}

Below is the macroexpansion.

(let*
 [R__26068
  (clojure.core/let
   [T__26061 expr]
   (clojure.core/letfn
    [(state__26064 [] (if (number? T__26061) {:num expr} (state__26065)))
     (state__26065 [] {:any expr})
     (state__26066
      []
      (if
       (clojure.core/seq? T__26061)
       (clojure.core/let
        [T__26061_L__ (clojure.core/take 1 T__26061)]
        (if
         (clojure.core/= (clojure.core/bounded-count 2 T__26061_L__) 1)
         (clojure.core/let
          [T__26061_R__ (clojure.core/drop 1 T__26061)]
          (clojure.core/let
           [T__26061_L___nth_0__ (clojure.core/nth T__26061_L__ 0)]
           (clojure.core/let
            [?verb T__26061_L___nth_0__]
            (clojure.core/let [?args T__26061_R__] {:verb ?verb, :args (map bug ?args)}))))
         (state__26067)))
       (state__26067)))
     (state__26067 [] {:any expr})]
    (state__26064)))]
 (if
  (meander.match.runtime.epsilon/fail? R__26068)
  (throw (clojure.core/ex-info "non exhaustive pattern match" {}))
  R__26068))