From f1fb3ffcd1e5c7071a2cfab494a1747b9c015b9f Mon Sep 17 00:00:00 2001 From: Jason Jackson Date: Sun, 13 May 2012 11:03:17 -0400 Subject: [PATCH][BUILD] allow defrel to be called from within a function, if that function is called multiple times, the associated state of relation is cleared each time Signed-off-by: Jason Jackson --- src/main/clojure/clojure/core/logic.clj | 16 +++++++++------- 1 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/main/clojure/clojure/core/logic.clj b/src/main/clojure/clojure/core/logic.clj index dc70888..ce22991 100644 --- a/src/main/clojure/clojure/core/logic.clj +++ b/src/main/clojure/clojure/core/logic.clj @@ -1483,7 +1483,7 @@ (defn- ->sym [& args] (symbol (apply str args))) -(defn- defrel-helper [name arity args] +(defn- defrel-helper [ns name arity args] (let [r (range 1 (+ arity 2)) arity-excs (fn [n] `(arity-exc-helper '~name ~n))] (if (seq args) @@ -1491,12 +1491,12 @@ (def ~name (.withMeta (~'clojure.core.logic.Rel. '~name (atom {}) nil ~@(map arity-excs r)) - {:ns ~'*ns*})) + {:ns (find-ns (quote ~(.name ns)))})) (extend-rel ~name ~@args)) `(def ~name (.withMeta (~'clojure.core.logic.Rel. '~name (atom {}) nil ~@(map arity-excs r)) - {:ns ~'*ns*}))))) + {:ns (find-ns (quote ~(.name ns)))}))))) (defmacro def-apply-to-helper [n] (let [r (range 1 (clojure.core/inc n)) @@ -1556,8 +1556,8 @@ (defmacro ~'defrel "Define a relation for adding facts. Takes a name and some fields. Use fact/facts to add facts and invoke the relation to query it." - [~'name ~'& ~'rest] - (defrel-helper ~'name ~arity ~'rest))))) + [~'name ~'& ~'rest] + (defrel-helper ~'*ns* ~'name ~arity ~'rest))))) (RelHelper 20) @@ -1610,7 +1610,9 @@ (defn facts "Define a series of facts. Takes a vector of vectors where each vector represents a fact tuple, all with the same number of elements." - ([rel [f :as tuples]] (facts rel (count f) tuples)) + ([rel [f :as tuples]] + (if (seq tuples) + (facts rel (count f) tuples))) ([^Rel rel arity tuples] (let [rel-ns (:ns (meta rel)) rel-set (var-get (ns-resolve rel-ns (set-sym (.name rel) arity))) @@ -2086,4 +2088,4 @@ failure." [u v] `(fn [a#] - (!=-verify a# (unify a# ~u ~v)))) \ No newline at end of file + (!=-verify a# (unify a# ~u ~v)))) -- 1.7.4.4