From 6dd773b43b4ef14ee4fa2d774f0235d33e171410 Mon Sep 17 00:00:00 2001 From: sparkofreason Date: Mon, 18 Dec 2017 07:45:09 -0800 Subject: [PATCH] Allow keyword names for productions (CLJS only). --- src/main/clojure/clara/macros.clj | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/main/clojure/clara/macros.clj b/src/main/clojure/clara/macros.clj index bbeba979..da2c6eab 100644 --- a/src/main/clojure/clara/macros.clj +++ b/src/main/clojure/clara/macros.clj @@ -43,6 +43,15 @@ (coll? source) (seq source) :else (throw (IllegalArgumentException. "Unknown source value type passed to defsession")))) +;;; ident functions added to clojure.core in 1.9 +(defn ident? + "Return true if x is a symbol or keyword" + [x] (or (keyword? x) (symbol? x))) + +(defn qualified-keyword? + "Return true if x is a symbol or keyword with a namespace" + [x] (and (keyword? x) (namespace x) true)) + (defn build-rule [name & body] (let [doc (if (string? (first body)) (first body) nil) @@ -50,9 +59,10 @@ properties (if (map? (first body)) (first body) nil) definition (if properties (rest body) body) {:keys [lhs rhs]} (dsl/split-lhs-rhs definition) + name (if (qualified-keyword? name) name (str (clojure.core/name (com/cljs-ns)) "/" (clojure.core/name name))) production (cond-> (dsl/parse-rule* lhs rhs properties {}) - name (assoc :name (str (clojure.core/name (com/cljs-ns)) "/" (clojure.core/name name))) + name (assoc :name name) doc (assoc :doc doc))] production)) @@ -71,9 +81,10 @@ (let [doc (if (string? (first body)) (first body) nil) binding (if doc (second body) (first body)) definition (if doc (drop 2 body) (rest body)) + name (if (qualified-keyword? name) name (str (clojure.core/name (com/cljs-ns)) "/" (clojure.core/name name))) query (cond-> (dsl/parse-query* binding definition {}) - name (assoc :name (str (clojure.core/name (com/cljs-ns)) "/" (clojure.core/name name))) + name (assoc :name name) doc (assoc :doc doc))] query))