From e1b41b49e40428d6639e45d7e1b95f764695548f Mon Sep 17 00:00:00 2001 From: Fogus Date: Wed, 16 Jun 2021 13:02:46 -0400 Subject: [PATCH 1/6] first cut. no special resolutions --- src/main/clojure/clojure/tools/build/api.clj | 41 ++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/src/main/clojure/clojure/tools/build/api.clj b/src/main/clojure/clojure/tools/build/api.clj index 770476a..4904007 100644 --- a/src/main/clojure/clojure/tools/build/api.clj +++ b/src/main/clojure/clojure/tools/build/api.clj @@ -242,3 +242,44 @@ (assert-required "install" params [:basis :lib :version :jar-file :class-dir]) ((requiring-resolve 'clojure.tools.build.tasks.install/install) params)) + +;; deflinked + +(defmacro deflinked + [nom targets] + `(defn ~nom + [params#] + (let [to# (:to params#)] + (loop [p# params# + remaining# ~targets] + (let [target# (first remaining#)] + (if target# + (let [nextp# (target# p#)] + (if (and nextp# (= (symbol (resolve to#)) (symbol (resolve target#)))) + nextp# + (recur nextp# (rest remaining#)))) + p#)))))) + +(comment + + (defn a [_] (println "A")) + (defn b [_] (println "B")) + (defn c [_] (println "C")) + + (macroexpand-1 '(deflinked abclink [a b c])) + + (deflinked abclink [a b c]) + + (defn abclink [params] + (let [to (:to params)] + (loop [p params remaining [a b c]] + (let [target (first remaining)] + (if target + (let [nextp (target p)] + (if (= (symbol (resolve to)) (symbol (resolve target))) + nextp + (recur nextp (rest remaining)))) + p))))) + + +) From 856b81bc0264544e6b63b5171f3e80a7da139ef8 Mon Sep 17 00:00:00 2001 From: Fogus Date: Wed, 16 Jun 2021 15:56:34 -0400 Subject: [PATCH 2/6] WiP --- deps.edn | 2 +- src/main/clojure/clojure/tools/build/api.clj | 16 +++++++++++----- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/deps.edn b/deps.edn index d999f8e..69748b2 100644 --- a/deps.edn +++ b/deps.edn @@ -2,7 +2,7 @@ :deps {org.clojure/clojure {:mvn/version "1.10.3"} - org.clojure/tools.deps.alpha {:mvn/version "0.11.905"} + org.clojure/tools.deps.alpha {:mvn/version "0.11.923-SNAPSHOT"} ;org.clojure/tools.deps.alpha {:git/url "https://github.com/clojure/tools.deps.alpha.git" :sha "6bd58578605212ce2ffec4ad666492d76ff8ef65"} org.clojure/tools.namespace {:mvn/version "1.0.0"} org.slf4j/slf4j-nop {:mvn/version "1.7.25"} diff --git a/src/main/clojure/clojure/tools/build/api.clj b/src/main/clojure/clojure/tools/build/api.clj index 4904007..06de0f5 100644 --- a/src/main/clojure/clojure/tools/build/api.clj +++ b/src/main/clojure/clojure/tools/build/api.clj @@ -3,7 +3,8 @@ [clojure.java.io :as jio] [clojure.set :as set] [clojure.string :as str] - [clojure.tools.build.util.file :as file]) + [clojure.tools.build.util.file :as file] + [clojure.tools.cli.help :as cli]) (:import [java.io File])) @@ -247,15 +248,20 @@ (defmacro deflinked [nom targets] - `(defn ~nom - [params#] - (let [to# (:to params#)] + `(defn ~nom [params#] + (let [to# (:to params#) + ns-defs# (merge params# (cli/garner-ns-defaults)) + ns-default# (:ns-default ns-defs#) + ns-aliases# (:ns-aliases ns-defs#)] + (println :====> ns-defs#) (loop [p# params# remaining# ~targets] (let [target# (first remaining#)] (if target# (let [nextp# (target# p#)] - (if (and nextp# (= (symbol (resolve to#)) (symbol (resolve target#)))) + (if (and nextp# + (= (symbol (resolve to#)) + (symbol (resolve target#)))) nextp# (recur nextp# (rest remaining#)))) p#)))))) From af498635aa6a1ccc1fe3ea7e066f0800d9e18bba Mon Sep 17 00:00:00 2001 From: Fogus Date: Thu, 17 Jun 2021 09:15:30 -0400 Subject: [PATCH 3/6] qualifying given symbols --- src/main/clojure/clojure/tools/build/api.clj | 22 +++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/main/clojure/clojure/tools/build/api.clj b/src/main/clojure/clojure/tools/build/api.clj index 06de0f5..fddb989 100644 --- a/src/main/clojure/clojure/tools/build/api.clj +++ b/src/main/clojure/clojure/tools/build/api.clj @@ -243,23 +243,29 @@ (assert-required "install" params [:basis :lib :version :jar-file :class-dir]) ((requiring-resolve 'clojure.tools.build.tasks.install/install) params)) +(defn- qualify-fn-symbols [syms] + (let [ns-defs (cli/garner-ns-defaults) + ns-default (:ns-default ns-defs) + ns-aliases (:ns-aliases ns-defs)] + (vec + (map #(-> % + (cli/qualify-fn ns-aliases ns-default) + requiring-resolve) + syms)))) ;; deflinked (defmacro deflinked [nom targets] `(defn ~nom [params#] - (let [to# (:to params#) - ns-defs# (merge params# (cli/garner-ns-defaults)) - ns-default# (:ns-default ns-defs#) - ns-aliases# (:ns-aliases ns-defs#)] - (println :====> ns-defs#) + (let [to# (:to params#)] (loop [p# params# - remaining# ~targets] + remaining# ~(qualify-fn-symbols targets)] (let [target# (first remaining#)] (if target# - (let [nextp# (target# p#)] - (if (and nextp# + (let [nextp# (do (print "CALL ") (target# p#))] + (println {:p nextp#, :tgt target# :to to# :rem remaining#}) + (if (and to# (= (symbol (resolve to#)) (symbol (resolve target#)))) nextp# From 4b8cf125454b284940d96d7cc482fb8e3b92c241 Mon Sep 17 00:00:00 2001 From: Fogus Date: Thu, 17 Jun 2021 09:57:36 -0400 Subject: [PATCH 4/6] WiP: resolution already occurred, so no need to do again. --- src/main/clojure/clojure/tools/build/api.clj | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/main/clojure/clojure/tools/build/api.clj b/src/main/clojure/clojure/tools/build/api.clj index fddb989..6752049 100644 --- a/src/main/clojure/clojure/tools/build/api.clj +++ b/src/main/clojure/clojure/tools/build/api.clj @@ -243,7 +243,7 @@ (assert-required "install" params [:basis :lib :version :jar-file :class-dir]) ((requiring-resolve 'clojure.tools.build.tasks.install/install) params)) -(defn- qualify-fn-symbols [syms] +(defn qualify-fn-symbols [syms] (let [ns-defs (cli/garner-ns-defaults) ns-default (:ns-default ns-defs) ns-aliases (:ns-aliases ns-defs)] @@ -258,7 +258,7 @@ (defmacro deflinked [nom targets] `(defn ~nom [params#] - (let [to# (:to params#)] + (let [[to#] (when-let [t# (:to params#)] (qualify-fn-symbols [t#]))] (loop [p# params# remaining# ~(qualify-fn-symbols targets)] (let [target# (first remaining#)] @@ -266,14 +266,12 @@ (let [nextp# (do (print "CALL ") (target# p#))] (println {:p nextp#, :tgt target# :to to# :rem remaining#}) (if (and to# - (= (symbol (resolve to#)) - (symbol (resolve target#)))) + (= to# target#)) nextp# (recur nextp# (rest remaining#)))) p#)))))) (comment - (defn a [_] (println "A")) (defn b [_] (println "B")) (defn c [_] (println "C")) From aeff2e1764bddcdc30a825149bae0ba1c06ed547 Mon Sep 17 00:00:00 2001 From: Fogus Date: Thu, 17 Jun 2021 10:44:48 -0400 Subject: [PATCH 5/6] return original syms when ambient ns-* vars are nil --- src/main/clojure/clojure/tools/build/api.clj | 47 +++++++++----------- 1 file changed, 22 insertions(+), 25 deletions(-) diff --git a/src/main/clojure/clojure/tools/build/api.clj b/src/main/clojure/clojure/tools/build/api.clj index 6752049..991cb9a 100644 --- a/src/main/clojure/clojure/tools/build/api.clj +++ b/src/main/clojure/clojure/tools/build/api.clj @@ -247,11 +247,13 @@ (let [ns-defs (cli/garner-ns-defaults) ns-default (:ns-default ns-defs) ns-aliases (:ns-aliases ns-defs)] - (vec - (map #(-> % - (cli/qualify-fn ns-aliases ns-default) - requiring-resolve) - syms)))) + (if (or ns-default ns-aliases) + (vec + (map #(-> % + (cli/qualify-fn ns-aliases ns-default) + requiring-resolve) + syms)) + syms))) ;; deflinked @@ -263,33 +265,28 @@ remaining# ~(qualify-fn-symbols targets)] (let [target# (first remaining#)] (if target# - (let [nextp# (do (print "CALL ") (target# p#))] - (println {:p nextp#, :tgt target# :to to# :rem remaining#}) - (if (and to# - (= to# target#)) + (let [nextp# (target# p#)] + (if (and to# (= to# target#)) nextp# (recur nextp# (rest remaining#)))) p#)))))) (comment - (defn a [_] (println "A")) - (defn b [_] (println "B")) - (defn c [_] (println "C")) + (defn a [p] (println "A") p) + (defn b [p] (println "B") p) + (defn c [p] (println "C") p) (macroexpand-1 '(deflinked abclink [a b c])) - (deflinked abclink [a b c]) - (defn abclink [params] - (let [to (:to params)] - (loop [p params remaining [a b c]] - (let [target (first remaining)] - (if target - (let [nextp (target p)] - (if (= (symbol (resolve to)) (symbol (resolve target))) - nextp - (recur nextp (rest remaining)))) - p))))) - - + (let [[to] (when-let [t (:to params)] (clojure.tools.build.api/qualify-fn-symbols [t]))] + (loop [parms params + remaining-tasks [build/a build/b build/c]] + (let [task (first remaining-tasks)] + (if task + (let [ret (task parms)] + (if (and to (= to task)) + ret + (recur ret (rest remaining-tasks)))) + parms))))) ) From 5d39b447db63da01d3cc427b657bcfe8e0eb8827 Mon Sep 17 00:00:00 2001 From: Fogus Date: Thu, 17 Jun 2021 11:47:00 -0400 Subject: [PATCH 6/6] docstring for deflinked --- src/main/clojure/clojure/tools/build/api.clj | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/clojure/clojure/tools/build/api.clj b/src/main/clojure/clojure/tools/build/api.clj index 991cb9a..fc7cd3c 100644 --- a/src/main/clojure/clojure/tools/build/api.clj +++ b/src/main/clojure/clojure/tools/build/api.clj @@ -258,6 +258,9 @@ ;; deflinked (defmacro deflinked + "Defines a named, linked set of tasks that can short-circuit execution at + a specific task specified via a :to parameter. Tasks comprising the chain + are execute as if by ->." [nom targets] `(defn ~nom [params#] (let [[to#] (when-let [t# (:to params#)] (qualify-fn-symbols [t#]))]