diff --git a/src/main/clojure/clojure/core/logic.clj b/src/main/clojure/clojure/core/logic.clj index 4e47d36..fe1e943 100644 --- a/src/main/clojure/clojure/core/logic.clj +++ b/src/main/clojure/clojure/core/logic.clj @@ -1,6 +1,6 @@ (ns clojure.core.logic (:refer-clojure :exclude [==]) - (:use [clojure.walk :only [postwalk]]) + (:use [clojure.walk :only [postwalk macroexpand-all]]) (:require [clojure.set :as set]) (:import [java.io Writer])) @@ -1289,7 +1289,8 @@ ~@exprs)))) (defn- ex* [[[p a :as pa] & par] exprs seen] - (let [t (p->term p) + (let [p (macroexpand-all p) + t (p->term p) vs (extract-vars p seen) seen (reduce conj seen vs)] (cond diff --git a/src/test/clojure/clojure/core/logic/tests.clj b/src/test/clojure/clojure/core/logic/tests.clj index 6fa1aa5..025b23c 100644 --- a/src/test/clojure/clojure/core/logic/tests.clj +++ b/src/test/clojure/clojure/core/logic/tests.clj @@ -1287,4 +1287,22 @@ (deftest nil-or-false-in-stream [] (is (= (take 1 (take* (to-stream [nil false (cons empty-s nil)]))) - (cons empty-s nil)))) \ No newline at end of file + (cons empty-s nil)))) + +;; ============================================================================= +;; let ex* expand macros in patterns +(defmacro macro-test-example [a] `[:macro-test ~a]) +(deftest expand-macros-before-extracting-vars + (is (= (macroexpand + '(clojure.core.logic/defna test [A B] + ([(clojure.core.logic.tests/macro-test-example :test) + (clojure.core.logic.tests/macro-test-example _)] + ; -> + (== B (clojure.core.logic.tests/macro-test-example :test))))) + ; vs + (macroexpand + '(clojure.core.logic/defna test [A B] + ([[:macro-test :test] + [:macro-test _]] + ; -> + (== B (clojure.core.logic.tests/macro-test-example :test)))))))) \ No newline at end of file