From 579accb156cde2a059dce7e2cf34ed696e66547b Mon Sep 17 00:00:00 2001 From: David Miller Date: Sat, 27 Apr 2024 00:24:08 -0400 Subject: [PATCH 01/13] (WIP) conditionalizing for ClojureCLR --- doc/more-dependencies.dot | 42 ++ doc/more-dependencies.png | Bin 0 -> 105753 bytes doc/some-dependencies.dot | 29 + doc/some-dependencies.png | Bin 0 -> 27512 bytes typed/clj.analyzer/deps-clr.edn | 6 + typed/clj.analyzer/src/clojure/core/cache.clj | 663 ++++++++++++++++++ .../src/clojure/core/cache/wrapped.clj | 197 ++++++ .../clj.analyzer/src/clojure/core/memoize.clj | 509 ++++++++++++++ .../src/clojure/data/priority_map.clj | 549 +++++++++++++++ .../src/typed/clj/analyzer/utils.clj | 234 ++++++- typed/cljc.analyzer/deps-clr.edn | 3 + .../src/typed/cljc/analyzer.cljc | 8 +- 12 files changed, 2214 insertions(+), 26 deletions(-) create mode 100644 doc/more-dependencies.dot create mode 100644 doc/more-dependencies.png create mode 100644 doc/some-dependencies.dot create mode 100644 doc/some-dependencies.png create mode 100644 typed/clj.analyzer/deps-clr.edn create mode 100644 typed/clj.analyzer/src/clojure/core/cache.clj create mode 100644 typed/clj.analyzer/src/clojure/core/cache/wrapped.clj create mode 100644 typed/clj.analyzer/src/clojure/core/memoize.clj create mode 100644 typed/clj.analyzer/src/clojure/data/priority_map.clj create mode 100644 typed/cljc.analyzer/deps-clr.edn diff --git a/doc/more-dependencies.dot b/doc/more-dependencies.dot new file mode 100644 index 000000000..f5d8cd5d9 --- /dev/null +++ b/doc/more-dependencies.dot @@ -0,0 +1,42 @@ +strict digraph G { + +rankdir = RL; + +/* here start the interfaces */ + + +{ + node [shape=box]; + + "t.c.analyzer" -> {"tca.passes.annotate-host-expr", + "tca.passes.classify-invoke", + "tca.passes.emit-form", + "tca.passes.infer-tag", + "tca.passes.validate", + "tca.utils" }; + "tca.utils" -> {"clojure.core.memoize", "clojure.java.io"}; + +"tca.passes.analyze-host-expr" -> {"tca.utils" }; +"tca.passes.annotate-host-info" -> {"tca.utils" }; +"tca.passes.annotate-tag" -> {"tca.utils", + "tca.passes.constant-lifter" }; +"tca.passes.beta-reduce" -> { "tca.passes.analyze-host-expr", + "tca.passes.annotate-tag", + "tca.passes.classify-invoke", + "tca.passes.emit-form" }; +"tca.passes.classify-invoke" -> {"tca.utils", + "tca.passes.validate" }; +"tca.passes.constant-lifter" -> {"tca.utils", + "tca.passes.analyze-host-expr" }; +"tca.passes.emit-form"; +"tca.passes.fix-case-test"; +"tca.passes.infer-tag" -> { "tca.utils", + "tca.passes.analyze-host-expr", + "tca.passes.annotate-tag", + "tca.passes.fix-case-test"}; + +"tca.passes.validate" -> { "tca.utils", + "tca.passes.infer-tag" + "tca.passes.analyze-host-expr" }; +} +} \ No newline at end of file diff --git a/doc/more-dependencies.png b/doc/more-dependencies.png new file mode 100644 index 0000000000000000000000000000000000000000..89a0d00413792789fa2a17bfb5eeb93bd69f6c64 GIT binary patch literal 105753 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�KYV{<_$W=8j2%DZ*=IFghyj|Qw{wu1xp z?gdq>_ds=U9o$g;lW7zi+5GUWy3T9?D$&gH%F7z89BrzZmRQC?4m@tmsgEj!w)D%Z zy)r&eo~Zhzz%&Eeq$j5+(K>i|VDecQ)W&uFeXQD_u*k$J#_;W-HbunIf6F#)+7vRR zPP-MoXyMlb!aKCvE}j<&MYz9$`lK;oyXz&X<{Z0x*|IOVEe_G#ZAexJ>Ifu&Lo_}O zdL2$EcqPzg4O)G>f2U=X1>8C~`#(ndK#HF6ssW*~zjZXHPAUp?{~dqEn(;-^PkWon zHRUx+j%n{%3ny#HIup1~sF5IQgIZE`=q#g8VLjn(Nc+n84Jut%oJF~z^fBc8uP!s% zE}sL^Thc7IK+4-XIwcmlRv$k!$7YKq5m!bx+yYn&m$#GE?=~&j&gGB7Ibl0qIRsU4 z`NB~FX@l>*Jv5U!KXUSY-r{;XieagMVKjuq

Py)DXe{0+ZkFAAGcTVbRVtmGP2_ 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

  • 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 {"tca.ast", "tca.utils"}; + "tca.ast" -> {"tca.utils"}; + "tca.utils"; + "tca.env"; + "tca.types" -> {"typed.clojure", "tca.utils"}; + "tca.utils"; + + "tca.passes.add-binding-atom" -> {"tca.ast", "tca.passes.uniquify"}; + "tca.passes.cleanup"; + "tca.passes.constant-lifter" -> {"t.cljc.analyzer", "tca.utils"}; + "tca.passes.elide-meta" -> {"t.cljc.analyzer", "tca.passes.source-info"}; + "tca.passes.emit-form" -> {"tca.passes.uniquify"}; + "tca.passes.source-info" -> {"tca.utils"}; + "tca.passes.uniquify" -> {"tca.ast", "tca.env"}; + +} +} \ No newline at end of file diff --git a/doc/some-dependencies.png b/doc/some-dependencies.png new file mode 100644 index 0000000000000000000000000000000000000000..b314f8e1d94608782a2cdd4a9974fce562532d0d GIT binary patch literal 27512 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 T%KF#$QfVF5J(RCued|8}RB12W literal 0 HcmV?d00001 diff --git a/typed/clj.analyzer/deps-clr.edn b/typed/clj.analyzer/deps-clr.edn new file mode 100644 index 000000000..4ae9ff6cb --- /dev/null +++ b/typed/clj.analyzer/deps-clr.edn @@ -0,0 +1,6 @@ +;; DO NOT EDIT! Instead, edit `dev/resources/root-templates/typed/clj.analyzer/deps.edn` and run `./script/regen-selmer.sh` +{:paths ["src"] + :deps { + org.typedclojure/typed.cljc.analyzer {:local/root "../cljc.analyzer" + :deps/manifest :deps}} +} diff --git a/typed/clj.analyzer/src/clojure/core/cache.clj b/typed/clj.analyzer/src/clojure/core/cache.clj new file mode 100644 index 000000000..4fd5e748f --- /dev/null +++ b/typed/clj.analyzer/src/clojure/core/cache.clj @@ -0,0 +1,663 @@ +; Copyright (c) Rich Hickey. All rights reserved. +; The use and distribution terms for this software are covered by the +; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php) +; which can be found in the file epl-v10.html at the root of this distribution. +; By using this software in any fashion, you are agreeing to be bound by +; the terms of this license. +; You must not remove this notice, or any other, from this software. + +(ns ^{:doc "A caching library for Clojure." + :author "Fogus"} + clojure.core.cache + (:require clojure.data.priority-map) + (:import ;;; (java.lang.ref ReferenceQueue SoftReference) + )) ;;; (java.util.concurrent ConcurrentHashMap) + +(set! *warn-on-reflection* true) + +;; # Protocols and Types + +(defprotocol CacheProtocol + "This is the protocol describing the basic cache capability." + (lookup [cache e] + [cache e not-found] + "Retrieve the value associated with `e` if it exists, else `nil` in + the 2-arg case. Retrieve the value associated with `e` if it exists, + else `not-found` in the 3-arg case.") + (has? [cache e] + "Checks if the cache contains a value associated with `e`") + (hit [cache e] + "Is meant to be called if the cache is determined to contain a value + associated with `e`") + (miss [cache e ret] + "Is meant to be called if the cache is determined to **not** contain a + value associated with `e`") + (evict [cache e] + "Removes an entry from the cache") + (seed [cache base] + "Is used to signal that the cache should be created with a seed. + The contract is that said cache should return an instance of its + own type.")) + +(def ^{:private true} default-wrapper-fn #(%1 %2)) + +(defn through + "The basic hit/miss logic for the cache system. Expects a wrap function and + value function. The wrap function takes the value function and the item in question + and is expected to run the value function with the item whenever a cache + miss occurs. The intent is to hide any cache-specific cells from leaking + into the cache logic itelf." + ([cache item] (through default-wrapper-fn identity cache item)) + ([value-fn cache item] (through default-wrapper-fn value-fn cache item)) + ([wrap-fn value-fn cache item] + (if (clojure.core.cache/has? cache item) + (clojure.core.cache/hit cache item) + (clojure.core.cache/miss cache item (wrap-fn #(value-fn %) item))))) + +(defn through-cache + "The basic hit/miss logic for the cache system. Like through but always has + the cache argument in the first position for easier use with swap! etc." + ([cache item] (through-cache cache item default-wrapper-fn identity)) + ([cache item value-fn] (through-cache cache item default-wrapper-fn value-fn)) + ([cache item wrap-fn value-fn] + (if (clojure.core.cache/has? cache item) + (clojure.core.cache/hit cache item) + (clojure.core.cache/miss cache item (wrap-fn #(value-fn %) item))))) + +(defmacro defcache + [type-name fields & specifics] + (let [[base & _] fields + base-field (with-meta base {:tag 'clojure.lang.IPersistentMap})] + `(deftype ~type-name [~@fields] + ~@specifics + + clojure.lang.ILookup + (valAt [this# key#] + (lookup this# key#)) + (valAt [this# key# not-found#] + (if (has? this# key#) + (lookup this# key#) + not-found#)) + + System.Collections.IEnumerable ;;;java.lang.Iterable + (System.Collections.IEnumerable.GetEnumerator [_#] ;;;(iterator [_#] + (let [base# ^System.Collections.IEnumerable ~base-field] + (.GetEnumerator ^System.Collections.IEnumerable base#))) ;;; (.iterator ~base-field)) + + clojure.lang.IPersistentMap + (clojure.lang.IPersistentMap.assoc [this# k# v#] + (miss this# k# v#)) + (without [this# k#] + (evict this# k#)) + + clojure.lang.Associative + (containsKey [this# k#] + (has? this# k#)) + (entryAt [this# k#] + (when (has? this# k#) + (clojure.lang.MapEntry. k# (lookup this# k#)))) + (clojure.lang.Associative.assoc [this# k# v#] ;;; had to add + (miss this# k# v#)) + + + clojure.lang.Counted + (count [this#] + (count ~base-field)) + + clojure.lang.IPersistentCollection + (clojure.lang.IPersistentCollection.cons [this# elem#] + (seed this# (conj ~base-field elem#))) + (empty [this#] + (seed this# (empty ~base-field))) + (equiv [this# other#] + (= other# ~base-field)) + + clojure.lang.Seqable + (seq [_#] + (seq ~base-field))))) + +(defcache BasicCache [cache] + CacheProtocol + (lookup [_ item] + (get cache item)) + (lookup [_ item not-found] + (get cache item not-found)) + (has? [_ item] + (contains? cache item)) + (hit [this item] this) + (miss [_ item result] + (BasicCache. (assoc cache item result))) + (evict [_ key] + (BasicCache. (dissoc cache key))) + (seed [_ base] + (BasicCache. base)) + Object + (ToString [_] (str cache))) ;;; ;;;toString + +;; FnCache + +(defcache FnCache [cache f] + CacheProtocol + (lookup [_ item] + (f (get cache item))) + (lookup [_ item not-found] + (let [ret (get cache item not-found)] + (if (= not-found ret) + not-found + (f ret)))) + (has? [_ item] + (contains? cache item)) + (hit [this item] this) + (miss [_ item result] + (BasicCache. (assoc cache item result))) + (evict [_ key] + (BasicCache. (dissoc cache key))) + (seed [_ base] + (BasicCache. base)) + Object + (ToString [_] (str cache))) ;;; ;;;toString + +;; # FIFO + +(defn- describe-layout [mappy limit] + (let [ks (keys mappy) + [dropping keeping] (split-at (- (count ks) limit) ks)] + {:dropping dropping + :keeping keeping + :queue + (-> clojure.lang.PersistentQueue/EMPTY + (into (repeat (- limit (count keeping)) ::free)) + (into (take limit keeping)))})) + +(defn- prune-queue [q k] + (reduce (fn [q e] (if (#{k} e) q (conj q e))) + (conj clojure.lang.PersistentQueue/EMPTY ::free) + q)) + +(defcache FIFOCache [cache q limit] + CacheProtocol + (lookup [_ item] + (get cache item)) + (lookup [_ item not-found] + (get cache item not-found)) + (has? [_ item] + (contains? cache item)) + (hit [this item] + this) + (miss [_ item result] + (let [[kache qq] (let [k (peek q)] + (if (>= (count cache) limit) + [(dissoc cache k) (pop q)] + [cache (pop q)]))] + (FIFOCache. (assoc kache item result) + (conj qq item) + limit))) + (evict [this key] + (if (contains? cache key) + (FIFOCache. (dissoc cache key) + (prune-queue q key) + limit) + this)) + (seed [_ base] + (let [{dropping :dropping + q :queue} (describe-layout base limit)] + (FIFOCache. (apply dissoc base dropping) + q + limit))) + Object + (ToString [_] ;;; toString + (str cache \, \space (pr-str q)))) + +(defn- build-leastness-queue + [base start-at] + (into (clojure.data.priority-map/priority-map) (for [[k _] base] [k start-at]))) + +(defcache LRUCache [cache lru tick limit] + CacheProtocol + (lookup [_ item] + (get cache item)) + (lookup [_ item not-found] + (get cache item not-found)) + (has? [_ item] + (contains? cache item)) + (hit [_ item] + (let [tick+ (inc tick)] + (LRUCache. cache + (if (contains? cache item) + (assoc lru item tick+) + lru) + tick+ + limit))) + (miss [_ item result] + (let [tick+ (inc tick)] + (if (>= (count lru) limit) + (let [k (if (contains? lru item) + item + (first (peek lru))) ;; minimum-key, maybe evict case + c (-> cache (dissoc k) (assoc item result)) + l (-> lru (dissoc k) (assoc item tick+))] + (LRUCache. c l tick+ limit)) + (LRUCache. (assoc cache item result) ;; no change case + (assoc lru item tick+) + tick+ + limit)))) + (evict [this key] + (if (contains? cache key) + (LRUCache. (dissoc cache key) + (dissoc lru key) + (inc tick) + limit) + this)) + (seed [_ base] + (LRUCache. base + (build-leastness-queue base 0) + 0 + limit)) + Object + (ToString [_] ;;; toString + (str cache \, \space lru \, \space tick \, \space limit))) + + +(defn- key-killer-q + [ttl q expiry now] + (let [[ks q'] (reduce (fn [[ks q] [k g t]] + (if (> (- now t) expiry) + (if (= g (first (get ttl k))) + [(conj ks k) (pop q)] + [ks (pop q)]) + (reduced [ks q]))) + [[] q] + q)] + [#(apply dissoc % ks) q'])) + +(defcache TTLCacheQ [cache ttl q gen ttl-ms] + CacheProtocol + (lookup [this item] + (let [ret (lookup this item ::nope)] + (when-not (= ::nope ret) ret))) + (lookup [this item not-found] + (if (has? this item) + (get cache item) + not-found)) + (has? [_ item] + (and (let [[_ t] (get ttl item [0 (- ttl-ms)])] + (< (- (Environment/TickCount) ;;; System/currentTimeMillis + t) + ttl-ms)) + (contains? cache item))) + (hit [this item] this) + (miss [this item result] + (let [now (Environment/TickCount) ;;; System/currentTimeMillis + [kill-old q'] (key-killer-q ttl q ttl-ms now)] + (TTLCacheQ. (assoc (kill-old cache) item result) + (assoc (kill-old ttl) item [gen now]) + (conj q' [item gen now]) + (unchecked-inc gen) + ttl-ms))) + (seed [_ base] + (let [now (Environment/TickCount)] ;;; System/currentTimeMillis + (TTLCacheQ. base + ;; we seed the cache all at gen, but subsequent entries + ;; will get gen+1, gen+2 etc + (into {} (for [x base] [(key x) [gen now]])) + (into q (for [x base] [(key x) gen now])) + (unchecked-inc gen) + ttl-ms))) + (evict [_ key] + (TTLCacheQ. (dissoc cache key) + (dissoc ttl key) + q + gen + ttl-ms)) + Object + (ToString [_] ;;; toString + (str cache \, \space ttl \, \space ttl-ms))) + + +(defcache LUCache [cache lu limit] + CacheProtocol + (lookup [_ item] + (get cache item)) + (lookup [_ item not-found] + (get cache item not-found)) + (has? [_ item] + (contains? cache item)) + (hit [_ item] + (LUCache. cache (update-in lu [item] inc) limit)) + (miss [_ item result] + (if (>= (count lu) limit) ;; need to evict? + (let [min-key (if (contains? lu item) + ::nope + (first (peek lu))) ;; maybe evict case + c (-> cache (dissoc min-key) (assoc item result)) + l (-> lu (dissoc min-key) (update-in [item] (fnil inc 0)))] + (LUCache. c l limit)) + (LUCache. (assoc cache item result) ;; no change case + (update-in lu [item] (fnil inc 0)) + limit))) + (evict [this key] + (if (contains? this key) + (LUCache. (dissoc cache key) + (dissoc lu key) + limit) + this)) + (seed [_ base] + (LUCache. base + (build-leastness-queue base 0) + limit)) + Object + (ToString [_] ;;; toString + (str cache \, \space lu \, \space limit))) + + +;; # LIRS +;; *initial Clojure implementation by Jan Oberhagemann* + +;; A +;; [LIRS](http://citeseer.ist.psu.edu/viewdoc/summary?doi=10.1.1.116.2184) +;; cache consists of two LRU lists, `S` and `Q`, and keeps more history +;; than a LRU cache. Every cached item is either a LIR, HIR or +;; non-resident HIR block. `Q` contains only HIR blocks, `S` contains +;; LIR, HIR, non-resident HIR blocks. The total cache size is +;; |`S`|+|`Q`|, |`S`| is typically 99% of the cache size. + +;; * LIR block: +;; Low Inter-Reference block, a cached item with a short interval +;; between accesses. A block `x`, `x` ∈ `S` ∧ `x` ∉ `Q` ∧ `x` ∈ +;; `cache`, is a LIR block. + +;; * HIR block: +;; High Inter-Reference block, a cached item with rare accesses and +;; long interval. A block `x`, `x` ∈ `Q` ∧ `x` ∈ `cache`, is a HIR block. + +;; * non-resident HIR block: +;; only the key of the HIR block is cached, without the corresponding +;; value a test (has?) for the corresponding key is always a +;; miss. Used for additional history information. A block `x`, `x` ∈ +;; `S` ∧ `x` ∉ `Q` ∧ `x` ∉ `cache`, is a non-resident HIR block. + +;; ## Outline of the implemented algorithm + +;; `cache` is used to store the key value pairs. +;; `S` and `Q` maintain the relative order of accesses of the keys, like +;; a LRU list. + +;; Definition of `prune stack`: +;; +;; repeatedly remove oldest item from S until an item k, k ∉ Q ∧ +;; k ∈ cache (a LIR block), is found + + +;; In case of a miss for key `k` and value `v` (`k` ∉ cache) and +;; +;; * (1.1) `S` is not filled, |`S`| < `limitS` +;; add k to S +;; add k to the cache + +;; * (1.2) `k` ∉ `S`, never seen or not seen for a long, long time +;; remove oldest item x from Q +;; remove x from cache +;; add k to S +;; add k to Q +;; add k to the cache + +;; * (1.3) `k` ∈ `S`, this is a non-resident HIR block +;; remove oldest item x from Q +;; remove x from cache +;; add k to S +;; remove oldest item y from S +;; add y to Q +;; prune stack + + +;; In case of a hit for key `k` (`k` ∈ cache) and + +;; * (2.1) `k` ∈ `S` ∧ `k` ∉ `Q`, a LIR block +;; add k to S / refresh +;; prune stack if k was the oldest item in S + +;; * (2.2) `k` ∈ `S` ∧ `k` ∈ `Q`, a HIR block +;; add k to S / refresh +;; remove k from Q +;; remove oldest item x from S +;; add x to Q +;; prune stack + +;; * (2.3) `k` ∉ `S` ∧ `k` ∈ `Q`, a HIR block, only older than the oldest item in S +;; add k to S +;; add k to Q / refresh + +(defn- prune-stack [lruS lruQ cache] + (loop [s lruS q lruQ c cache] + (let [k (apply min-key s (keys s))] + (if (or (contains? q k) ; HIR item + (not (contains? c k))) ; non-resident HIR item + (recur (dissoc s k) q c) + s)))) + +(defcache LIRSCache [cache lruS lruQ tick limitS limitQ] + CacheProtocol + (lookup [_ item] + (get cache item)) + (lookup [_ item not-found] + (get cache item not-found)) + (has? [_ item] + (contains? cache item)) + (hit [_ item] + (let [tick+ (inc tick)] + (if (not (contains? lruS item)) + ; (2.3) item ∉ S ∧ item ∈ Q + (LIRSCache. cache (assoc lruS item tick+) (assoc lruQ item tick+) tick+ limitS limitQ) + (let [k (apply min-key lruS (keys lruS))] + (if (contains? lruQ item) + ; (2.2) item ∈ S ∧ item ∈ Q + (let [new-lruQ (-> lruQ (dissoc item) (assoc k tick+))] + (LIRSCache. cache + (-> lruS (dissoc k) (assoc item tick+) (prune-stack new-lruQ cache)) + new-lruQ + tick+ + limitS + limitQ)) + ; (2.1) item ∈ S ∧ item ∉ Q + (LIRSCache. cache + (-> lruS (assoc item tick+) (prune-stack lruQ cache)) + lruQ + tick+ + limitS + limitQ)))))) + + (miss [_ item result] + (let [tick+ (inc tick)] + (if (< (count cache) limitS) + ; (1.1) + (let [k (apply min-key lruS (keys lruS))] + (LIRSCache. (assoc cache item result) + (-> lruS (dissoc k) (assoc item tick+)) + lruQ + tick+ + limitS + limitQ)) + (let [k (apply min-key lruQ (keys lruQ)) + new-lruQ (dissoc lruQ k) + new-cache (-> cache (dissoc k) (assoc item result))] + (if (contains? lruS item) + ; (1.3) + (let [lastS (apply min-key lruS (keys lruS))] + (LIRSCache. new-cache + (-> lruS (dissoc lastS) (assoc item tick+) (prune-stack new-lruQ new-cache)) + (assoc new-lruQ lastS tick+) + tick+ + limitS + limitQ)) + ; (1.2) + (LIRSCache. new-cache + (assoc lruS item tick+) + (assoc new-lruQ item tick+) + tick+ + limitS + limitQ)))))) + (seed [_ base] + (LIRSCache. base + (into {} (for [x (range (- limitS) 0)] [x x])) + (into {} (for [x (range (- limitQ) 0)] [x x])) + 0 + limitS + limitQ)) + Object + (ToString [_] ;;; toString + (str cache \, \space lruS \, \space lruQ \, \space tick \, \space limitS \, \space limitQ))) +;;; Port SoftCache some other time -- TODO +;;;(defn clear-soft-cache! [^java.util.Map cache ^java.util.Map rcache ^ReferenceQueue rq] +;;; (loop [r (.poll rq)] +;;; (when r +;;; (when-let [item (get rcache r)] +;;; (.remove cache item)) +;;; (.remove rcache r) +;;; (recur (.poll rq))))) +;;; +;;;(defn make-reference [v rq] +;;; (if (nil? v) +;;; (SoftReference. ::nil rq) +;;; (SoftReference. v rq))) +;;; +;;;(defcache SoftCache [^java.util.Map cache ^java.util.Map rcache rq] +;;; CacheProtocol +;;; (lookup [_ item] +;;; (when-let [^SoftReference r (get cache (or item ::nil))] +;;; (let [v (.get r)] +;;; (if (= ::nil v) +;;; nil +;;; v)))) +;;; (lookup [_ item not-found] +;;; (if-let [^SoftReference r (get cache (or item ::nil))] +;;; (if-let [v (.get r)] +;;; (if (= ::nil v) +;;; nil +;;; v) +;;; not-found) +;;; not-found)) +;;; (has? [_ item] +;;; (let [item (or item ::nil) +;;; ^SoftReference cell (get cache item)] +;;; (boolean +;;; (when cell +;;; (not (nil? (.get cell))))))) +;;; (hit [this item] +;;; (clear-soft-cache! cache rcache rq) +;;; this) +;;; (miss [this item result] +;;; (let [item (or item ::nil) +;;; r (make-reference result rq)] +;;; (.put cache item r) +;;; (.put rcache r item) +;;; (clear-soft-cache! cache rcache rq) +;;; this)) +;;; (evict [this key] +;;; (let [key (or key ::nil) +;;; r (get cache key)] +;;; (when r +;;; (.remove cache key) +;;; (.remove rcache r)) +;;; (clear-soft-cache! cache rcache rq) +;;; this)) +;;; (seed [_ base] +;;; (let [soft-cache? (instance? SoftCache base) +;;; cache (ConcurrentHashMap.) +;;; rcache (ConcurrentHashMap.) +;;; rq (ReferenceQueue.)] +;;; (if (seq base) +;;; (doseq [[k ^SoftReference v] base] +;;; (let [k (or k ::nil) +;;; r (if soft-cache? +;;; (make-reference (.get v) rq) +;;; (make-reference v rq))] +;;; (.put cache k r) +;;; (.put rcache r k)))) +;;; (SoftCache. cache rcache rq))) +;;; Object +;;; (toString [_] (str cache))) + +;; Factories + +(defn basic-cache-factory + "Returns a pluggable basic cache initialized to `base`" + [base] + {:pre [(map? base)]} + (BasicCache. base)) + +(defn fifo-cache-factory + "Returns a FIFO cache with the cache and FIFO queue initialized to `base` -- + the queue is filled as the values are pulled out of `base`. If the associative + structure can guarantee ordering, then the said ordering will define the + eventual eviction order. Otherwise, there are no guarantees for the eventual + eviction ordering. + + This function takes an optional `:threshold` argument that defines the maximum number + of elements in the cache before the FIFO semantics apply (default is 32). + + If the number of elements in `base` is greater than the limit then some items + in `base` will be dropped from the resulting cache. If the associative + structure used as `base` can guarantee sorting, then the last `limit` elements + will be used as the cache seed values. Otherwise, there are no guarantees about + the elements in the resulting cache." + [base & {threshold :threshold :or {threshold 32}}] + {:pre [(number? threshold) (< 0 threshold) + (map? base)] + :post [(== threshold (count (.q ^FIFOCache %)))]} + (clojure.core.cache/seed (FIFOCache. {} clojure.lang.PersistentQueue/EMPTY threshold) base)) + +(defn lru-cache-factory + "Returns an LRU cache with the cache and usage-table initialized to `base` -- + each entry is initialized with the same usage value. + + This function takes an optional `:threshold` argument that defines the maximum number + of elements in the cache before the LRU semantics apply (default is 32)." + [base & {threshold :threshold :or {threshold 32}}] + {:pre [(number? threshold) (< 0 threshold) + (map? base)]} + (clojure.core.cache/seed (LRUCache. {} (clojure.data.priority-map/priority-map) 0 threshold) base)) + +(defn ttl-cache-factory + "Returns a TTL cache with the cache and expiration-table initialized to `base` -- + each with the same time-to-live. + + This function also allows an optional `:ttl` argument that defines the default + time in milliseconds that entries are allowed to reside in the cache." + [base & {ttl :ttl :or {ttl 2000}}] + {:pre [(number? ttl) (<= 0 ttl) + (map? base)]} + (clojure.core.cache/seed (TTLCacheQ. {} {} clojure.lang.PersistentQueue/EMPTY 0 ttl) base)) + +(defn lu-cache-factory + "Returns an LU cache with the cache and usage-table initialized to `base`. + + This function takes an optional `:threshold` argument that defines the maximum number + of elements in the cache before the LU semantics apply (default is 32)." + [base & {threshold :threshold :or {threshold 32}}] + {:pre [(number? threshold) (< 0 threshold) + (map? base)]} + (clojure.core.cache/seed (LUCache. {} (clojure.data.priority-map/priority-map) threshold) base)) + +(defn lirs-cache-factory + "Returns an LIRS cache with the S & R LRU lists set to the indicated + limits." + [base & {:keys [s-history-limit q-history-limit] + :or {s-history-limit 32 + q-history-limit 32}}] + {:pre [(number? s-history-limit) (< 0 s-history-limit) + (number? q-history-limit) (< 0 q-history-limit) + (map? base)]} + (clojure.core.cache/seed (LIRSCache. {} {} {} 0 s-history-limit q-history-limit) base)) + +(defn soft-cache-factory + "Returns a SoftReference cache. Cached values will be referred to with + SoftReferences, allowing the values to be garbage collected when there is + memory pressure on the JVM. + + SoftCache is a mutable cache, since it is always based on a + ConcurrentHashMap." + [base] + {:pre [(map? base)]} + (throw (System.NotImplementedException.)) ;;; (clojure.core.cache/seed (SoftCache. (ConcurrentHashMap.) (ConcurrentHashMap.) (ReferenceQueue.)) + ) ;;; base) + \ No newline at end of file diff --git a/typed/clj.analyzer/src/clojure/core/cache/wrapped.clj b/typed/clj.analyzer/src/clojure/core/cache/wrapped.clj new file mode 100644 index 000000000..b530411a2 --- /dev/null +++ b/typed/clj.analyzer/src/clojure/core/cache/wrapped.clj @@ -0,0 +1,197 @@ +; Copyright (c) Rich Hickey. All rights reserved. +; The use and distribution terms for this software are covered by the +; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php) +; which can be found in the file epl-v10.html at the root of this distribution. +; By using this software in any fashion, you are agreeing to be bound by +; the terms of this license. +; You must not remove this notice, or any other, from this software. + +(ns clojure.core.cache.wrapped + "A higher level way to use clojure.core.cache that assumes the immutable + cache is wrapped in an atom. + + The API is (almost) the same as clojure.core.cache -- including the factory + functions -- but instead of accepting immutable caches, the functions + here accept atoms containing those caches. The factory functions return + new atoms containing the newly created cache. + + In addition, lookup-or-miss provides a safe, atomic way to retrieve a + value from a cache or compute it if it is missing, without risking a + cache stampede." + (:require [clojure.core.cache :as c])) + +(set! *warn-on-reflection* true) + +(defn lookup + "Retrieve the value associated with `e` if it exists, else `nil` in + the 2-arg case. Retrieve the value associated with `e` if it exists, + else `not-found` in the 3-arg case. + + Reads from the current version of the atom." + ([cache-atom e] + (c/lookup @cache-atom e)) + ([cache-atom e not-found] + (c/lookup @cache-atom e not-found))) + +(def ^{:private true} default-wrapper-fn #(%1 %2)) + +(defn lookup-or-miss + "Retrieve the value associated with `e` if it exists, else compute the + value (using value-fn, and optionally wrap-fn), update the cache for `e` + and then perform the lookup again. + + value-fn (and wrap-fn) will only be called (at most) once even in the + case of retries, so there is no risk of cache stampede. + + Since lookup can cause invalidation in some caches (such as TTL), we + trap that case and retry (a maximum of ten times)." + ([cache-atom e value-fn] + (lookup-or-miss cache-atom e default-wrapper-fn value-fn)) + ([cache-atom e wrap-fn value-fn] + (let [d-new-value (delay (wrap-fn value-fn e))] + (loop [n 0 + v (c/lookup (swap! cache-atom + c/through-cache + e + default-wrapper-fn + (fn [_] @d-new-value)) + e + ::expired)] + (when (< n 10) + (if (= ::expired v) + (recur (inc n) + (c/lookup (swap! cache-atom + c/through-cache + e + default-wrapper-fn + (fn [_] @d-new-value)) + e + ::expired)) + v)))))) + +(defn has? + "Checks if the cache contains a value associated with `e`. + + Reads from the current version of the atom." + [cache-atom e] + (c/has? @cache-atom e)) + +(defn hit + "Is meant to be called if the cache is determined to contain a value + associated with `e`. + + Returns the updated cache from the atom. Provided for completeness." + [cache-atom e] + (swap! cache-atom c/hit e)) + +(defn miss + "Is meant to be called if the cache is determined to **not** contain a + value associated with `e`. + + Returns the updated cache from the atom. Provided for completeness." + [cache-atom e ret] + (swap! cache-atom c/miss e ret)) + +(defn evict + "Removes an entry from the cache. + + Returns the updated cache from the atom." + [cache-atom e] + (swap! cache-atom c/evict e)) + +(defn seed + "Is used to signal that the cache should be created with a seed. + The contract is that said cache should return an instance of its + own type. + + Returns the updated cache from the atom. Provided for completeness." + [cache-atom base] + (swap! cache-atom c/seed base)) + +(defn through + "The basic hit/miss logic for the cache system. Expects a wrap function and + value function. The wrap function takes the value function and the item in question + and is expected to run the value function with the item whenever a cache + miss occurs. The intent is to hide any cache-specific cells from leaking + into the cache logic itelf." + ([cache-atom item] (through default-wrapper-fn identity cache-atom item)) + ([value-fn cache-atom item] (through default-wrapper-fn value-fn cache-atom item)) + ([wrap-fn value-fn cache-atom item] + (swap! cache-atom c/through-cache item wrap-fn value-fn))) + +(defn through-cache + "The basic hit/miss logic for the cache system. Like through but always has + the cache argument in the first position." + ([cache-atom item] (through-cache cache-atom item default-wrapper-fn identity)) + ([cache-atom item value-fn] (through-cache cache-atom item default-wrapper-fn value-fn)) + ([cache-atom item wrap-fn value-fn] + (swap! cache-atom c/through-cache item wrap-fn value-fn))) + +(defn basic-cache-factory + "Returns a pluggable basic cache initialized to `base`" + [base] + (atom (c/basic-cache-factory base))) + +(defn fifo-cache-factory + "Returns a FIFO cache with the cache and FIFO queue initialized to `base` -- + the queue is filled as the values are pulled out of `base`. If the associative + structure can guarantee ordering, then the said ordering will define the + eventual eviction order. Otherwise, there are no guarantees for the eventual + eviction ordering. + + This function takes an optional `:threshold` argument that defines the maximum number + of elements in the cache before the FIFO semantics apply (default is 32). + + If the number of elements in `base` is greater than the limit then some items + in `base` will be dropped from the resulting cache. If the associative + structure used as `base` can guarantee sorting, then the last `limit` elements + will be used as the cache seed values. Otherwise, there are no guarantees about + the elements in the resulting cache." + [base & {threshold :threshold :or {threshold 32}}] + (atom (c/fifo-cache-factory base :threshold threshold))) + +(defn lru-cache-factory + "Returns an LRU cache with the cache and usage-table initialized to `base` -- + each entry is initialized with the same usage value. + + This function takes an optional `:threshold` argument that defines the maximum number + of elements in the cache before the LRU semantics apply (default is 32)." + [base & {threshold :threshold :or {threshold 32}}] + (atom (c/lru-cache-factory base :threshold threshold))) + +(defn ttl-cache-factory + "Returns a TTL cache with the cache and expiration-table initialized to `base` -- + each with the same time-to-live. + + This function also allows an optional `:ttl` argument that defines the default + time in milliseconds that entries are allowed to reside in the cache." + [base & {ttl :ttl :or {ttl 2000}}] + (atom (c/ttl-cache-factory base :ttl ttl))) + +(defn lu-cache-factory + "Returns an LU cache with the cache and usage-table initialized to `base`. + + This function takes an optional `:threshold` argument that defines the maximum number + of elements in the cache before the LU semantics apply (default is 32)." + [base & {threshold :threshold :or {threshold 32}}] + (atom (c/lu-cache-factory base :threshold threshold))) + +(defn lirs-cache-factory + "Returns an LIRS cache with the S & R LRU lists set to the indicated + limits." + [base & {:keys [s-history-limit q-history-limit] + :or {s-history-limit 32 + q-history-limit 32}}] + (atom (c/lirs-cache-factory base + :s-history-limit s-history-limit + :q-history-limit q-history-limit))) + +(defn soft-cache-factory + "Returns a SoftReference cache. Cached values will be referred to with + SoftReferences, allowing the values to be garbage collected when there is + memory pressure on the JVM. + + SoftCache is a mutable cache, since it is always based on a + ConcurrentHashMap." + [base] + (atom (c/soft-cache-factory base))) \ No newline at end of file diff --git a/typed/clj.analyzer/src/clojure/core/memoize.clj b/typed/clj.analyzer/src/clojure/core/memoize.clj new file mode 100644 index 000000000..a3cc23505 --- /dev/null +++ b/typed/clj.analyzer/src/clojure/core/memoize.clj @@ -0,0 +1,509 @@ +; Copyright (c) Rich Hickey and Michael Fogus. All rights reserved. +; The use and distribution terms for this software are covered by the +; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php) +; which can be found in the file epl-v10.html at the root of this distribution. +; By using this software in any fashion, you are agreeing to be bound by +; the terms of this license. +; You must not remove this notice, or any other, from this software. + +(ns clojure.core.memoize + "core.memoize is a memoization library offering functionality above + Clojure's core `memoize` function in the following ways: + + **Pluggable memoization** + + core.memoize allows for different back-end cache implmentations to + be used as appropriate without changing the memoization modus operandi. + See the `memoizer` function. + + **Manipulable memoization** + + Because core.memoize allows you to access a function's memoization store, + you do interesting things like clear it, modify it, and save it for later. + " + {:author "fogus"} + + (:require [clojure.core.cache :as cache])) + + + +;; Similar to clojure.lang.Delay, but will not memoize an exception and will +;; instead retry. +;; fun - the function, never nil +;; available? - indicates a memoized value is available, volatile for visibility +;; value - the value (if available) - volatile for visibility +(deftype RetryingDelay [fun ^:volatile-mutable available? ^:volatile-mutable value] + clojure.lang.IDeref + (deref [this] + ;; first check (safe with volatile flag) + (if available? + value + (locking fun + ;; second check (race condition with locking) + (if available? + value + (do + ;; fun may throw - will retry on next deref + (let [v (fun)] + ;; this ordering is important - MUST set value before setting available? + ;; or you have a race with the first check above + (set! value v) + (set! available? true) + v)))))) + clojure.lang.IPending + (isRealized [this] + available?)) + +(defn- d-lay [fun] + (->RetryingDelay fun false nil)) + +(defn- make-derefable + "If a value is not already derefable, wrap it up. + + This is used to help rebuild seed/base maps passed in to the various + caches so that they conform to core.memoize's world view." + [v] + (if (instance? clojure.lang.IDeref v) + v + (reify clojure.lang.IDeref + (deref [_] v)))) + +(defn- derefable-seed + "Given a seed/base map, ensure all the values in it are derefable." + [seed] + (into {} (for [[k v] seed] [k (make-derefable v)]))) + +;; Plugging Interface + +(deftype PluggableMemoization [f cache] + cache/CacheProtocol + (has? [_ item] + (clojure.core.cache/has? cache item)) + (hit [_ item] + (PluggableMemoization. f (clojure.core.cache/hit cache item))) + (miss [_ item result] + (PluggableMemoization. f (clojure.core.cache/miss cache item result))) + (evict [_ key] + (PluggableMemoization. f (clojure.core.cache/evict cache key))) + (lookup [_ item] + (clojure.core.cache/lookup cache item nil)) + (lookup [_ item not-found] + (clojure.core.cache/lookup cache item (delay not-found))) + (seed [_ base] + (PluggableMemoization. + f (clojure.core.cache/seed cache (derefable-seed base)))) + Object + (ToString [_] (str cache))) ;;; toString + +;; # Auxilliary functions + +(def ^{:private true + :doc "Returns a function's argument transformer."} + args-fn #(or (::args-fn (meta %)) identity)) + +(defn- through* + "The basic hit/miss logic for the cache system based on `core.cache/through`. + Clojure delays are used to hold the cache value." + [cache f args item] + (clojure.core.cache/through + (fn [f _] (d-lay #(f args))) + #(clojure.core/apply f %) + cache + item)) + +(def ^{:private true + :doc "Returns a function's cache identity."} + cache-id #(::cache (meta %))) + + +;; # Public Utilities API + +(defn snapshot + "Returns a snapshot of a core.memo-placed memoization cache. By snapshot + you can infer that what you get is only the cache contents at a + moment in time." + [memoized-fn] + (when-let [cache (cache-id memoized-fn)] + (into {} + (for [[k v] (.cache ^PluggableMemoization @cache)] + [(vec k) @v])))) + +(defn lazy-snapshot + "Returns a lazy snapshot of a core.memo-placed memoization cache. By + lazy snapshot you can infer that what you get is only the cache contents at a + moment in time -- and, being lazy, the cache could change while you are + realizing the snapshot elements. + + Returns a sequence of key/value pairs." + [memoized-fn] + (when-let [cache (cache-id memoized-fn)] + (for [[k v] (.cache ^PluggableMemoization @cache)] + [(vec k) @v]))) + +(defn memoized? + "Returns true if a function has an core.memo-placed cache, false otherwise." + [f] + (boolean (cache-id f))) + +(defn memo-clear! + "Reaches into an core.memo-memoized function and clears the cache. This is a + destructive operation and should be used with care. + + When the second argument is a vector of input arguments, clears cache only + for argument vector. + + Keep in mind that depending on what other threads or doing, an + immediate call to `snapshot` may not yield an empty cache. That's + cool though, we've learned to deal with that stuff in Clojure by + now." + ([f] + (when-let [cache (cache-id f)] + (swap! cache (constantly (clojure.core.cache/seed @cache {}))))) + ([f args] + (when-let [cache (cache-id f)] + (swap! cache (constantly (clojure.core.cache/evict @cache args)))))) + +(defn memo-reset! + "Takes a core.memo-populated function and a map and replaces the memoization cache + with the supplied map. This is potentially some serious voodoo, + since you can effectively change the semantics of a function on the fly. + + (def id (memo identity)) + (memo-swap! id '{[13] :omg}) + (id 13) + ;=> :omg + + With great power comes ... yadda yadda yadda." + [f base] + (when-let [cache (cache-id f)] + (swap! cache + (constantly (clojure.core.cache/seed @cache (derefable-seed base)))))) + +(defn memo-swap! + "The 2-arity version takes a core.memo-populated function and a map and + replaces the memoization cache with the supplied map. Use `memo-reset!` + instead for replacing the cache as this 2-arity version of `memo-swap!` + should be considered deprecated. + + The 3+-arity version takes a core.memo-populated function and arguments + similar to what you would pass to `clojure.core/swap!` and performs a + `swap!` on the underlying cache. In order to satisfy core.memoize's + world view, the assumption is that you will generally be calling it like: + + (def id (memo identity)) + (memo-swap! id clojure.core.cache/miss [13] :omg) + (id 13) + ;=> :omg + + You'll nearly always use `clojure.core.cache/miss` for this operation but + you could pass any function that would work on an immutable cache, such + as `evict` or `assoc` etc. + + Be aware that `memo-swap!` assumes it can wrap each of the `results` values + in a `delay` so that items conform to `clojure.core.memoize`'s world view." + ([f base] + (when-let [cache (cache-id f)] + (swap! cache + (constantly (clojure.core.cache/seed @cache (derefable-seed base)))))) + ([f swap-fn args & results] + (when-let [cache (cache-id f)] + (apply swap! cache swap-fn args (map #(delay %) results))))) + +(defn memo-unwrap + [f] + (::original (meta f))) + +(defn- cached-function + "Given a function, an atom containing a (pluggable memoization cache), and + and cache key function, return a new function that behaves like the original + function except it is cached, based on its arguments, with the cache and the + original function in its metadata." + [f cache-atom ckey-fn] + (with-meta + (fn [& args] + (let [ckey (or (ckey-fn args) []) + cs (swap! cache-atom through* f args ckey) + val (clojure.core.cache/lookup cs ckey ::not-found)] + ;; If `lookup` returns `(delay ::not-found)`, it's likely that + ;; we ran into a timing issue where eviction and access + ;; are happening at about the same time. Therefore, we retry + ;; the `swap!` (potentially several times). + ;; + ;; core.memoize currently wraps all of its values in a `delay`. + (when val + (loop [n 0 v @val] + (if (= ::not-found v) + (when-let [v' (clojure.core.cache/lookup + (swap! cache-atom through* f args ckey) + ckey ::not-found)] + (when (< n 10) + (recur (inc n) @v'))) + v))))) + {::cache cache-atom + ::original f})) + +;; # Public memoization API + +(defn memoizer + "Build a pluggable memoized version of a function. Given a function and a + (pluggable memoized) cache, and an optional seed (hash map of arguments to + return values), return a cached version of that function. + + If you want to build your own cached function, perhaps with combined caches + or customized caches, this is the preferred way to do so now." + ([f cache] + (let [cache (atom (PluggableMemoization. f cache)) + ckey-fn (args-fn f)] + (cached-function f cache ckey-fn))) + ([f cache seed] + (let [cache (atom (clojure.core.cache/seed (PluggableMemoization. f cache) + (derefable-seed seed))) + ckey-fn (args-fn f)] + (cached-function f cache ckey-fn)))) + +(defn build-memoizer + "Builds a function that, given a function, returns a pluggable memoized + version of it. `build-memoizer` takes a cache factory function, and the + argunments to that factory function -- at least one of those arguments + should be the function to be memoized (it's usually the first argument). + + `memoizer` above is a simpler version of `build-memoizer` that 'does the + right thing' with a cache and a seed hash map. `build-memoizer` remains + for backward compatibility but should be considered deprecated." + ([cache-factory f & args] + (let [cache (atom (apply cache-factory f args)) + ckey-fn (args-fn f)] + (cached-function f cache ckey-fn)))) + +(defn memo + "Used as a more flexible alternative to Clojure's core `memoization` + function. Memoized functions built using `memo` will respond to + the core.memo manipulable memoization utilities. As a nice bonus, + you can use `memo` in place of `memoize` without any additional + changes, with the added guarantee that the memoized function will + only be called once for a given sequence of arguments (`memoize` + can call the function multiple times when concurrent calls are + made with the same sequence of arguments). + + The default way to use this function is to simply supply a function + that will be memoized. Additionally, you may also supply a map + of the form `'{[42] 42, [108] 108}` where keys are a vector + mapping expected argument values to arity positions. The map values + are the return values of the memoized function. + + If the supplied function has metadata containing an + `:clojure.core.memoize/args-fn` key, the value is assumed to be a + function that should be applied to the arguments to produce a + subset or transformed sequence of arguments that are used for the + key in the cache (the full, original arguments will still be used + to call the function). This allows you to memoize functions where + one or more arguments are irrelevant for memoization, such as the + `clojure.java.jdbc` functions, whose first argument may include + a (mutable) JDBC `Connection` object: + + (memo/memo (with-meta jdbc/execute! {::memo/args-fn rest})) + + You can access the memoization cache directly via the `:clojure.core.memoize/cache` key + on the memoized function's metadata. However, it is advised to + use the core.memo primitives instead as implementation details may + change over time." + ([f] (memo f {})) + ([f seed] + (memoizer f (cache/basic-cache-factory {}) seed))) + +;; ## Utilities + +(defn ^{:private true} !! [c] + (println "WARNING - Deprecated construction method for" + c + "cache; prefered way is:" + (str "(clojure.core.memoize/" c " function <:" c "/threshold num>)"))) + +(defmacro ^{:private true} def-deprecated [nom ds & arities] + `(defn ~(symbol (str "memo-" (name nom))) ~ds + ~@(for [[args body] arities] + (list args `(!! (quote ~nom)) body)))) + +(defmacro ^{:private true} massert [condition msg] + `(when-not ~condition + (throw (new InvalidOperationException (str "clojure.core.memoize/" ~msg "\n" (pr-str '~condition)))))) ;;; AssertionError + +(defmacro ^{:private true} check-args [nom f base key threshold] + (when *assert* + (let [good-key (keyword nom "threshold") + key-error `(str "Incorrect threshold key " ~key) + fun-error `(str ~nom " expects a function as its first argument; given " ~f) + thresh-error `(str ~nom " expects an integer for its " ~good-key " argument; given " ~threshold)] + `(do (massert (= ~key ~good-key) ~key-error) + (massert (some #{clojure.lang.IFn + clojure.lang.AFn + ;;; java.lang.Runnable + } ;;; java.util.concurrent.Callable + (ancestors (class ~f))) + ~fun-error) + (massert (number? ~threshold) ~thresh-error))))) + +;; ## Main API functions + +;; ### FIFO + +(def-deprecated fifo + "DEPRECATED: Please use clojure.core.memoize/fifo instead." + ([f] (memo-fifo f 32 {})) + ([f limit] (memo-fifo f limit {})) + ([f limit base] + (memoizer f (cache/fifo-cache-factory {} :threshold limit) base))) + +(defn fifo + "Works the same as the basic memoization function (i.e. `memo` + and `core.memoize` except when a given threshold is breached. + + Observe the following: + + (require '[clojure.core.memoize :as memo]) + + (def id (memo/fifo identity :fifo/threshold 2)) + + (id 42) + (id 43) + (snapshot id) + ;=> {[42] 42, [43] 43} + + As you see, the limit of `2` has not been breached yet, but + if you call again with another value, then it is: + + (id 44) + (snapshot id) + ;=> {[44] 44, [43] 43} + + That is, the oldest entry `42` is pushed out of the + memoization cache. This is the standard **F**irst **I**n + **F**irst **O**ut behavior." + ([f] (fifo f {} :fifo/threshold 32)) + ([f base] (fifo f base :fifo/threshold 32)) + ([f tkey threshold] (fifo f {} tkey threshold)) + ([f base key threshold] + (check-args "fifo" f base key threshold) + (memoizer f (cache/fifo-cache-factory {} :threshold threshold) base))) + +;; ### LRU + +(def-deprecated lru + "DEPRECATED: Please use clojure.core.memoize/lru instead." + ([f] (memo-lru f 32)) + ([f limit] (memo-lru f limit {})) + ([f limit base] + (memoizer f (cache/lru-cache-factory {} :threshold limit) base))) + +(defn lru + "Works the same as the basic memoization function (i.e. `memo` + and `core.memoize` except when a given threshold is breached. + + Observe the following: + + (require '[clojure.core.memoize :as memo]) + + (def id (memo/lru identity :lru/threshold 2)) + + (id 42) + (id 43) + (snapshot id) + ;=> {[42] 42, [43] 43} + + At this point the cache has not yet crossed the set threshold + of `2`, but if you execute yet another call the story will + change: + + (id 44) + (snapshot id) + ;=> {[44] 44, [43] 43} + + At this point the operation of the LRU cache looks exactly + the same at the FIFO cache. However, the difference becomes + apparent on further use: + + (id 43) + (id 0) + (snapshot id) + ;=> {[0] 0, [43] 43} + + As you see, once again calling `id` with the argument `43` + will expose the LRU nature of the underlying cache. That is, + when the threshold is passed, the cache will expel the + **L**east **R**ecently **U**sed element in favor of the new." + ([f] (lru f {} :lru/threshold 32)) + ([f base] (lru f base :lru/threshold 32)) + ([f tkey threshold] (lru f {} tkey threshold)) + ([f base key threshold] + (check-args "lru" f base key threshold) + (memoizer f (cache/lru-cache-factory {} :threshold threshold) base))) + +;; ### TTL + +(def-deprecated ttl + "DEPRECATED: Please use clojure.core.memoize/ttl instead." + ([f] (memo-ttl f 3000 {})) + ([f limit] (memo-ttl f limit {})) + ([f limit base] + (memoizer f (cache/ttl-cache-factory {} :ttl limit) base))) + +(defn ttl + "Unlike many of the other core.memo memoization functions, + `memo-ttl`'s cache policy is time-based rather than algortihmic + or explicit. When memoizing a function using `memo-ttl` you + should provide a **T**ime **T**o **L**ive parameter in + milliseconds. + + (require '[clojure.core.memoize :as memo]) + + (def id (memo/ttl identity :ttl/threshold 5000)) + + (id 42) + (snapshot id) + ;=> {[42] 42} + + ... wait 5 seconds ... + (id 43) + (snapshot id) + ;=> {[43] 43} + + The expired cache entries will be removed on each cache **miss**." + ([f] (ttl f {} :ttl/threshold 32)) + ([f base] (ttl f base :ttl/threshold 32)) + ([f tkey threshold] (ttl f {} tkey threshold)) + ([f base key threshold] + (check-args "ttl" f base key threshold) + (memoizer f (cache/ttl-cache-factory {} :ttl threshold) base))) + +;; ### LU + +(def-deprecated lu + "DEPRECATED: Please use clojure.core.memoize/lu instead." + ([f] (memo-lu f 32)) + ([f limit] (memo-lu f limit {})) + ([f limit base] + (memoizer f (cache/lu-cache-factory {} :threshold limit) base))) + +(defn lu + "Similar to the implementation of memo-lru, except that this + function removes all cache values whose usage value is + smallest: + + (require '[clojure.core.memoize :as memo]) + + (def id (memo/lu identity :lu/threshold 3)) + + (id 42) + (id 42) + (id 43) + (id 44) + (snapshot id) + ;=> {[44] 44, [42] 42} + + The **L**east **U**sed values are cleared on cache misses." + ([f] (lu f {} :lu/threshold 32)) + ([f base] (lu f base :lu/threshold 32)) + ([f tkey threshold] (lu f {} tkey threshold)) + ([f base key threshold] + (check-args "lu" f base key threshold) + (memoizer f (cache/lu-cache-factory {} :threshold threshold) base))) \ No newline at end of file diff --git a/typed/clj.analyzer/src/clojure/data/priority_map.clj b/typed/clj.analyzer/src/clojure/data/priority_map.clj new file mode 100644 index 000000000..c9ee09ce3 --- /dev/null +++ b/typed/clj.analyzer/src/clojure/data/priority_map.clj @@ -0,0 +1,549 @@ +;; Copyright (c) Mark Engelberg, Rich Hickey and contributors. All rights reserved. +;; The use and distribution terms for this software are covered by the +;; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php) +;; which can be found in the file epl-v10.html at the root of this distribution. +;; By using this software in any fashion, you are agreeing to be bound by +;; the terms of this license. +;; You must not remove this notice, or any other, from this software. + +;; A priority map is a map from items to priorities, +;; offering queue-like peek/pop as well as the map-like ability to +;; easily reassign priorities and other conveniences. +;; by Mark Engelberg (mark.engelberg@gmail.com) +;; Last update - September 19, 2021 + +(ns + ^{:author "Mark Engelberg", + :doc "A priority map is very similar to a sorted map, but whereas a sorted map produces a +sequence of the entries sorted by key, a priority map produces the entries sorted by value. +In addition to supporting all the functions a sorted map supports, a priority map +can also be thought of as a queue of [item priority] pairs. To support usage as +a versatile priority queue, priority maps also support conj/peek/pop operations. + +The standard way to construct a priority map is with priority-map: +user=> (def p (priority-map :a 2 :b 1 :c 3 :d 5 :e 4 :f 3)) +#'user/p +user=> p +{:b 1, :a 2, :c 3, :f 3, :e 4, :d 5} + +So :b has priority 1, :a has priority 2, and so on. +Notice how the priority map prints in an order sorted by its priorities (i.e., the map's values) + +We can use assoc to assign a priority to a new item: +user=> (assoc p :g 1) +{:b 1, :g 1, :a 2, :c 3, :f 3, :e 4, :d 5} + +or to assign a new priority to an extant item: +user=> (assoc p :c 4) +{:b 1, :a 2, :f 3, :c 4, :e 4, :d 5} + +We can remove an item from the priority map: +user=> (dissoc p :e) +{:b 1, :a 2, :c 3, :f 3, :d 5} + +An alternative way to add to the priority map is to conj a [item priority] pair: +user=> (conj p [:g 0]) +{:g 0, :b 1, :a 2, :c 3, :f 3, :e 4, :d 5} + +or use into: +user=> (into p [[:g 0] [:h 1] [:i 2]]) +{:g 0, :b 1, :h 1, :a 2, :i 2, :c 3, :f 3, :e 4, :d 5} + +Priority maps are countable: +user=> (count p) +6 + +Like other maps, equivalence is based not on type, but on contents. +In other words, just as a sorted-map can be equal to a hash-map, +so can a priority-map. +user=> (= p {:b 1, :a 2, :c 3, :f 3, :e 4, :d 5}) +true + +You can test them for emptiness: +user=> (empty? (priority-map)) +true +user=> (empty? p) +false + +You can test whether an item is in the priority map: +user=> (contains? p :a) +true +user=> (contains? p :g) +false + +It is easy to look up the priority of a given item, using any of the standard map mechanisms: +user=> (get p :a) +2 +user=> (get p :g 10) +10 +user=> (p :a) +2 +user=> (:a p) +2 + +Priority maps derive much of their utility by providing priority-based seq. +Note that no guarantees are made about the order in which items of the same priority appear. +user=> (seq p) +([:b 1] [:a 2] [:c 3] [:f 3] [:e 4] [:d 5]) +Because no guarantees are made about the order of same-priority items, note that +rseq might not be an exact reverse of the seq. It is only guaranteed to be in +descending order. +user=> (rseq p) +([:d 5] [:e 4] [:c 3] [:f 3] [:a 2] [:b 1]) + +This means first/rest/next/for/map/etc. all operate in priority order. +user=> (first p) +[:b 1] +user=> (rest p) +([:a 2] [:c 3] [:f 3] [:e 4] [:d 5]) + +Priority maps also support subseq and rsubseq, however, *you must use the subseq and rsubseq +defined in the clojure.data.priority-map namespace*, which patches longstanding JIRA issue +[CLJ-428](https://clojure.atlassian.net/browse/CLJ-428). These patched versions +of subseq and rsubseq will work on Clojure's other sorted collections as well, so you can +use them as a drop-in replacement for the subseq and rsubseq found in core. +user=> (subseq p < 3) +([:b 1] [:a 2]) +user=> (subseq p >= 3) +([:c 3] [:f 3] [:e 4] [:d 5]) +user=> (subseq p >= 2 < 4) +([:a 2] [:c 3] [:f 3]) +user=> (rsubseq p < 4) +([:c 3] [:f 3] [:a 2] [:b 1]) +user=> (rsubseq p >= 4) +([:d 5] [:e 4]) + +Priority maps support metadata: +user=> (meta (with-meta p {:extra :info})) +{:extra :info} + +But perhaps most importantly, priority maps can also function as priority queues. +peek, like first, gives you the first [item priority] pair in the collection. +pop removes the first [item priority] from the collection. +(Note that unlike rest, which returns a seq, pop returns a priority map). + +user=> (peek p) +[:b 1] +user=> (pop p) +{:a 2, :c 3, :f 3, :e 4, :d 5} + +It is also possible to use a custom comparator: +user=> (priority-map-by > :a 1 :b 2 :c 3) +{:c 3, :b 2, :a 1} + +Sometimes, it is desirable to have a map where the values contain more information +than just the priority. For example, let's say you want a map like: +{:a [2 :apple], :b [1 :banana], :c [3 :carrot]} +and you want to sort the map by the numeric priority found in the pair. + +A common mistake is to try to solve this with a custom comparator: +(priority-map-by + (fn [[priority1 _] [priority2 _]] (< priority1 priority2)) + :a [2 :apple], :b [1 :banana], :c [3 :carrot]) + +This will not work! Although it may appear to work with these particular values, it is not safe. +In Clojure, like Java, all comparators must be *total orders*, +meaning that you can't have a tie unless the objects you are comparing are +in fact equal. The above comparator breaks that rule because objects such as +`[2 :apple]` and `[2 :apricot]` would tie, but are not equal. + +The correct way to construct such a priority map is by specifying a keyfn, which is used +to extract the true priority from the priority map's vals. (Note: It might seem a little odd +that the priority-extraction function is called a *key*fn, even though it is applied to the +map's values. This terminology is based on the docstring of clojure.core/sort-by, which +uses `keyfn` for the function which extracts the sort order.) + +In the above example, + +user=> (priority-map-keyfn first :a [2 :apple], :b [1 :banana], :c [3 :carrot]) +{:b [1 :banana], :a [2 :apple], :c [3 :carrot]} + +You can also combine a keyfn with a comparator that operates on the extracted priorities: + +user=> (priority-map-keyfn-by + first > + :a [2 :apple], :b [1 :banana], :c [3 :carrot]) +{:c [3 :carrot], :a [2 :apple], :b [1 :banana]} + + + +All of these operations are efficient. Generally speaking, most operations +are O(log n) where n is the number of distinct priorities. Some operations +(for example, straightforward lookup of an item's priority, or testing +whether a given item is in the priority map) are as efficient +as Clojure's built-in map. + +The key to this efficiency is that internally, not only does the priority map store +an ordinary hash map of items to priority, but it also stores a sorted map that +maps priorities to sets of items with that priority. + +A typical textbook priority queue data structure supports at the ability to add +a [item priority] pair to the queue, and to pop/peek the next [item priority] pair. +But many real-world applications of priority queues require more features, such +as the ability to test whether something is already in the queue, or to reassign +a priority. For example, a standard formulation of Dijkstra's algorithm requires the +ability to reduce the priority number associated with a given item. Once you +throw persistence into the mix with the desire to adjust priorities, the traditional +structures just don't work that well. + +This particular blend of Clojure's built-in hash sets, hash maps, and sorted maps +proved to be a great way to implement an especially flexible persistent priority queue. + +Connoisseurs of algorithms will note that this structure's peek operation is not O(1) as +it would be if based upon a heap data structure, but I feel this is a small concession for +the blend of persistence, priority reassignment, and priority-sorted seq, which can be +quite expensive to achieve with a heap (I did actually try this for comparison). Furthermore, +this peek's logarithmic behavior is quite good (on my computer I can do a million +peeks at a priority map with a million items in 750ms). Also, consider that peek and pop +usually follow one another, and even with a heap, pop is logarithmic. So the net combination +of peek and pop is not much different between this versatile formulation of a priority map and +a more limited heap-based one. In a nutshell, peek, although not O(1), is unlikely to be the +bottleneck in your program. + +All in all, I hope you will find priority maps to be an easy-to-use and useful addition +to Clojure's assortment of built-in maps (hash-map and sorted-map). +"} + clojure.data.priority-map + (:refer-clojure :exclude [subseq rsubseq]) + (:import clojure.lang.MapEntry clojure.lang.PersistentTreeMap)) ;;; java.util.Map + +(declare pm-empty) + +(defmacro apply-keyfn [x] + `(if ~'keyfn (~'keyfn ~x) ~x)) + +(defmacro ^:private compile-if [test then else] + (if (eval test) + then + else)) + +;; We create a patched version of subseq and rsubseq from core, that works on ordinary sorted collections, as well as priority maps +;; See https://dev.clojure.org/jira/browse/CLJ-428 + +(defn mk-bound-fn + {:private true} + [^clojure.lang.Sorted sc test key] + (fn [e] (test (.. sc comparator (Compare (. sc entryKey e) key)) 0))) ;;; compare + +(defn subseq + "sc must be a sorted collection, test(s) one of <, <=, > or + >=. Returns a seq of those entries with keys ek for + which (test (.. sc comparator (compare ek key)) 0) is true" + ([^clojure.lang.Sorted sc test key] + (let [include (mk-bound-fn sc test key)] + (if (#{> >=} test) + (when-let [[e :as s] (. sc seqFrom key true)] + (seq (drop-while #(not (include %)) s))) + (seq (take-while include (. sc seq true)))))) + ([^clojure.lang.Sorted sc start-test start-key end-test end-key] + (when-let [[e :as s] (. sc seqFrom start-key true)] + (seq (take-while (mk-bound-fn sc end-test end-key) + (drop-while (complement (mk-bound-fn sc start-test start-key)) s)))))) + +(defn rsubseq + "sc must be a sorted collection, test(s) one of <, <=, > or + >=. Returns a reverse seq of those entries with keys ek for + which (test (.. sc comparator (compare ek key)) 0) is true" + ([^clojure.lang.Sorted sc test key] + (let [include (mk-bound-fn sc test key)] + (if (#{< <=} test) + (when-let [[e :as s] (. sc seqFrom key false)] + (seq (drop-while #(not (include %)) s))) + (seq (take-while include (. sc seq false)))))) + ([^clojure.lang.Sorted sc start-test start-key end-test end-key] + (when-let [[e :as s] (. sc seqFrom end-key false)] + (seq (take-while (mk-bound-fn sc start-test start-key) + (drop-while (complement (mk-bound-fn sc end-test end-key)) s)))))) + +;; A Priority Map is comprised of a sorted map that maps priorities to hash sets of items +;; with that priority (priority->set-of-items), +;; as well as a hash map that maps items to priorities (item->priority) +;; Priority maps may also have metadata +;; Priority maps can also have a keyfn which is applied to the "priorities" found as values in +;; the item->priority map to get the actual sortable priority keys used in priority->set-of-items. + +(deftype PersistentPriorityMap [priority->set-of-items item->priority _meta keyfn] + Object + (ToString [this] (str (.seq ^clojure.lang.Seqable this))) ;;; toString + added ^PersistentPriorityMap + + clojure.lang.ILookup + ;; valAt gives (get pm key) and (get pm key not-found) behavior + (valAt [this item] (get item->priority item)) + (valAt [this item not-found] (get item->priority item not-found)) + + clojure.lang.IPersistentMap + (count [this] (count item->priority)) + + (clojure.lang.IPersistentMap.assoc [this item priority] ;;; clojure.lang.IPersistentMap. added + (let [current-priority (get item->priority item nil)] + (if current-priority + ;;Case 1 - item is already in priority map, so this is a reassignment + (if (= current-priority priority) + ;;Subcase 1 - no change in priority, do nothing + this + (let [priority-key (apply-keyfn priority) + current-priority-key (apply-keyfn current-priority) + item-set (get priority->set-of-items current-priority-key)] + (if (= (count item-set) 1) + ;;Subcase 2 - it was the only item of this priority + ;;so remove old priority entirely + ;;and conj item onto new priority's set + (PersistentPriorityMap. + (assoc (dissoc priority->set-of-items current-priority-key) + priority-key (conj (get priority->set-of-items priority-key #{}) item)) + (assoc item->priority item priority) + (meta this) + keyfn) + ;;Subcase 3 - there were many items associated with the item's original priority, + ;;so remove it from the old set and conj it onto the new one. + (PersistentPriorityMap. + (assoc priority->set-of-items + current-priority-key (disj (get priority->set-of-items current-priority-key) item) + priority-key (conj (get priority->set-of-items priority-key #{}) item)) + (assoc item->priority item priority) + (meta this) + keyfn)))) + ;; Case 2: Item is new to the priority map, so just add it. + (let [priority-key (apply-keyfn priority)] + (PersistentPriorityMap. + (assoc priority->set-of-items + priority-key (conj (get priority->set-of-items priority-key #{}) item)) + (assoc item->priority item priority) + (meta this) + keyfn))))) + + (empty [this] (PersistentPriorityMap. (empty priority->set-of-items) {} _meta keyfn)) + + ;; cons defines conj behavior + (clojure.lang.IPersistentMap.cons [this e] ;;; clojure.lang.IPersistentMap. added + (if (map? e) + (into this e) + (let [[item priority] e] (.assoc this item priority)))) + + + ;; Like sorted maps, priority maps are equal to other maps provided + ;; their key-value pairs are the same. + (equiv [this o] (= item->priority o)) + (GetHashCode [this] (.GetHashCode item->priority)) ;;; hashCode .hashCode + (Equals [this o] (or (identical? this o) (.Equals item->priority o))) ;;; equals .Equals + + ;;containsKey implements (contains? pm k) behavior + (containsKey [this item] (contains? item->priority item)) + + (entryAt [this k] + (let [v (.valAt this k this)] + (when-not (identical? v this) + (MapEntry. k v)))) + + (seq [this] + (if keyfn + (seq (for [[priority item-set] priority->set-of-items, item item-set] + (MapEntry. item (item->priority item)))) + (seq (for [[priority item-set] priority->set-of-items, item item-set] + (MapEntry. item priority))))) + + ;;without implements (dissoc pm k) behavior + (without + [this item] + (let [priority (item->priority item ::not-found)] + (if (= priority ::not-found) + ;; If item is not in map, return the map unchanged. + this + (let [priority-key (apply-keyfn priority) + item-set (priority->set-of-items priority-key)] + (if (= (count item-set) 1) + ;;If it is the only item with this priority, remove that priority's set completely + (PersistentPriorityMap. (dissoc priority->set-of-items priority-key) + (dissoc item->priority item) + (meta this) + keyfn) + ;;Otherwise, just remove the item from the priority's set. + (PersistentPriorityMap. + (assoc priority->set-of-items priority-key (disj item-set item)), + (dissoc item->priority item) + (meta this) + keyfn)))))) + + ;;; Had to add the IPersistentCollection methods because of the masking of IPersistentCollection.cons by IPersistenMap.cons -- need to be smarter in the deftype -- someday -- major sigh + clojure.lang.IPersistentCollection + (count [this] (count item->priority)) + (clojure.lang.IPersistentCollection.cons [this e] + (if (map? e) + (into this e) + (let [[item priority] e] (assoc this item priority)))) + (empty [this] (PersistentPriorityMap. (empty priority->set-of-items) {} _meta keyfn)) + (equiv [this o] (= item->priority o)) + + ;;; Similarly for Associative // assoc + clojure.lang.Associative + (containsKey [this item] (contains? item->priority item)) + (entryAt [this k] + (let [v (.valAt this k this)] + (when-not (identical? v this) + (MapEntry. k v)))) + (clojure.lang.Associative.assoc [this k v] (.assoc ^clojure.lang.IPersistentMap this k v)) + + + clojure.lang.IHashEq + (hasheq [this] + (compile-if (resolve 'clojure.core/hash-unordered-coll) + (hash-unordered-coll this) + (.GetHashCode this))) ;;; .hashCode + + ;;; We need to attach at attribute -- I have to look up how to do this ;;; java.io.Serializable ;Serialization comes for free with the other things implemented + clojure.lang.MapEquivalence + + System.Collections.IDictionary + (get_IsFixedSize [this] false) + (get_IsReadOnly [this] true) + (get_Keys [this] (keys this)) + (get_Values [this] (vals this)) + (get_Item [this key] (.valAt this key)) + (Add [this k v] (throw (NotImplementedException.))) + (Clear [this] (throw (NotImplementedException.))) + (Contains [this key] (contains? item->priority key)) + (System.Collections.IDictionary.GetEnumerator [this] (clojure.lang.MapEnumerator. ^clojure.lang.IPersistentMap this )) + (Remove [this key] (throw (NotImplementedException.))) + (get_IsSynchronized [this] true) + (get_Count [this] (count item->priority)) + (get_SyncRoot [this] this) + (CopyTo [this array index] (throw (NotImplementedException.))) ;;; TODO -- when I'm feeling less lazy + + + ;;; Map ;Makes this compatible with java's map + ;;;(size [this] (count item->priority)) + ;;;(isEmpty [this] (zero? (count item->priority))) + ;;;(containsValue [this v] + ;;; (if keyfn + ;;; (some (partial = v) (vals this)) ; no shortcut if there is a keyfn + ;;; (contains? priority->set-of-items v))) + ;;;(get [this k] (.valAt this k)) + ;;;(put [this k v] (throw (NotImplementedException.))) ;;; UnsupportedOperationException + ;;;(remove [this k] (throw (NotImplementedException.))) ;;; UnsupportedOperationException + ;;;(putAll [this m] (throw (NotImplementedException.))) ;;; UnsupportedOperationException + ;;;(clear [this] (throw (NotImplementedException.))) ;;; UnsupportedOperationException + ;;;(keySet [this] (set (keys this))) + ;;;(values [this] (vals this)) + ;;;(entrySet [this] (set this)) + + System.Collections.IEnumerable ;;; Iterable + (System.Collections.IEnumerable.GetEnumerator [this] (clojure.lang.SeqEnumerator. (seq this))) ;;; iterator SeqIterator. + + clojure.core.protocols/IKVReduce + (kv-reduce [this f init] + (if keyfn + (reduce-kv (fn [a k v] + (reduce (fn [a v] (f a v (item->priority v))) a v)) + init priority->set-of-items) + (reduce-kv (fn [a k v] + (reduce (fn [a v] (f a v k)) a v)) + init priority->set-of-items))) + + clojure.lang.IPersistentStack + (peek [this] + (when-not (= (count item->priority) 0) ;;; (.isEmpty this) + (let [f (first priority->set-of-items) + item (first (val f))] + (if keyfn + (MapEntry. item (item->priority item)) + (MapEntry. item (key f)))))) + + (pop [this] + (if (= (count item->priority) 0) (throw (InvalidOperationException. "Can't pop empty priority map")) ;;; (.isEmpty this) IllegalStateException. + (let [f (first priority->set-of-items), + item-set (val f) + item (first item-set), + priority-key (key f)] + (if (= (count item-set) 1) + ;;If the first item is the only item with its priority, remove that priority's set completely + (PersistentPriorityMap. + (dissoc priority->set-of-items priority-key) + (dissoc item->priority item) + (meta this) + keyfn) + ;;Otherwise, just remove the item from the priority's set. + (PersistentPriorityMap. + (assoc priority->set-of-items priority-key (disj item-set item)), + (dissoc item->priority item) + (meta this) + keyfn))))) + + clojure.lang.IFn + ;;makes priority map usable as a function + (invoke [this k] (.valAt this k)) + (invoke [this k not-found] (.valAt this k not-found)) + + clojure.lang.IObj + ;;adds metadata support + (meta [this] _meta) + (withMeta [this m] (PersistentPriorityMap. priority->set-of-items item->priority m keyfn)) + + clojure.lang.Reversible + (rseq [this] + (if keyfn + (seq (for [[priority item-set] (rseq priority->set-of-items), item item-set] + (MapEntry. item (item->priority item)))) + (seq (for [[priority item-set] (rseq priority->set-of-items), item item-set] + (MapEntry. item priority))))) + + clojure.lang.Sorted + ;; These methods provide support for subseq and rsubseq + (comparator [this] (.comparator ^PersistentTreeMap priority->set-of-items)) + (entryKey [this entry] (if keyfn (keyfn (val entry)) (val entry))) + (seqFrom [this k ascending] + (let [sets (if ascending (subseq priority->set-of-items >= k) (rsubseq priority->set-of-items <= k))] + (if keyfn + (seq (for [[priority item-set] sets, item item-set] + (MapEntry. item (item->priority item)))) + (seq (for [[priority item-set] sets, item item-set] + (MapEntry. item priority)))))) + (seq [this ascending] + (if ascending (seq this) (rseq this)))) + +(def ^:private pm-empty (PersistentPriorityMap. (sorted-map) {} {} nil)) +(defn- pm-empty-by [comparator] (PersistentPriorityMap. (sorted-map-by comparator) {} {} nil)) +(defn- pm-empty-keyfn + ([keyfn] (PersistentPriorityMap. (sorted-map) {} {} keyfn)) + ([keyfn comparator] (PersistentPriorityMap. (sorted-map-by comparator) {} {} keyfn))) + + +;; The main way to build priority maps +(defn priority-map + "Usage: (priority-map key val key val ...) + Returns a new priority map with optional supplied mappings. + (priority-map) returns an empty priority map." + [& keyvals] + {:pre [(even? (count keyvals))]} + (reduce conj pm-empty (partition 2 keyvals))) + +(defn priority-map-by + "Usage: (priority-map comparator key val key val ...) + Returns a new priority map with custom comparator and optional supplied mappings. + (priority-map-by comparator) yields an empty priority map with custom comparator." + [comparator & keyvals] + {:pre [(even? (count keyvals))]} + (reduce conj (pm-empty-by comparator) (partition 2 keyvals))) + +(defn priority-map-keyfn + "Usage: (priority-map-keyfn keyfn key val key val ...) + Returns a new priority map with custom keyfn and optional supplied mappings. + The priority is determined by comparing (keyfn val). + (priority-map-keyfn keyfn) yields an empty priority map with custom keyfn." + [keyfn & keyvals] + {:pre [(even? (count keyvals))]} + (reduce conj (pm-empty-keyfn keyfn) (partition 2 keyvals))) + +(defn priority-map-keyfn-by + "Usage: (priority-map-keyfn-by keyfn comparator key val key val ...) + Returns a new priority map with custom keyfn, custom comparator, and optional supplied mappings. + The priority is determined by comparing (keyfn val). + (priority-map-keyfn-by keyfn comparator) yields an empty priority map with custom keyfn and comparator." + [keyfn comparator & keyvals] + {:pre [(even? (count keyvals))]} + (reduce conj (pm-empty-keyfn keyfn comparator) (partition 2 keyvals))) + +(defn priority->set-of-items + "Takes a priority map p, and returns a sorted map from each priority + to the set of items with that priority in p" + [^PersistentPriorityMap p] + (.priority->set-of-items p)) \ No newline at end of file diff --git a/typed/clj.analyzer/src/typed/clj/analyzer/utils.clj b/typed/clj.analyzer/src/typed/clj/analyzer/utils.clj index 4a12b68b0..1e31730cc 100644 --- a/typed/clj.analyzer/src/typed/clj/analyzer/utils.clj +++ b/typed/clj.analyzer/src/typed/clj/analyzer/utils.clj @@ -14,17 +14,30 @@ [clojure.reflect :as reflect] [clojure.string :as s] [clojure.core.memoize :refer [lru]] - [clojure.java.io :as io]) + #?(:cljr [clojure.clr.io] :default [clojure.java.io :as io] )) (:import (clojure.lang RT Symbol Var) - org.objectweb.asm.Type)) + #?(:clj org.objectweb.asm.Type))) (set! *warn-on-reflection* true) +#?( +:cljr + +(defn ^:private type-reflect + [typeref & options] + (apply reflect/type-reflect typeref + options)) + +:default + (defn ^:private type-reflect [typeref & options] (apply reflect/type-reflect typeref - :reflector (reflect/->JavaReflector (RT/baseLoader)) + :reflector #?(:cljr (reflect/->ClrReflector nil) + :default (reflect/->JavaReflector (RT/baseLoader))) options)) +) + ;difference: use ana2/resolve-sym (defn macro? [sym env] @@ -41,6 +54,30 @@ (or (not inline-arities-f) (inline-arities-f (count args))) (:inline (meta v)))))) + +#?( +:cljr + +(defn specials [c] + (case c + "byte" Byte ;;; Byte/TYPE + "boolean" Boolean ;;; Boolean/TYPE + "char" Char ;;; Character/TYPE + "int" Int32 ;;; Integer/TYPE + "long" Int64 ;;; Long/TYPE + "float" Single ;;; Float/TYPE + "double" Double ;;; Double/TYPE + "short" Int16 ;;; Short/TYPE + "void" System.Void ;;; Void/TYPE + "object" Object ;;; DM: Added + "decimal" Decimal ;;; DM: Added + "sbyte" SByte ;;; DM: Added + "ushort" UInt16 ;;; DM: Added + "uint" UInt32 ;;; DM: Added + "ulong" UInt64 ;;; DM: Added + nil)) + +:default (defn specials [c] (case c @@ -55,6 +92,30 @@ "void" Void/TYPE "object" Object nil)) +) + +#?( +:cljr + +(defn special-arrays [c] + (case c + "bytes" |System.Byte[]| ;;; (Class/forName "[B") + "booleans" |System.Boolean[]| ;;; (Class/forName "[Z") + "chars" |System.Char[]| ;;; (Class/forName "[C") + "ints" |System.Int32[]| ;;; (Class/forName "[I") + "longs" |System.Int64[]| ;;; (Class/forName "[J") + "floats" |System.Single[]| ;;; (Class/forName "[F") + "doubles" |System.Double[]| ;;; (Class/forName "[D") + "shorts" |System.Int16[]| ;;; (Class/forName "[S") + "objects" |System.Object[]| ;;; (Class/forName "[Ljava.lang.Object;") + "sbytes" |System.SByte[]| ;;; DM: Added + "ushorts" |System.Int16[]| ;;; DM: Added + "uints" |System.Int32[]| ;;; DM: Added + "ulongs" |System.Int64[]| ;;; DM: Added + "decimals" |System.Decimal[]| ;;; DM: Added + nil)) + +:default (defn special-arrays [c] (case c @@ -68,11 +129,27 @@ "shorts" (Class/forName "[S") "objects" (Class/forName "[Ljava.lang.Object;") nil)) +) + -(defmulti ^Class maybe-class +(defmulti ^#?(:cljr Type :default Class) maybe-class "Takes a Symbol, String or Class and tries to resolve to a matching Class" class) + +#?( +:cljr + +(defn array-class [element-type] + (RT/classForName + (str (-> element-type + maybe-class + .FullName + (.Replace \/ \.)) + "[]"))) + +:default + (defn array-class [element-type] (RT/classForName (str "[" (-> element-type @@ -80,18 +157,20 @@ Type/getType .getDescriptor (.replace \/ \.))))) +) + ;difference: always use ana2/resolve-sym (defn maybe-class-from-string [^String s] - (or (when-let [maybe-class (and (neg? (.indexOf s ".")) + (or (when-let [maybe-class (and (neg? (#?(:cljr .IndexOf :default .indexOf) s ".")) (not= \[ (first s)) (ana2/resolve-sym (symbol s) {:ns (ns-name *ns*)}))] (when (class? maybe-class) maybe-class)) (try (RT/classForName s) - (catch ClassNotFoundException _)))) + (catch #?(:cljr Exception :default ClassNotFoundException) _)))) (defmethod maybe-class :default [_] nil) -(defmethod maybe-class Class [c] c) +(defmethod maybe-class #?(:cljr Type :default Class) [c] c) (defmethod maybe-class String [s] (maybe-class (symbol s))) @@ -99,7 +178,7 @@ (when-not (namespace sym) (let [sname (name sym) snamec (count sname)] - (if-let [base-type (and (.endsWith sname "<>") + (if-let [base-type (and (#?(:cljr .EndsWith :default .endsWith) sname "<>") (maybe-class (subs sname 0 (- snamec 2))))] (array-class base-type) (if-let [ret (or (specials sname) @@ -114,11 +193,43 @@ (maybe-class-from-string (name x))) (string? x) (maybe-class-from-string x))) +#?( +:cljr + +(def primitive? + "Returns non-nil if the argument represents a primitive Class other than Void" + #{Double Char Byte Boolean SByte Decimal + Int16 Single Int64 Int32 UInt16 UInt64 UInt32}) + +:default + (def primitive? "Returns non-nil if the argument represents a primitive Class other than Void" #{Double/TYPE Character/TYPE Byte/TYPE Boolean/TYPE Short/TYPE Float/TYPE Long/TYPE Integer/TYPE}) +) +#?( +:cljr +(def ^:private convertible-primitives + "If the argument is a primitive Class, returns a set of Classes + to which the primitive Class can be casted" + {Int32 #{Int32 Int64 Int16 Byte SByte} + Single #{Single Double} + Double #{Double Single} + Int64 #{Int64 Int32 Int16 Byte} + Char #{Char} + Int16 #{Int16} + Byte #{Byte} + Boolean #{Boolean} + UInt32 #{Int32 Int64 Int16 Byte SByte} + UInt64 #{Int64 Int32 Int16 Byte} + UInt16 #{Int16} + SByte #{SByte} + Decimal #{Decimal} + System.Void #{System.Void}}) + +:default (def ^:private convertible-primitives "If the argument is a primitive Class, returns a set of Classes to which the primitive Class can be casted" @@ -131,6 +242,17 @@ Byte/TYPE #{Byte Object Number} Boolean/TYPE #{Boolean Object} Void/TYPE #{Void}}) +) + +#?( +:cljr +(defn ^Type box + "If the argument is a primitive Class, returns its boxed equivalent, + otherwise returns the argument" + [c] + c) + +:default (defn ^Class box "If the argument is a primitive Class, returns its boxed equivalent, @@ -146,6 +268,19 @@ Boolean/TYPE Boolean Void/TYPE Void} c c)) +) + + +#?( +:cljr + +(defn ^Type unbox ;;; ^Class + "If the argument is a Class with a primitive equivalent, returns that, + otherwise returns the argument" + [c] + c) + +:default (defn ^Class unbox "If the argument is a Class with a primitive equivalent, returns that, @@ -161,13 +296,17 @@ Double Double/TYPE, Void Void/TYPE} c c)) +) (defn numeric? "Returns true if the given class is numeric" [c] (when c - (.isAssignableFrom Number (box c)))) + #?(:cljr (clojure.lang.Util/IsNumeric ^Type c) :default (.isAssignableFrom Number (box c))))) +(defmacro assignable-from? [t1 t2] + `(#?(:cljr .IsAssignableFrom :default .isAssignableFrom) ~t1 ~t2)) + (defn subsumes? "Returns true if c2 is subsumed by c1" [c1 c2] @@ -176,7 +315,7 @@ (and (not= c1 c2) (or (and (not (primitive? c1)) (primitive? c2)) - (.isAssignableFrom c2 c1))))) + (assignable-from? c2 c1))))) (defn convertible? "Returns true if it's possible to convert from c1 to c2" @@ -187,11 +326,29 @@ (not (primitive? c2)) (or (= c1 c2) - (.isAssignableFrom c2 c1) + (assignable-from? c2 c1) (and (primitive? c2) ((convertible-primitives c2) c1)) (and (primitive? c1) - (.isAssignableFrom (box c1) c2)))))) + (assignable-from? (box c1) c2)))))) +#?( +:cljr + +(def wider-than + "If the argument is a numeric primitive Class, returns a set of primitive Classes + that are narrower than the given one" + {Int64 #{Int32 UInt32 Int16 UInt16 Byte SByte} + Int32 #{Int16 UInt16 Byte SByte} + Single #{Int32 UInt32 Int16 UInt16 Byte SByte} + Double #{Int32 UInt32 Int16 UInt16 Byte SByte Single} + Int16 #{Byte SByte} + UInt64 #{Int32 UInt32 Int16 UInt16 Byte SByte} + UInt32 #{Int16 UInt16 Byte SByte} + UInt16 #{Byte SByte} + Decimal #{} + Byte #{}}) + +:default (def wider-than "If the argument is a numeric primitive Class, returns a set of primitive Classes @@ -202,6 +359,8 @@ Double/TYPE #{Integer/TYPE Short/TYPE Byte/TYPE Long/TYPE Float/TYPE} Short/TYPE #{Byte/TYPE} Byte/TYPE #{}}) +) + (defn wider-primitive "Given two numeric primitive Classes, returns the wider one" @@ -259,11 +418,11 @@ (def munge (lru (fn [^String nme] - (let [ar (.toCharArray nme)] + (let [ar (#?(:cljr .ToCharArray :default .toCharArray) nme)] (str (areduce ar i sb (StringBuilder.) - (.append sb (munge-dispatch (aget ar i))))))))) + (#?(:cljr .Append :default .append) sb (munge-dispatch (aget ar i))))))))) (comment (time @@ -277,7 +436,7 @@ (defn name-matches? [member] (let [member-name (str member) - i (.lastIndexOf member-name ".") + i (#?(:cljr .LastIndexOf :default .lastIndexOf) member-name ".") member-name* (when (pos? i) (str (s/replace (subs member-name 0 i) "-" "_") (subs member-name i))) member-name** (s/replace member-name "-" "_") @@ -302,8 +461,8 @@ (not-any? #{:public :protected} flags)) (-> class maybe-class - ^Class (box) - .getName + ^#?(:cljr Type :default Class) (box) + #?(:cljr .FullName :default.getName) symbol (type-reflect :ancestors true) :members))))))) @@ -359,13 +518,33 @@ [tag] (if (and tag (primitive? tag)) tag - java.lang.Object)) + #?(:cljr System.Object :default java.lang.Object))) + +#?( +:cljr + +;;; We have to work a lot harder on this one. +;;; The idea is that if (in Java) tags is Long Object Double Object, then you extract LODO and look up "clojure.lang.IFn$LODO" to see if it is a class. +;;; This would be one of the primitive interface types. +;;; Our problem is that we have Int64 instead of Long, so we get "I" instead of "L". Double and Object are okay. +;;; We'll create a map mapping Int64, Double, Object to the correct character, and default every other type to something bogus. +;;; Then do the class lookup. However, our classes are named clojure.lang.primifs.LODO, e.g. + +(defn prim-interface [tags] + (when (some primitive? tags) + (let [sig (apply str (mapv #(get {Object "O" Int64 "L" Double "D"} % "x") tags))] + (maybe-class (str "clojure.lang.primifs." sig))))) + +:default (defn prim-interface [tags] (when (some primitive? tags) (let [sig (apply str (mapv #(.toUpperCase (subs (.getSimpleName ^Class %) 0 1)) tags))] (maybe-class (str "clojure.lang.IFn$" sig))))) +) + + (defn tag-match? [arg-tags meth] (every? identity (map convertible? arg-tags (:parameter-types meth)))) @@ -391,15 +570,15 @@ (cond (= prev-ret next-ret) (cond - (.isAssignableFrom prev-decl next-decl) + (assignable-from? prev-decl next-decl) [next] - (.isAssignableFrom next-decl prev-decl) + (assignable-from? next-decl prev-decl) p :else (conj p next)) - (.isAssignableFrom prev-ret next-ret) + (assignable-from? prev-ret next-ret) [next] - (.isAssignableFrom next-ret prev-ret) + (assignable-from? next-ret prev-ret) p :else (conj p next)) @@ -413,7 +592,18 @@ (defn ns->relpath [s] (-> s str (s/replace \. \/) (s/replace \- \_) (str ".clj"))) +#?( +:cljr + +;; no equivalent + +(defn ns-url [ns] + (ns->relpath ns)) + +:default (defn ns-url [ns] (let [f (ns->relpath ns)] (or (io/resource f) (io/resource (str f "c"))))) + +) diff --git a/typed/cljc.analyzer/deps-clr.edn b/typed/cljc.analyzer/deps-clr.edn new file mode 100644 index 000000000..1f95ba371 --- /dev/null +++ b/typed/cljc.analyzer/deps-clr.edn @@ -0,0 +1,3 @@ +;; DO NOT EDIT! Instead, edit `dev/resources/root-templates/typed/cljc.analyzer/deps.edn` and run `./script/regen-selmer.sh` +{:paths ["src"] +} \ No newline at end of file diff --git a/typed/cljc.analyzer/src/typed/cljc/analyzer.cljc b/typed/cljc.analyzer/src/typed/cljc/analyzer.cljc index 897642f27..4369b1d7f 100644 --- a/typed/cljc.analyzer/src/typed/cljc/analyzer.cljc +++ b/typed/cljc.analyzer/src/typed/cljc/analyzer.cljc @@ -154,9 +154,9 @@ (defmacro create-expr [m cls] {:pre [(symbol? cls) (map? m)]} - (let [^Class rcls (resolve cls) + (let [^#?(:cljr Type :default Class) rcls (resolve cls) _ (assert (class? rcls) {:cls cls :resolved rcls}) - rsym (symbol (.getName rcls)) + rsym (symbol (#?(:cljr .FullName :default .getName) rcls)) {:keys [fields] :as info} (get defexpr-info rsym) _ (assert info (str "No info for expr " cls)) fset (into #{} (map keyword) fields) @@ -170,9 +170,9 @@ (defmacro update-expr [e cls & cases] {:pre [(symbol? cls) (every? vector? cases)]} - (let [^Class rcls (resolve cls) + (let [^#?(:cljr Type :default Class) rcls (resolve cls) _ (assert (class? rcls) {:cls cls :resolved rcls}) - rsym (symbol (.getName rcls)) + rsym (symbol (#?(:cljr .FullName :default .getName) rcls)) {:keys [fields] :as info} (get defexpr-info rsym) _ (assert info (str "No info for expr " cls)) ks (map first cases) From 77dce0a001eca57f7b2dd571a9120f15c0b7814f Mon Sep 17 00:00:00 2001 From: David Miller Date: Sat, 27 Apr 2024 11:36:22 -0400 Subject: [PATCH 02/13] (WIP) more conditionalizing for ClojureCLR --- .../typed/clj/{analyzer.clj => analyzer.cljc} | 95 ++++++++++++++----- ...e_host_expr.clj => analyze_host_expr.cljc} | 6 +- ..._host_info.clj => annotate_host_info.cljc} | 22 ++++- .../{annotate_tag.clj => annotate_tag.cljc} | 4 +- .../{beta_reduce.clj => beta_reduce.cljc} | 4 +- ...assify_invoke.clj => classify_invoke.cljc} | 4 +- .../passes/{emit_form.clj => emit_form.cljc} | 6 +- .../passes/{infer_tag.clj => infer_tag.cljc} | 4 +- .../passes/{validate.clj => validate.cljc} | 15 +-- .../clj/analyzer/{utils.clj => utils.cljc} | 0 10 files changed, 108 insertions(+), 52 deletions(-) rename typed/clj.analyzer/src/typed/clj/{analyzer.clj => analyzer.cljc} (87%) rename typed/clj.analyzer/src/typed/clj/analyzer/passes/{analyze_host_expr.clj => analyze_host_expr.cljc} (97%) rename typed/clj.analyzer/src/typed/clj/analyzer/passes/{annotate_host_info.clj => annotate_host_info.cljc} (86%) rename typed/clj.analyzer/src/typed/clj/analyzer/passes/{annotate_tag.clj => annotate_tag.cljc} (94%) rename typed/clj.analyzer/src/typed/clj/analyzer/passes/{beta_reduce.clj => beta_reduce.cljc} (99%) rename typed/clj.analyzer/src/typed/clj/analyzer/passes/{classify_invoke.clj => classify_invoke.cljc} (97%) rename typed/clj.analyzer/src/typed/clj/analyzer/passes/{emit_form.clj => emit_form.cljc} (96%) rename typed/clj.analyzer/src/typed/clj/analyzer/passes/{infer_tag.clj => infer_tag.cljc} (98%) rename typed/clj.analyzer/src/typed/clj/analyzer/passes/{validate.clj => validate.cljc} (93%) rename typed/clj.analyzer/src/typed/clj/analyzer/{utils.clj => utils.cljc} (100%) diff --git a/typed/clj.analyzer/src/typed/clj/analyzer.clj b/typed/clj.analyzer/src/typed/clj/analyzer.cljc similarity index 87% rename from typed/clj.analyzer/src/typed/clj/analyzer.clj rename to typed/clj.analyzer/src/typed/clj/analyzer.cljc index dd1ebdd8e..bf4d6616b 100644 --- a/typed/clj.analyzer/src/typed/clj/analyzer.clj +++ b/typed/clj.analyzer/src/typed/clj/analyzer.cljc @@ -26,7 +26,9 @@ [typed.clj.analyzer.passes.infer-tag :as infer-tag] [typed.clj.analyzer.passes.validate :as validate] [typed.clj.analyzer.utils :as ju]) - (:import [clojure.lang IObj RT Var Compiler$LocalBinding])) + (:import [clojure.lang IObj RT Var] + #?(:cljr [clojure.lang.CljCompiler.Ast LocalBinding] + :default [clojure.lang Compiler$LocalBinding]))) (def ^:dynamic *parse-deftype-with-existing-class* "If true, don't generate a new class when analyzing deftype* if a class @@ -67,18 +69,18 @@ (meta form))) (cond - (.startsWith opname ".") ; (.foo bar ..) + (#?(:cljr .StartsWith :default .startsWith) opname ".") ; (.foo bar ..) (let [[target & args] expr target (if-let [target (ju/maybe-class-literal target)] (with-meta (list 'do target) - {:tag 'java.lang.Class}) + {:tag #?(:cljr 'System.Type :default 'java.lang.Class)}) target) args (list* (symbol (subs opname 1)) args)] (with-meta (list '. target (if (= 1 (count args)) ;; we don't know if (.foo bar) is (first args) args)) ;; a method call or a field access (meta form))) - (.endsWith opname ".") ;; (class. ..) + (#?(:cljr .EndsWith :default .endsWith) opname ".") ;; (class. ..) (with-meta (list* 'new (symbol (subs opname 0 (dec (count opname)))) expr) (meta form)) @@ -239,7 +241,7 @@ (ju/special-arrays (str t))) t (if-let [c (ju/maybe-class t)] - (let [new-t (-> c .getName symbol)] + (let [new-t (-> c #?(:cljr .FullName :default .getName) symbol)] (if (= new-t t) t (with-meta new-t {::qualified? true}))) @@ -361,7 +363,7 @@ (memo/memo-clear! ju/members* [arg]) (memo/memo-clear! ju/members* [(str arg)])) - (let [interfaces (mapv #(symbol (.getName ^Class %)) interfaces)] + (let [interfaces (mapv #(symbol #?(:cljr (.FullName ^Type %) :default (.getName ^Class %))) interfaces)] (eval (list 'let [] (list 'deftype* cname class-name args :implements interfaces) (list 'import class-name))))) @@ -567,19 +569,33 @@ ([form] (analyze form (empty-env) {})) ([form env] (analyze form env {})) ([form env opts] - (with-bindings (into {Compiler/LOADER (RT/makeClassLoader) - #'ana/macroexpand-1 macroexpand-1 - #'ana/create-var create-var - #'ana/scheduled-passes @scheduled-default-passes - #'ana/parse parse - #'ana/var? var? - #'ana/resolve-ns resolve-ns - #'ana/resolve-sym resolve-sym - #'ana/unanalyzed unanalyzed - #'ana/analyze-outer analyze-outer - #'ana/current-ns-name current-ns-name - ;#'*ns* (the-ns (:ns env)) - } + (with-bindings (into #?(:cljr + {#'ana/macroexpand-1 macroexpand-1 + #'ana/create-var create-var + #'ana/scheduled-passes @scheduled-default-passes + #'ana/parse parse + #'ana/var? var? + #'ana/resolve-ns resolve-ns + #'ana/resolve-sym resolve-sym + #'ana/unanalyzed unanalyzed + #'ana/analyze-outer analyze-outer + #'ana/current-ns-name current-ns-name + ;#'*ns* (the-ns (:ns env)) + } + :default + {Compiler/LOADER (RT/makeClassLoader) + #'ana/macroexpand-1 macroexpand-1 + #'ana/create-var create-var + #'ana/scheduled-passes @scheduled-default-passes + #'ana/parse parse + #'ana/var? var? + #'ana/resolve-ns resolve-ns + #'ana/resolve-sym resolve-sym + #'ana/unanalyzed unanalyzed + #'ana/analyze-outer analyze-outer + #'ana/current-ns-name current-ns-name + ;#'*ns* (the-ns (:ns env)) + }) (:bindings opts)) (env/ensure (global-env) (env/with-env (u/mmerge (env/deref-env) {:passes-opts (get opts :passes-opts default-passes-opts)}) @@ -597,6 +613,25 @@ result (clojure.lang.Compiler/eval form)] (assoc ast :result result))) +#?( +:cljr +(defn default-thread-bindings [env] + {#'ana/macroexpand-1 macroexpand-1 + #'ana/create-var create-var + #'ana/scheduled-passes @scheduled-default-passes + #'ana/parse parse + #'ana/var? var? + #'ana/resolve-ns resolve-ns + #'ana/resolve-sym resolve-sym + #'ana/var->sym var->sym + #'ana/eval-ast eval-ast2 + #'ana/current-ns-name current-ns-name + #'ana/analyze-outer analyze-outer + #'ana/unanalyzed unanalyzed + ;#'*ns* (the-ns (:ns env)) + }) + +:default (defn default-thread-bindings [env] {Compiler/LOADER (RT/makeClassLoader) #'ana/macroexpand-1 macroexpand-1 @@ -613,6 +648,7 @@ #'ana/unanalyzed unanalyzed ;#'*ns* (the-ns (:ns env)) }) +) (defmethod emit-form/-emit-form :unanalyzed [{:keys [form] :as ast} opts] @@ -664,13 +700,20 @@ :as opts}] (env/ensure (global-env) (let [env (merge env (u/-source-info form env)) - [mform raw-forms] (with-bindings {Compiler/LOADER (RT/makeClassLoader) - ;#'*ns* (the-ns (:ns env)) - #'ana/resolve-ns resolve-ns - #'ana/resolve-sym resolve-sym - #'ana/current-ns-name current-ns-name - #'ana/macroexpand-1 (get-in opts [:bindings #'ana/macroexpand-1] - macroexpand-1)} + [mform raw-forms] (with-bindings #?(:cljr + {#'ana/resolve-ns resolve-ns + #'ana/resolve-sym resolve-sym + #'ana/current-ns-name current-ns-name + #'ana/macroexpand-1 (get-in opts [:bindings #'ana/macroexpand-1] + macroexpand-1)} + :default + {Compiler/LOADER (RT/makeClassLoader) + ;#'*ns* (the-ns (:ns env)) + #'ana/resolve-ns resolve-ns + #'ana/resolve-sym resolve-sym + #'ana/current-ns-name current-ns-name + #'ana/macroexpand-1 (get-in opts [:bindings #'ana/macroexpand-1] + macroexpand-1)}) (loop [form form raw-forms []] (let [mform (if (stop-gildardi-check form env) form diff --git a/typed/clj.analyzer/src/typed/clj/analyzer/passes/analyze_host_expr.clj b/typed/clj.analyzer/src/typed/clj/analyzer/passes/analyze_host_expr.cljc similarity index 97% rename from typed/clj.analyzer/src/typed/clj/analyzer/passes/analyze_host_expr.clj rename to typed/clj.analyzer/src/typed/clj/analyzer/passes/analyze_host_expr.cljc index b593ade2e..12c1d4a3b 100644 --- a/typed/clj.analyzer/src/typed/clj/analyzer/passes/analyze_host_expr.clj +++ b/typed/clj.analyzer/src/typed/clj/analyzer/passes/analyze_host_expr.cljc @@ -169,8 +169,8 @@ (u/maybe-class-literal (:form target)))] (merge target (assoc (ana/analyze-const the-class env :class) - :tag Class - :o-tag Class)) + :tag #?(:cljr Type :default Class) + :o-tag #?(:cljr Type :default Class))) target) class? (and (= :const (:op target)) (= :class (:type target)) @@ -194,7 +194,7 @@ {:tag tag}))) :var (if-let [the-class (and (not (namespace form)) - (pos? (.indexOf (str form) ".")) + (pos? (#?(:cljr .IndexOf :default .indexOf) (str form) ".")) (u/maybe-class-literal form))] (assoc (ana/analyze-const the-class env :class) :form form) ast) diff --git a/typed/clj.analyzer/src/typed/clj/analyzer/passes/annotate_host_info.clj b/typed/clj.analyzer/src/typed/clj/analyzer/passes/annotate_host_info.cljc similarity index 86% rename from typed/clj.analyzer/src/typed/clj/analyzer/passes/annotate_host_info.clj rename to typed/clj.analyzer/src/typed/clj/analyzer/passes/annotate_host_info.cljc index 356328eba..6f42f68a4 100644 --- a/typed/clj.analyzer/src/typed/clj/analyzer/passes/annotate_host_info.clj +++ b/typed/clj.analyzer/src/typed/clj/analyzer/passes/annotate_host_info.cljc @@ -15,6 +15,17 @@ [typed.cljc.analyzer.utils :as cu] [typed.clj.analyzer.utils :as ju])) +#?( +:cljr + +;;; Added this to deal with explicit interface implementation. +(defn explicit-implementation-name-matches + [impl-method-name interface-method-name] + (let [member-name (str impl-method-name ) + i (.LastIndexOf member-name ".")] + (and (pos? i) (= (subs member-name (inc i)) (str interface-method-name))))) +) + (defn annotate-host-info "Adds a :methods key to reify/deftype :methods info representing the reflected informations for the required methods, replaces @@ -40,7 +51,8 @@ () (let [nm? (ju/name-matches? name)] (filter #(and (= argc (count (:parameter-types %))) - (nm? (:name %))) + (or (nm? (:name %)) + #?(:cljr (explicit-implementation-name-matches name (:name %))))) all-methods)))))) methods))) @@ -50,7 +62,7 @@ (and (= :const (:op class)) (= :default (:form class))) - Throwable + #?(:cljr Exception :default Throwable) (= :maybe-class (:op class)) (ju/maybe-class-literal (:class class))) @@ -59,8 +71,8 @@ (-> ast (assoc :class (assoc (ana/analyze-const the-class env :class) :form (:form class) - :tag Class - :o-tag Class))) + :tag #?(:cljr Type :default Class) + :o-tag #?(:cljr Type :default Class)))) ast)] (assoc-in ast [:local :tag] (-> ast :class :val))) @@ -85,7 +97,7 @@ (= arg-tags (mapv ju/maybe-class parameter-types)))) rest)) (assoc (dissoc ast :interfaces :methods) :bridges (filter #(and (= arg-tags (mapv ju/maybe-class (:parameter-types %))) - (.isAssignableFrom (ju/maybe-class (:return-type %)) ret-tag)) + (#?(:cljr .IsAssignableFrom :default .isAssignableFrom) (ju/maybe-class (:return-type %)) ret-tag)) (disj methods-set (dissoc m :declaring-class :flags))) :methods methods :interface i-tag diff --git a/typed/clj.analyzer/src/typed/clj/analyzer/passes/annotate_tag.clj b/typed/clj.analyzer/src/typed/clj/analyzer/passes/annotate_tag.cljc similarity index 94% rename from typed/clj.analyzer/src/typed/clj/analyzer/passes/annotate_tag.clj rename to typed/clj.analyzer/src/typed/clj/analyzer/passes/annotate_tag.cljc index 925a4dc79..8f9297e91 100644 --- a/typed/clj.analyzer/src/typed/clj/analyzer/passes/annotate_tag.clj +++ b/typed/clj.analyzer/src/typed/clj/analyzer/passes/annotate_tag.cljc @@ -39,7 +39,7 @@ (assoc ast :o-tag t :tag t)) :char - (assoc ast :o-tag Character/TYPE :tag Character/TYPE) + (assoc ast :o-tag #?(:cljr Char :default Character/TYPE) :tag #?(:cljr Char :default Character/TYPE)) :seq (assoc ast :o-tag ISeq :tag ISeq) @@ -54,7 +54,7 @@ (and (= :arg local) variadic? ISeq) o-tag Object) - o-tag (if (#{Void Void/TYPE} o-tag) + o-tag (if (#?(:cljr #{Void} :default #{Void Void/TYPE}) o-tag) Object o-tag)] (if-let [tag (or (:tag (meta form)) tag)] diff --git a/typed/clj.analyzer/src/typed/clj/analyzer/passes/beta_reduce.clj b/typed/clj.analyzer/src/typed/clj/analyzer/passes/beta_reduce.cljc similarity index 99% rename from typed/clj.analyzer/src/typed/clj/analyzer/passes/beta_reduce.clj rename to typed/clj.analyzer/src/typed/clj/analyzer/passes/beta_reduce.cljc index 63a0344c5..c9ecbdf6b 100644 --- a/typed/clj.analyzer/src/typed/clj/analyzer/passes/beta_reduce.clj +++ b/typed/clj.analyzer/src/typed/clj/analyzer/passes/beta_reduce.cljc @@ -122,8 +122,8 @@ :max-count (count (:val ast))}]) :do (splice-seqable-expr (:ret ast)) (:let :let-fn) (splice-seqable-expr (:body ast)) - :new (let [cls ^Class (:class ast) - csym (symbol (.getName cls))] + :new (let [cls ^#?(:cljr Type :default Class) (:class ast) + csym (symbol #?(:cljr (.FullName cls) :default (.getName cls)))] (case csym ;; TODO needs testing ;clojure.lang.LazySeq (let [body (-> ast :args first :methods first :body)] diff --git a/typed/clj.analyzer/src/typed/clj/analyzer/passes/classify_invoke.clj b/typed/clj.analyzer/src/typed/clj/analyzer/passes/classify_invoke.cljc similarity index 97% rename from typed/clj.analyzer/src/typed/clj/analyzer/passes/classify_invoke.clj rename to typed/clj.analyzer/src/typed/clj/analyzer/passes/classify_invoke.cljc index 7fbfc8b04..7880ab621 100644 --- a/typed/clj.analyzer/src/typed/clj/analyzer/passes/classify_invoke.clj +++ b/typed/clj.analyzer/src/typed/clj/analyzer/passes/classify_invoke.cljc @@ -69,8 +69,8 @@ :target (second args) :form form :env env - :o-tag Boolean/TYPE - :tag (or tag Boolean/TYPE) + :o-tag #?(:cljr Boolean :default Boolean/TYPE) + :tag (or tag #?(:cljr Boolean Boolean/TYPE)) :children [:target]}) (and var? (cu/protocol-node? the-var (:meta the-fn))) diff --git a/typed/clj.analyzer/src/typed/clj/analyzer/passes/emit_form.clj b/typed/clj.analyzer/src/typed/clj/analyzer/passes/emit_form.cljc similarity index 96% rename from typed/clj.analyzer/src/typed/clj/analyzer/passes/emit_form.clj rename to typed/clj.analyzer/src/typed/clj/analyzer/passes/emit_form.cljc index e98ef3482..7285b92f3 100644 --- a/typed/clj.analyzer/src/typed/clj/analyzer/passes/emit_form.clj +++ b/typed/clj.analyzer/src/typed/clj/analyzer/passes/emit_form.cljc @@ -49,7 +49,7 @@ [{:keys [type val] :as ast} opts] (if (and (= type :class) (:qualified-symbols opts)) - (symbol (.getName ^Class val)) + (symbol #?(:cljr (.FullName ^Type val) :default (.getName ^Class val))) (default/-emit-form ast opts))) (defmethod -emit-form :monitor-enter @@ -79,12 +79,12 @@ (defn class->str [class] (if (symbol? class) (name class) - (.getName ^Class class))) + #?(:cljr (.FullName ^Type class) :default (.getName ^Class class)))) (defn class->sym [class] (if (symbol? class) class - (symbol (.getName ^Class class)))) + (symbol #?(:cljr (.FullName ^Type class) :default (.getName ^Class class))))) (defmethod -emit-form :catch [{:keys [class local body]} opts] diff --git a/typed/clj.analyzer/src/typed/clj/analyzer/passes/infer_tag.clj b/typed/clj.analyzer/src/typed/clj/analyzer/passes/infer_tag.cljc similarity index 98% rename from typed/clj.analyzer/src/typed/clj/analyzer/passes/infer_tag.clj rename to typed/clj.analyzer/src/typed/clj/analyzer/passes/infer_tag.cljc index efa0f656b..52d2bce52 100644 --- a/typed/clj.analyzer/src/typed/clj/analyzer/passes/infer_tag.clj +++ b/typed/clj.analyzer/src/typed/clj/analyzer/passes/infer_tag.cljc @@ -109,7 +109,7 @@ (let [tag (:tag body)] (-> ast (assoc :o-tag tag - :tag (if (#{Void Void/TYPE} tag) + :tag (if (#?(:cljr #{Void} :default #{Void Void/TYPE}) tag) Object tag)) (into (select-keys body [:return-tag :arglists]))))) @@ -207,7 +207,7 @@ (:tag (meta (:form local)))) body-tag (:tag body) tag (or annotated-tag body-tag) - tag (if (#{Void Void/TYPE} tag) + tag (if (#?(:cljr #{Void} :default #{Void Void/TYPE}) tag) Object tag)] (-> ast diff --git a/typed/clj.analyzer/src/typed/clj/analyzer/passes/validate.clj b/typed/clj.analyzer/src/typed/clj/analyzer/passes/validate.cljc similarity index 93% rename from typed/clj.analyzer/src/typed/clj/analyzer/passes/validate.clj rename to typed/clj.analyzer/src/typed/clj/analyzer/passes/validate.cljc index a215ffa27..95e98b501 100644 --- a/typed/clj.analyzer/src/typed/clj/analyzer/passes/validate.clj +++ b/typed/clj.analyzer/src/typed/clj/analyzer/passes/validate.cljc @@ -29,7 +29,7 @@ [{:keys [class env] :as ast}] (if-let [handle (-> (env/deref-env) :passes-opts :validate/unresolvable-symbol-handler)] (handle nil class ast) - (if (not (.contains (str class) ".")) + (if (not (#?(:cljr .Contains :default .contains) (str class) ".")) (throw (ex-info (str "Could not resolve var: " class) (into {:var class} (cu/source-info env)))) @@ -69,8 +69,8 @@ (into {:class (:form (:class ast)) :ast ast} (cu/source-info (:env ast))))) - (let [^Class class (-> ast :class :val) - c-name (symbol (.getName class)) + (let [^#?(:cljr Type :default Class) class (-> ast :class :val) + c-name #?(:cljr '.ctor :default (symbol (.getName class))) ;; ;; in .NET, ctors are named .ctor, not with the class name argc (count args) tags (mapv :tag args)] (let [[ctor & rest] (->> (filter #(= (count (:parameter-types %)) argc) @@ -162,9 +162,10 @@ (defmethod -validate :import [{:keys [^String class validated? env form] :as ast}] (if-not validated? - (let [class-sym (-> class (subs (inc (.lastIndexOf class "."))) symbol) + (let [class-sym (-> class (subs (inc #?(:cljr (.LastIndexOf class ".") :default (.lastIndexOf class ".")))) symbol) sym-val (ana2/resolve-sym class-sym env)] - (if (and (class? sym-val) (not= (.getName ^Class sym-val) class)) ;; allow deftype redef + (if (and (class? sym-val) (not= #?(:cljr (.FullName ^Type sym-val) + :default (.getName ^Class sym-val)) class)) ;; allow deftype redef (throw (ex-info (str class-sym " already refers to: " sym-val " in namespace: " (:ns env)) (into {:class class @@ -179,7 +180,7 @@ [ast] (when-not (var? (:var ast)) (throw (ex-info (str "Cannot def " (:name ast) " as it refers to the class " - (.getName ^Class (:var ast))) + #?(:cljr (.FullName ^Type (:var ast)) :default (.getName ^Class (:var ast)))) (into {:ast (ast/prewalk ast cleanup/cleanup)} (cu/source-info (:env ast)))))) (into @@ -213,7 +214,7 @@ ast))) (defn validate-interfaces [{:keys [env form interfaces]}] - (when-not (every? #(.isInterface ^Class %) (disj interfaces Object)) + (when-not (every? #?(:cljr #(.IsInterface ^Type %) :default #(.isInterface ^Class %)) (disj interfaces Object)) (throw (ex-info "only interfaces or Object can be implemented by deftype/reify" (into {:interfaces interfaces :form form} diff --git a/typed/clj.analyzer/src/typed/clj/analyzer/utils.clj b/typed/clj.analyzer/src/typed/clj/analyzer/utils.cljc similarity index 100% rename from typed/clj.analyzer/src/typed/clj/analyzer/utils.clj rename to typed/clj.analyzer/src/typed/clj/analyzer/utils.cljc From 7609f2329087d03ff7064b7fcd010f54ab09768a Mon Sep 17 00:00:00 2001 From: David Miller Date: Sat, 27 Apr 2024 11:56:26 -0400 Subject: [PATCH 03/13] (WIP) conditionalizing tests for ClojureCLR --- .../test/typed_test/clj/{analyzer.clj => analyzer.cljc} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename typed/clj.analyzer/test/typed_test/clj/{analyzer.clj => analyzer.cljc} (100%) diff --git a/typed/clj.analyzer/test/typed_test/clj/analyzer.clj b/typed/clj.analyzer/test/typed_test/clj/analyzer.cljc similarity index 100% rename from typed/clj.analyzer/test/typed_test/clj/analyzer.clj rename to typed/clj.analyzer/test/typed_test/clj/analyzer.cljc From 60b09195d543b206f41f8bade62cd07d3ea6d645 Mon Sep 17 00:00:00 2001 From: David Miller Date: Sat, 27 Apr 2024 11:57:00 -0400 Subject: [PATCH 04/13] (WIP) conditionalizing tests for ClojureCLR -- remembered to save the file this time --- .../test/typed_test/clj/analyzer.cljc | 32 ++++++++++++------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/typed/clj.analyzer/test/typed_test/clj/analyzer.cljc b/typed/clj.analyzer/test/typed_test/clj/analyzer.cljc index 2513e745d..a9161b2e0 100644 --- a/typed/clj.analyzer/test/typed_test/clj/analyzer.cljc +++ b/typed/clj.analyzer/test/typed_test/clj/analyzer.cljc @@ -27,7 +27,8 @@ (is (= true (:result (ast (do (ns foo) (= 1 1)))))) (is (= "a" - (:result (ast (.toString (reify Object (toString [this] "a"))))))) + (:result (ast #?(:cljr (.ToString (reify Object (ToString [this] "a"))) + :default (.toString (reify Object (toString [this] "a")))))))) (is (= 2 (:result (ast (#(inc %) 1))))) #_ (is (-> @@ -35,35 +36,44 @@ (:require [typed.clojure :as t])) (t/ann-form 'foo 'a))) :ret)) - (is (= [:const Number] - ((juxt :op :val) (ast Number)))) + #?(:cljr + (is (= [:const Int64] + ((juxt :op :val) (ast Int64)))) + :default + (is (= [:const Number] + ((juxt :op :val) (ast Number))))) (is (= [:const clojure.lang.Compiler] ((juxt :op :val) (ast clojure.lang.Compiler)))) - (is (= [:static-field 'LOADER] - ((juxt :op :field) (ast clojure.lang.Compiler/LOADER)))) + + #?(:cljr + (is (= [:static-field 'specials] + ((juxt :op :field) (ast clojure.lang.Compiler/specials)))) + :default + (is (= [:static-field 'LOADER] + ((juxt :op :field) (ast clojure.lang.Compiler/LOADER))))) ) (deftest local-tag-test - (is (= java.lang.String + (is (= #?(:cljr System.String :default java.lang.String) (:tag (ast "asdf")))) - (is (= [:const java.lang.String] + (is (= [:const #?(:cljr System.String :default java.lang.String)] (-> (ast (let [a "asdf"])) :bindings first :init ((juxt :op :tag))))) - (is (= [:binding java.lang.String] + (is (= [:binding #?(:cljr System.String :default java.lang.String)] (-> (ast (let [a "asdf"])) :bindings first ((juxt :op :tag))))) - (is (= [:local java.lang.String] + (is (= [:local #?(:cljr System.String :default java.lang.String)] (-> (ast (let [a "asdf"] a)) :body :ret ((juxt :op :tag))))) - (is (= java.lang.String + (is (= #?(:cljr System.String :default java.lang.String) (:tag (ast (let [a "asdf"] a))))) ) @@ -75,7 +85,7 @@ (ast (deftype A [] Object - (toString [_] (A.) "a"))))))) + (#?(:cljr ToString :default toString) [_] (A.) "a"))))))) (deftest uniquify-test (let [ret (ast' (let [a 1] From 32e6e791ed2f00783fc0ab0cb879a436f8e8ee64 Mon Sep 17 00:00:00 2001 From: David Miller Date: Sat, 27 Apr 2024 12:04:01 -0400 Subject: [PATCH 05/13] (WIP) More tests conditionalized to ClojureCLR --- .../clj/analyzer/{gilardi_test.clj => gilardi_test.cljc} | 6 +++--- .../test/typed_test/clj/analyzer/{perf.clj => perf.cljc} | 0 2 files changed, 3 insertions(+), 3 deletions(-) rename typed/clj.analyzer/test/typed_test/clj/analyzer/{gilardi_test.clj => gilardi_test.cljc} (98%) rename typed/clj.analyzer/test/typed_test/clj/analyzer/{perf.clj => perf.cljc} (100%) diff --git a/typed/clj.analyzer/test/typed_test/clj/analyzer/gilardi_test.clj b/typed/clj.analyzer/test/typed_test/clj/analyzer/gilardi_test.cljc similarity index 98% rename from typed/clj.analyzer/test/typed_test/clj/analyzer/gilardi_test.clj rename to typed/clj.analyzer/test/typed_test/clj/analyzer/gilardi_test.cljc index 3956cdda7..fca0905d2 100644 --- a/typed/clj.analyzer/test/typed_test/clj/analyzer/gilardi_test.clj +++ b/typed/clj.analyzer/test/typed_test/clj/analyzer/gilardi_test.cljc @@ -212,7 +212,7 @@ (is (= 2 (:result (chk `(do (ns ~(gensym 'foo)) (require '~'[clojure.core :as core]) - (assert (.startsWith (str (ns-name *ns*)) "foo") + (assert (#?(:cljr .StartsWith :default .startsWith) (str (ns-name *ns*)) "foo") *ns*) ;(prn (ns-aliases *ns*)) ;(println "foo ADSF") @@ -329,7 +329,7 @@ (~'demunge "a"))) nil))) (is (thrown-with-msg? - RuntimeException + #?(:cljr Exception :default RuntimeException) #"" ;#"Unable to resolve symbol: demunge in this context" (eval-in-fresh-ns `(let* [] (my-body (change-to-clojure-repl-on-eval) @@ -342,7 +342,7 @@ (~'demunge "a"))) nil))) (is (thrown-with-msg? - RuntimeException + #?(:cljr Exception :default RuntimeException) #"" ;#"Unable to resolve symbol: demunge in this context" (eval-in-fresh-ns `(let* [] (do (change-to-clojure-repl-on-eval) diff --git a/typed/clj.analyzer/test/typed_test/clj/analyzer/perf.clj b/typed/clj.analyzer/test/typed_test/clj/analyzer/perf.cljc similarity index 100% rename from typed/clj.analyzer/test/typed_test/clj/analyzer/perf.clj rename to typed/clj.analyzer/test/typed_test/clj/analyzer/perf.cljc From f0fd8eb3298ce0d2c9b07db749bfcc206a146511 Mon Sep 17 00:00:00 2001 From: David Miller Date: Mon, 6 May 2024 01:01:14 -0400 Subject: [PATCH 06/13] (WIP) Add read conditionalization for clj.runtime --- doc/runtime-dependencies.dot | 104 +++++++++++++++ doc/runtime-dependencies.png | Bin 0 -> 323636 bytes typed/clj.runtime/deps-clr.edn | 1 + typed/clj.runtime/src/clj - Shortcut.lnk | Bin 0 -> 1606 bytes .../clojure/core/{typed.clj => typed.cljc} | 14 +- .../src/clojure/core/typed/ast_utils.clj | 38 +++++- .../src/clojure/core/typed/contract.cljc | 16 ++- .../contract_utils_platform_specific.cljc | 12 +- .../src/clojure/core/typed/current_impl.cljc | 126 ++++++++++-------- .../src/clojure/core/typed/errors.cljc | 4 +- ...load_if_needed.clj => load_if_needed.cljc} | 2 +- .../src/clojure/core/typed/macros.clj | 3 +- .../src/clojure/core/typed/type_contract.clj | 6 +- .../src/typed/cljc/runtime/env.cljc | 3 +- typed/clj.runtime/src/typed/clojure.cljc | 66 +++++++-- 15 files changed, 300 insertions(+), 95 deletions(-) create mode 100644 doc/runtime-dependencies.dot create mode 100644 doc/runtime-dependencies.png create mode 100644 typed/clj.runtime/deps-clr.edn create mode 100644 typed/clj.runtime/src/clj - Shortcut.lnk rename typed/clj.runtime/src/clojure/core/{typed.clj => typed.cljc} (98%) rename typed/clj.runtime/src/clojure/core/typed/{load_if_needed.clj => load_if_needed.cljc} (94%) diff --git a/doc/runtime-dependencies.dot b/doc/runtime-dependencies.dot new file mode 100644 index 000000000..0424539d1 --- /dev/null +++ b/doc/runtime-dependencies.dot @@ -0,0 +1,104 @@ +strict digraph G { + +rankdir = RL; + +/* here start the interfaces */ + + +{ + node [shape=box]; + + + "typed.clojure" -> { + "clojure.core.typed", + "cct.macros", + "cct.platform-case"}; + "t.clojure.jvm" -> { + "clojure.core.typed", + "cct.current-impl", + "cct.internal", + "t.cljc.rt.env-utils", + "cct.macros"}; + + "t.clj.rt.env" -> {"t.cljc.rt.env"}; + "t.cljc.rt.env"; + "t.cljc.rt.env-utils" -> {"typed.clojure"}; + "t.cljc.rt.env-utils-annotations" -> { + "typed.clojure", + "t.cljc.rt.env-utils"}; + + "clojure.core.typed" -> { + "cct.util-vars", + "cct.special-form", + "cct.import-macros", + "cct.contract", + "cct.type-contract", + "cct.macros"}; + + "cct.all-envs" -> { + "cct.current-impl", + "cct.load-if-needed", + "cct.util-vars", + "t.cljc.rt.env-utils", + "t.clj.checker.parse-unparse", + "t.cljc.checker.name-env", + "t.cljc.checker.var-env", + "t.cljc.rt.env" }; + + "cct.ast-ops" -> {"cct.errors"}; + "cct.ast-utils" -> {"cct.current-impl", "cct.contract-utils"}; + "cct.coerce-utils" -> {"typed.clojure", "cct.current-impl"}; + "cct.contract"; + "cct.contract-utils"; + "cct.contract-utils-platform-specific" ->{"cct.contract-utils"}; + "cct.current-impl" -> { + "cct.contract-utils", + "cct.util-vars", + "t.cljc.rt.env", + "t.clj.rt.env", + "t.cljs.rt.env"}; + "cct.errors" -> { + "cct.util-vars", + "cct.current-impl", + "cct.ast-utils"}; + "cct.expand" -> { + "clojure.core.typed", + "cct.special-form", + "cct.internal"}; + "cct.hold" -> {"clojure.core.typed"}; + "cct.import-macros"; + "cct.internal" -> { + "cct.contract-utils", + "cct.internal.add-destructure-blame-form"}; + "cct.load" -> {"cct.load-if-needed", "cct.current-impl"}; + "cct.load-if-needed" -> {"cct.errors", "cct.util-vars"}; + "cct.macros" -> { + "cct.internal", + "cct.special-form", + "cct.platform-case"}; + "cct.parse-ast" -> { + "clojure.core.typed", + "cct.current-impl", + "cct.errors", + "cct.util-vars", + "cct.coerce-utils"}; + "cct.platform-case"; + "cct.rules" -> { + "typed.clojure", + "cct.internal", + "t.cljc.analyzer"}; + "cct.special-form"; + "cct.type-contract" -> { + "cct.errors", + "cct.current-impl", + "cct.ast-ops", + "cct.contract"}; + "cct.unsafe"; + "cct.util-vars"; + + "cct.rt.jvm.configs"; + "cct.internal.add-destructure-blame-form"; + + +} +} \ No newline at end of file diff --git a/doc/runtime-dependencies.png b/doc/runtime-dependencies.png new file mode 100644 index 0000000000000000000000000000000000000000..e2f8e5a2d523d6b249a6972f7d135ef151ad2a71 GIT binary patch literal 323636 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

    S};Va~Sht66P^I~Y;&6QLZ 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 literal 0 HcmV?d00001 diff --git a/typed/clj.runtime/deps-clr.edn b/typed/clj.runtime/deps-clr.edn new file mode 100644 index 000000000..a71131576 --- /dev/null +++ b/typed/clj.runtime/deps-clr.edn @@ -0,0 +1 @@ +{:paths ["src" "resources"] } \ No newline at end of file diff --git a/typed/clj.runtime/src/clj - Shortcut.lnk b/typed/clj.runtime/src/clj - Shortcut.lnk new file mode 100644 index 0000000000000000000000000000000000000000..85ac0dcdc68c7ee3da71528c9af560283f3b8ed3 GIT binary patch literal 1606 zcmcgsUr3Wt6hAHt&9Iqk&OhlWLSt-h52DSC)uzt5+-Pg8_(*Y^wYj;mxy%y7O32a| zGcrhv&`DtrJ%mtdK2}glMC8IUBM3u=Z_z_^?%g-{r$Ie+;oLvxJNI{f=iGBXEdZqO zI5-2$(HUy4K^kyz&mS()yd4atd}y34J8>tNQv57@4x8b<$c9~CaClIpU)C)MSLJr@ zz4vJ#l1fK%p;Ren5=_al0c2F$W14!vg$}p36+jN@kP4yM731~6fVm@Gf)>RgLS_rK zjZPDSO6UMLcmb~g4@@lDkoj`~7c5SlOYYCNv5Rw=uYwuZ$e-U8-Jl;>d1X1r69fcs>|2<^}b9z?YM;XwfU zI1lZe9-9>oY@n|odM`zvKg37m?Fs0=M$2Q+NgkS5yntDp$pxiW(=C%6J=Or~I81RS z$?Ppr4$g#i?9kl$MtM3wf_d;m8+x#Vi)KWCk%wPx$V@Wg^ID)H4*4o&JDn7H^@{?0 zh-pE0JN_Z^FxJPUSWnv&36aM$vp5||nSDx%wm7X|V3sQe*Yk|tJYnO(j8N9J;d1`Twbvtm`<{!$r!*GT5Le^Eg1VH5^7>mGHglhBkt+Af-@m0UEezu zs?Fn$uXCFEN54!h%*PSJ5gw7DR2W_cKX*Nc*KZWZ^N|)yTFNEAcPkD zOE@uJ8`g68b|x`Ypv3+o@8g;92skVyRX5&bJ$?ssx<$dl0O|`-C~_69|06xgQb{> (Class/forName (namespace mname)) + (core/let [ms (->> (#?(:cljr clojure.lang.RT/classForNameE :default Class/forName) (namespace mname)) reflect/type-reflect :members (core/filter #(and (instance? clojure.reflect.Method %) @@ -344,9 +344,9 @@ for checking namespaces, cf for checking individual forms."} (binding [vs/*current-env* {:ns {:name (ns-name *ns*)} :file *file* :line (or (-> form# meta :line) - @Compiler/LINE) + #?(:cljr @clojure.lang.Compiler/LineVar :default @Compiler/LINE)) :column (or (-> form# meta :column) - @Compiler/COLUMN)}] + #?(:cljr @clojure.lang.Compiler/ColumnVar :default @Compiler/COLUMN))}] (do ~@body)))) (defmacro ^:private delay-rt-parse @@ -444,7 +444,7 @@ for checking namespaces, cf for checking individual forms."} (defalias* '~qsym '~t '~&form))))) (defmacro ^:private defspecial [& body] - (when (= "true" (System/getProperty "clojure.core.typed.special-vars")) + (when (= "true" (#?(:cljr Environment/GetEnvironmentVariable :default System/getProperty) "clojure.core.typed.special-vars")) `(def ~@body))) (defspecial @@ -1681,10 +1681,10 @@ for checking namespaces, cf for checking individual forms."} ~*file*) :line (or (:line opt#) ~(or (-> &form meta :line) - @Compiler/LINE)) + #?(:cljr @clojure.lang.Compiler/LineVar :default @Compiler/LINE))) :column (or (:column opt#) ~(or (-> &form meta :column) - @Compiler/COLUMN)))))) + #?(:cljr @clojure.lang.Compiler/ColumnVar :default @Compiler/COLUMN))))))) ~x)))) (core/defn infer-unannotated-vars @@ -1721,7 +1721,7 @@ for checking namespaces, cf for checking individual forms."} ; thus dynaload as lazily as possible. ;============================================================ -(when (= "true" (System/getProperty "clojure.core.typed.deprecated-wrapper-macros")) +(when (= "true" (#?(:cljr Environment/GetEnvironmentVariable :default System/getProperty) "clojure.core.typed.deprecated-wrapper-macros")) (load "typed/deprecated_wrapper_macros")) ;;TODO make typing rule diff --git a/typed/clj.runtime/src/clojure/core/typed/ast_utils.clj b/typed/clj.runtime/src/clojure/core/typed/ast_utils.clj index dd6ed5701..17dec5a1c 100644 --- a/typed/clj.runtime/src/clojure/core/typed/ast_utils.clj +++ b/typed/clj.runtime/src/clojure/core/typed/ast_utils.clj @@ -19,7 +19,8 @@ (defn emit-form-fn [expr] (impl/impl-case :clojure ((requiring-resolve 'typed.clj.analyzer.passes.emit-form/emit-form) expr) - :cljs ((requiring-resolve 'typed.cljs.checker.util/emit-form) expr))) + :cljs ((requiring-resolve 'typed.cljs.checker.util/emit-form) expr) + :cljr ((requiring-resolve 'typed.clj.analyzer.passes.emit-form/emit-form) expr))) (defn constant-expr [expr] {:pre [(#{:quote} (:op expr)) @@ -40,7 +41,17 @@ (:vals expr)) _ (assert (contains? m key)) vexpr (get m key)] - (:form vexpr)))) + (:form vexpr)) + + :cljr (case (:op expr) + :map (let [const ((requiring-resolve 'typed.cljc.analyzer.passes.constant-lifter/constant-lift) expr)] + (assert (#{:const} (:op const))) + (map-expr-at const key)) + :const (let [v (:val expr)] + (assert (contains? v key) key) + (get v key))) + + )) (defn constant-exprs [exprs] (map constant-expr exprs)) @@ -151,7 +162,17 @@ :cljs (assoc method :params (vec (concat required-params (when rest-param - [rest-param])))))) + [rest-param])))) + :cljr (case (:op method) + :fn-method (assoc method + :params (vec (concat required-params + (when rest-param + [rest-param])))) + :method (do (assert (nil? rest-param)) + (assert (seq required-params)) + (assoc method + :this (first required-params) + :params (vec (rest required-params))))))) (defn let-body-kw [] :body) @@ -160,7 +181,9 @@ {:post [(symbol? %)]} (impl/impl-case :clojure ((requiring-resolve 'clojure.core.typed.coerce-utils/var->symbol) (:var expr)) - :cljs (:name expr))) + :cljs (:name expr) + :cljr ((requiring-resolve 'clojure.core.typed.coerce-utils/var->symbol) (:var expr)) + )) (defn new-op-class [expr] {:pre [(#{:new} (:op expr)) @@ -179,7 +202,9 @@ :clojure ((every-pred map? (comp #{:method} :op)) m) ; FIXME should be nyi-error but c.c.t.errors depends on this namespace - :cljs (assert nil "Method for CLJS")))) + :cljs (assert nil "Method for CLJS") + :cljr ((every-pred map? (comp #{:method} :op)) + m)))) (def fn-method? (fn [m] ((every-pred map? (comp #{:fn-method} :op)) @@ -189,7 +214,8 @@ :clojure ((con/vec-c? fn-method?) ms) :cljs ((every-pred (con/every-c? fn-method?) seq?) - ms)))) + ms) + :clojure ((con/vec-c? fn-method?) ms)))) (defn variadic-method? [m] {:pre [((some-fn fn-method? deftype-method?) m)] diff --git a/typed/clj.runtime/src/clojure/core/typed/contract.cljc b/typed/clj.runtime/src/clojure/core/typed/contract.cljc index 3392a7b57..937e8ca58 100644 --- a/typed/clj.runtime/src/clojure/core/typed/contract.cljc +++ b/typed/clj.runtime/src/clojure/core/typed/contract.cljc @@ -128,7 +128,7 @@ [& {:as bls}] (map->Blame bls)) -#?(:clj +#?(:cljs :ignore :default (defmacro contract "Check a contract against a value, with an optional Blame object. @@ -142,9 +142,9 @@ :negative ~(str "Not " (ns-name *ns*)) :file ~*file* :line ~(or (-> &form meta :line) - @Compiler/LINE) + #?(:cljr @clojure.lang.Compiler/LineVar :default @Compiler/LINE)) :column ~(or (-> &form meta :column) - @Compiler/COLUMN)))) + #?(:cljr @clojure.lang.Compiler/ColumnVar :default @Compiler/COLUMN))))) ~x)))) #_(ann swap-blame [Blame :-> Blame]) @@ -165,7 +165,7 @@ (make-flat-contract :name 'int-c :first-order integer?)) ;; macro to allow instance? specialisation -#?(:clj +#?(:cljs :ignore :default (defmacro instance-c "Flat contracts for instance? checks on Class's." [c] @@ -294,8 +294,12 @@ (next [this] (when-let [n (next s)] (->CheckedISeq n c b))) - (cons [this x] + #?(:cljr + (^clojure.lang.ISeq cons [this ^Object x] ;; Sigh -- overloaded in cljr (->CheckedISeq (conj s x) c b)) + :default + (cons [this x] + (->CheckedISeq (conj s x) c b))) (empty [this] (empty s)) (seq [this] @@ -303,7 +307,7 @@ this)) (equiv [this o] (if (or (not (instance? clojure.lang.Sequential o)) - (not (instance? java.util.List o))) + (not (instance? #?(:cljr System.Collections.IEnumerable :default java.util.List) o))) false (loop [ms this s (seq o)] diff --git a/typed/clj.runtime/src/clojure/core/typed/contract_utils_platform_specific.cljc b/typed/clj.runtime/src/clojure/core/typed/contract_utils_platform_specific.cljc index 045b8a2d8..75d9d9617 100644 --- a/typed/clj.runtime/src/clojure/core/typed/contract_utils_platform_specific.cljc +++ b/typed/clj.runtime/src/clojure/core/typed/contract_utils_platform_specific.cljc @@ -11,13 +11,19 @@ ;; reader conditions in .clj files, and where PersistentArrayMap doesn't ;; exist. (ns ^:no-doc clojure.core.typed.contract-utils-platform-specific - #?(:clj (:require [clojure.core.typed.contract-utils :as con])) - #?(:clj (:import (clojure.lang PersistentArrayMap)))) + #?(:clj (:require [clojure.core.typed.contract-utils :as con]) + :cljr (:require [clojure.core.typed.contract-utils :as con])) + #?(:clj (:import (clojure.lang PersistentArrayMap)) + :cljr (:import (clojure.lang PersistentArrayMap)))) #?(:bb nil - :clj (def namespace? #(instance? clojure.lang.Namespace %))) + :clj (def namespace? #(instance? clojure.lang.Namespace %)) + :cljr (def namespace? #(instance? clojure.lang.Namespace %))) #?(:clj (defn array-map-c? [ks-c? vs-c?] + (every-pred #(instance? PersistentArrayMap %) + (con/every-c? (con/hvector-c? ks-c? vs-c?)))) + :cljr (defn array-map-c? [ks-c? vs-c?] (every-pred #(instance? PersistentArrayMap %) (con/every-c? (con/hvector-c? ks-c? vs-c?))))) diff --git a/typed/clj.runtime/src/clojure/core/typed/current_impl.cljc b/typed/clj.runtime/src/clojure/core/typed/current_impl.cljc index cf6731fec..f7cbe2cb5 100644 --- a/typed/clj.runtime/src/clojure/core/typed/current_impl.cljc +++ b/typed/clj.runtime/src/clojure/core/typed/current_impl.cljc @@ -21,6 +21,9 @@ ;; copied to typed.cljs.runtime.env (def clojurescript ::clojurescript) +;; We don't have a typed.cljr.runtime.env to copy to -- is this a problem? +(def cljr ::cljr) + (def unknown ::unknown) (derive clojure unknown) @@ -28,18 +31,23 @@ ;; :clojure = ::clojure ;; :cljs = ::clojurescript +;; :cljr = ::cljr ;; :unknown = ::unknown -#?(:clj -(defmacro impl-case [& {clj-case :clojure cljs-case :cljs unknown :unknown :as opts}] - (let [bad (set/difference (set (keys opts)) #{:clojure :cljs :unknown})] +#?(:cljs :ignore +:default +(defmacro impl-case [& {clj-case :clojure cljs-case :cljs cljr-case :cljr unknown :unknown :as opts}] + (let [bad (set/difference (set (keys opts)) #{:clojure :cljs :cljr :unknown})] (assert (empty? bad) (str "Incorrect cases to impl-case: " (pr-str bad)))) `(case (current-impl) ~clojure ~clj-case ~clojurescript ~cljs-case + ~cljr ~cljr-case ~(if (contains? opts :unknown) unknown - `(assert nil (str "No case matched for impl-case " (current-impl))))))) + `(assert nil (str "No case matched for impl-case " (current-impl)))))) +) + ;; copied to typed.clj{s}.runtime.env (def current-impl-kw ::current-impl) @@ -217,14 +225,16 @@ (env/swap-checker! assoc-in [ns-opts-kw nsym :warn-on-unannotated-vars] true) nil) -#?(:clj +#?(:cljs :ignore +:default (def ^:private force-type #((requiring-resolve 'typed.cljc.runtime.env-utils/force-type) %))) -#?(:clj +#?(:cljs :ignore :default (defmacro ^:private delay-type [& body] `((requiring-resolve 'typed.cljc.runtime.env-utils/delay-type*) (fn [] (do ~@body))))) -#?(:clj +#?(:cljs :ignore +:default (defmacro create-env "For name n, creates defs for {n}, {n}-kw, add-{n}, and reset-{n}!" @@ -248,20 +258,20 @@ nil)))) ;; runtime environments -#?(:clj +#?(:cljs :ignore :default (create-env var-env)) -#?(:clj +#?(:cljs :ignore :default (create-env alias-env)) -#?(:clj +#?(:cljs :ignore :default (create-env protocol-env)) -#?(:clj +#?(:cljs :ignore :default (create-env rclass-env)) -#?(:clj +#?(:cljs :ignore :default (create-env datatype-env)) -#?(:clj +#?(:cljs :ignore :default (create-env jsnominal-env)) -#?(:clj +#?(:cljs :ignore :default (defn v [vsym] {:pre [(qualified-symbol? vsym)]} (let [ns (find-ns (symbol (namespace vsym))) @@ -270,7 +280,7 @@ (assert (var? var) (str "Cannot find var: " vsym)) @var))) -#?(:clj +#?(:cljs :ignore :default (defn the-var [vsym] {:pre [(qualified-symbol? vsym)] :post [(var? %)]} @@ -283,7 +293,7 @@ (declare bindings-for-impl) -#?(:clj +#?(:cljs :ignore :default (defmacro with-impl [impl & body] `(with-bindings (let [impl# ~impl] (or (get (bindings-for-impl) impl#) @@ -298,7 +308,7 @@ (defn clj-bindings [] {#'env/*checker* (clj-checker)}) -#?(:clj +#?(:cljs :ignore :default (defmacro with-clojure-impl [& body] `(with-impl clojure ~@body))) @@ -317,7 +327,7 @@ (defn cljs-bindings [] {#'env/*checker* (cljs-checker)}) -#?(:clj +#?(:cljs :ignore :default (defmacro with-cljs-impl [& body] `(with-impl clojurescript ~@body))) @@ -328,7 +338,7 @@ clojure (clj-bindings) clojurescript (cljs-bindings)}) -#?(:clj +#?(:cljs :ignore :default (defmacro with-full-impl [impl & body] `(with-impl ~impl ~@body))) @@ -364,18 +374,18 @@ (str ": " msg#))))))) -#?(:clj +#?(:cljs :ignore :default (defn var->symbol [^clojure.lang.Var var] {:pre [(var? var)] :post [(qualified-symbol? %)]} (symbol (str (ns-name (.ns var))) (str (.sym var))))) -#?(:clj -(defn Class->symbol [^Class cls] +#?(:cljs :ignore :default +(defn Class->symbol [^#?(:cljr Type :clj Class) cls] {:pre [(class? cls)] :post [(simple-symbol? %)]} - (symbol (.getName cls)))) + (symbol (#?(:cljr .FullName :clj .getName) cls)))) ; for type-contract (defn hmap-c? [& {:keys [mandatory optional absent-keys complete?]}] @@ -404,58 +414,58 @@ (vc (get % k)))) optional))) -#?(:clj +#?(:cljs :ignore :default (def ^:private int-error #(apply (requiring-resolve 'clojure.core.typed.errors/int-error) %&))) -#?(:clj +#?(:cljs :ignore :default (def ^:private parse-free-binder-with-variance #((requiring-resolve 'typed.clj.checker.parse-unparse/parse-free-binder-with-variance) %))) -#?(:clj +#?(:cljs :ignore :default (def ^:private with-parse-ns* #((requiring-resolve 'typed.clj.checker.parse-unparse/with-parse-ns*) %1 %2))) -#?(:clj +#?(:cljs :ignore :default (def ^:private with-bounded-frees* #((requiring-resolve 'typed.cljc.checker.free-ops/with-bounded-frees*) %1 %2))) -#?(:clj +#?(:cljs :ignore :default (def ^:private unparse-type #((requiring-resolve 'typed.clj.checker.parse-unparse/unparse-type) %))) -#?(:clj +#?(:cljs :ignore :default (def ^:private parse-type #((requiring-resolve 'typed.clj.checker.parse-unparse/parse-type) %))) -#?(:clj +#?(:cljs :ignore :default (def ^:private fully-resolve-type #((requiring-resolve 'typed.cljc.checker.type-ctors/fully-resolve-type) %))) -#?(:clj +#?(:cljs :ignore :default (def ^:private Poly? #((requiring-resolve 'typed.cljc.checker.type-rep/Poly?) %))) -#?(:clj +#?(:cljs :ignore :default (def ^:private Poly-fresh-symbols* #((requiring-resolve 'typed.cljc.checker.type-ctors/Poly-fresh-symbols*) %))) -#?(:clj +#?(:cljs :ignore :default (def ^:private Poly-body* #(apply (requiring-resolve 'typed.cljc.checker.type-ctors/Poly-body*) %&))) -#?(:clj +#?(:cljs :ignore :default (def ^:private PolyDots? #((requiring-resolve 'typed.cljc.checker.type-rep/PolyDots?) %))) -#?(:clj +#?(:cljs :ignore :default (def ^:private PolyDots-fresh-symbols* #((requiring-resolve 'typed.cljc.checker.type-ctors/PolyDots-fresh-symbols*) %))) -#?(:clj +#?(:cljs :ignore :default (def ^:private PolyDots-body* #((requiring-resolve 'typed.cljc.checker.type-ctors/PolyDots-body*) %1 %2))) -#?(:clj +#?(:cljs :ignore :default (def ^:private FnIntersection? #((requiring-resolve 'typed.cljc.checker.type-rep/FnIntersection?) %))) -#?(:clj +#?(:cljs :ignore :default (def ^:private Protocol* #(apply (requiring-resolve 'typed.cljc.checker.type-ctors/Protocol*) %&))) -#?(:clj +#?(:cljs :ignore :default (def ^:private Protocol-var->on-class #((requiring-resolve 'typed.cljc.checker.type-ctors/Protocol-var->on-class) %))) -#?(:clj +#?(:cljs :ignore :default (def ^:private -any #(deref (requiring-resolve 'typed.cljc.checker.type-rep/-any)))) -#?(:clj +#?(:cljs :ignore :default (def ^:private protocol-method-var-ann #(apply (requiring-resolve 'typed.cljc.checker.collect-utils/protocol-method-var-ann) %&))) -#?(:clj +#?(:cljs :ignore :default (def ^:private make-F #((requiring-resolve 'typed.cljc.checker.type-rep/make-F) %))) -#?(:clj +#?(:cljs :ignore :default (def ^:private DataType* #(apply (requiring-resolve 'typed.cljc.checker.type-ctors/DataType*) %&))) -#?(:clj +#?(:cljs :ignore :default (def ^:private Poly* #(apply (requiring-resolve 'typed.cljc.checker.type-ctors/Poly*) %&))) -#?(:clj +#?(:cljs :ignore :default (def ^:private make-FnIntersection #((requiring-resolve 'typed.cljc.checker.type-rep/make-FnIntersection) %))) -#?(:clj +#?(:cljs :ignore :default (def ^:private make-Function #(apply (requiring-resolve 'typed.cljc.checker.type-rep/make-Function) %&))) -#?(:clj +#?(:cljs :ignore :default (def ^:private DataType-of #(apply (requiring-resolve 'typed.cljc.checker.type-ctors/DataType-of) %&))) -#?(:clj +#?(:cljs :ignore :default (def ^:private subtype? #((requiring-resolve 'typed.clj.checker.subtype/subtype?) %1 %2))) -#?(:clj +#?(:cljs :ignore :default (defn gen-protocol* [current-env current-ns vsym binder mths] {:pre [(symbol? current-ns) ((some-fn nil? map?) mths)]} @@ -553,24 +563,24 @@ (env/swap-checker! update-in [current-dt-ancestors-kw sym] merge tmap) nil) -#?(:clj +#?(:cljs :ignore :default (def ^:private demunge #((requiring-resolve 'clojure.repl/demunge) %))) -#?(:clj +#?(:cljs :ignore :default (def ^:private abstract-many #((requiring-resolve 'typed.cljc.checker.type-ctors/abstract-many) %1 %2))) -#?(:clj +#?(:cljs :ignore :default (def ^:private with-frees* #((requiring-resolve 'typed.cljc.checker.free-ops/with-frees*) %1 %2))) -#?(:clj +#?(:cljs :ignore :default (def ^:private -val #((requiring-resolve 'typed.cljc.checker.type-rep/-val) %1))) -#?(:clj +#?(:cljs :ignore :default (def ^:private -nil #(deref (requiring-resolve 'typed.cljc.checker.type-rep/-nil)))) -#?(:clj +#?(:cljs :ignore :default (def ^:private fv #((requiring-resolve 'typed.cljc.checker.frees/fv) %))) -#?(:clj +#?(:cljs :ignore :default (def ^:private fi #((requiring-resolve 'typed.cljc.checker.frees/fi) %))) -#?(:clj +#?(:cljs :ignore :default (def ^:private make-HMap #(apply (requiring-resolve 'typed.cljc.checker.type-ctors/make-HMap) %&))) -#?(:clj +#?(:cljs :ignore :default (defn gen-datatype* [current-env current-ns provided-name fields vbnd opt record?] {:pre [(symbol? current-ns) (impl-case diff --git a/typed/clj.runtime/src/clojure/core/typed/errors.cljc b/typed/clj.runtime/src/clojure/core/typed/errors.cljc index 1f92a05a2..0865969b1 100644 --- a/typed/clj.runtime/src/clojure/core/typed/errors.cljc +++ b/typed/clj.runtime/src/clojure/core/typed/errors.cljc @@ -215,7 +215,7 @@ {:type-error nyi-error-kw :env (env-for-error env)})))) -#?(:clj +#?(:cljs :ignore :default (defmacro with-ex-info-handlers "Handle an ExceptionInfo e thrown in body. The first handler whose left hand side returns true, then the right hand side is called passing (ex-info e) and e." @@ -280,7 +280,7 @@ (str ":" column)))) ") ")) (println) - (print (.getMessage e)) + (print (#?(:cljr .Message :default .getMessage) e)) (println) (flush) (let [[_ form :as has-form?] (find data :form)] diff --git a/typed/clj.runtime/src/clojure/core/typed/load_if_needed.clj b/typed/clj.runtime/src/clojure/core/typed/load_if_needed.cljc similarity index 94% rename from typed/clj.runtime/src/clojure/core/typed/load_if_needed.clj rename to typed/clj.runtime/src/clojure/core/typed/load_if_needed.cljc index 9c1ca14f3..cf49c6d48 100644 --- a/typed/clj.runtime/src/clojure/core/typed/load_if_needed.clj +++ b/typed/clj.runtime/src/clojure/core/typed/load_if_needed.cljc @@ -8,7 +8,7 @@ (ns ^:no-doc clojure.core.typed.load-if-needed (:require [clojure.core.typed.errors :as err] - [clojure.java.io :as io] + #?(:clj [clojure.java.io :as io]) [clojure.core.typed.util-vars :as vs])) (defn load-if-needed diff --git a/typed/clj.runtime/src/clojure/core/typed/macros.clj b/typed/clj.runtime/src/clojure/core/typed/macros.clj index ca84765c0..9cd5c8c1a 100644 --- a/typed/clj.runtime/src/clojure/core/typed/macros.clj +++ b/typed/clj.runtime/src/clojure/core/typed/macros.clj @@ -23,7 +23,8 @@ (symbol (platform-case :clj "clojure.core.typed" - :cljs "cljs.core.typed") + :cljs "cljs.core.typed" + :cljr "clojure.core.typed") (name sym))) (core/defn core-kw [kw] diff --git a/typed/clj.runtime/src/clojure/core/typed/type_contract.clj b/typed/clj.runtime/src/clojure/core/typed/type_contract.clj index cbffd3f6d..6d0bda9e7 100644 --- a/typed/clj.runtime/src/clojure/core/typed/type_contract.clj +++ b/typed/clj.runtime/src/clojure/core/typed/type_contract.clj @@ -67,7 +67,8 @@ (:Name) (impl/impl-case :clojure (gen-inner (ops/resolve-Name t) arg) - :cljs (err/int-error (str "TODO CLJS Name"))) + :cljs (err/int-error (str "TODO CLJS Name")) + :cljr (gen-inner (ops/resolve-Name t) arg)) ; (cond ; (empty? (:poly? t)) `(instance? ~(:the-class t) ~arg) ; :else (err/int-error (str "Cannot generate predicate for polymorphic Class"))) @@ -201,7 +202,8 @@ (:Name) (impl/impl-case :clojure (gen-inner (ops/resolve-Name t) arg) - :cljs (err/int-error (str "TODO CLJS Name"))) + :cljs (err/int-error (str "TODO CLJS Name")) + :cljr (gen-inner (ops/resolve-Name t) arg)) ; (cond ; (empty? (:poly? t)) `(instance? ~(:the-class t) ~arg) ; :else (err/int-error (str "Cannot generate predicate for polymorphic Class"))) diff --git a/typed/clj.runtime/src/typed/cljc/runtime/env.cljc b/typed/clj.runtime/src/typed/cljc/runtime/env.cljc index 4e1e41a3f..11c5a3fa2 100644 --- a/typed/clj.runtime/src/typed/cljc/runtime/env.cljc +++ b/typed/clj.runtime/src/typed/cljc/runtime/env.cljc @@ -18,7 +18,8 @@ (defn checker [] (let [c *checker*] - (assert (or #?(:clj (instance? clojure.lang.IAtom c) + (assert (or #?(:clj (instance? clojure.lang.IAtom c) + :cljr (instance? clojure.lang.IAtom c) :cljs (instance? Atom c)) (delay? c)) (str "No checker state: " (pr-str c))) diff --git a/typed/clj.runtime/src/typed/clojure.cljc b/typed/clj.runtime/src/typed/clojure.cljc index 8497f9291..acf36cb55 100644 --- a/typed/clj.runtime/src/typed/clojure.cljc +++ b/typed/clj.runtime/src/typed/clojure.cljc @@ -15,6 +15,7 @@ (:require #?(;; not loadable in self hosted CLJS, otherwise always needed for ;; CLJ AOT compilation compatibility :clj clojure.core.typed + :cljr clojure.core.typed ;; for self hosted CLJS normal :require's from .clj/c files. for ;; .clj{s,c} files, loaded via :require-macros in typed/clojure.cljs. :cljs cljs.core.typed) @@ -77,7 +78,15 @@ (defmacro inst-ctor [& args] (platform-case :clj `(clojure.core.typed/inst-ctor ~@args) - :cljs (throw (ex-info "inst-ctor does not applicable in CLJS" {}))))) + :cljs (throw (ex-info "inst-ctor does not applicable in CLJS" {})))) + +:cljr + (defmacro inst-ctor [& args] + (platform-case + :clj `(clojure.core.typed/inst-ctor ~@args) + :cljs (throw (ex-info "inst-ctor does not applicable in CLJS" {})))) + +) (defmacro declare-datatypes [& args] (platform-case @@ -151,7 +160,14 @@ (defmacro ref [& args] (platform-case :clj `(clojure.core.typed/ref ~@args) - :cljs (throw (ex-info "ref does not exist in CLJS" {}))))) + :cljs (throw (ex-info "ref does not exist in CLJS" {})))) + +:cljr + (defmacro ref [& args] + (platform-case + :clj `(clojure.core.typed/ref ~@args) + :cljs (throw (ex-info "ref does not exist in CLJS" {})))) +) ;; checker ops @@ -159,10 +175,12 @@ "In Clojure, checks the current namespace or provided namespaces. Similar for self-hosted ClojureScript, except for macros namespaces." ([] #?(:clj ((requiring-resolve 'typed.clj.checker/check-ns3)) - :cljs (cljs.core.typed/check-ns-macros))) + :cljs (cljs.core.typed/check-ns-macros)) + :cljr ((requiring-resolve 'typed.clj.checker/check-ns3))) ([ns-or-syms & {:as opt}] (#?(:clj (requiring-resolve 'typed.clj.checker/check-ns3) - :cljs cljs.core.typed/check-ns-macros) + :cljs cljs.core.typed/check-ns-macros + :cljr (requiring-resolve 'typed.clj.checker/check-ns3)) ns-or-syms opt))) @@ -193,7 +211,11 @@ ;; idea: ;; - if *ns* ends in $macros, check-ns-clj ;; - otherwise, check-ns-cljs - :cljs `(check-ns-cljs ~@args))) + :cljs `(check-ns-cljs ~@args) + :cljr (platform-case + ;; hmm, should this be evaluated at compile-time too for consistency? + :clj `(check-ns-clj ~@args) + :cljs (apply (requiring-resolve 'cljs.core.typed/check-ns-expansion-side-effects) args)))) (defmacro cf-clj "Check a Clojure form in the current *ns*." @@ -209,7 +231,17 @@ ;; form expected | expected-provided? 2 (concat args [true])))))) ;;TODO check in macros ns? - :cljs `(cljs.core.typed/cf ~@args))) + :cljs `(cljs.core.typed/cf ~@args) + :cljr (platform-case + :clj `(clojure.core.typed/cf ~@args) + :cljs (binding [*ns* (create-ns @(requiring-resolve 'cljs.analyzer/*cljs-ns*))] + (list 'quote + (apply (requiring-resolve 'clojure.core.typed/check-form*) + (case (count args) + ;; form | expected expected-provided? + 1 (concat args [nil nil]) + ;; form expected | expected-provided? + 2 (concat args [true])))))))) (defmacro cf-cljs "Check a ClojureScript form in the same namespace as the current platform." @@ -229,7 +261,22 @@ 1 (concat args [nil nil]) ;; form expected | expected-provided? 2 (concat args [true]))))) - :cljs `(cljs.core.typed/cf ~@args))) + :cljs `(cljs.core.typed/cf ~@args) + :cljr (platform-case + :clj `(with-bindings {(requiring-resolve 'cljs.analyzer/*cljs-ns*) (ns-name *ns*)} + (apply (requiring-resolve 'cljs.core.typed/check-form*) + '~(case (count args) + ;; form | expected expected-provided? + 1 (concat args [nil nil]) + ;; form expected | expected-provided? + 2 (concat args [true])))) + :cljs (list 'quote + (apply (requiring-resolve 'cljs.core.typed/check-form*) + (case (count args) + ;; form | expected expected-provided? + 1 (concat args [nil nil]) + ;; form expected | expected-provided? + 2 (concat args [true]))))))) ;; TODO add check-form-clj{s} defn's for symmetry (defmacro cf @@ -239,7 +286,10 @@ #?(:clj (platform-case :clj `(cf-clj ~@args) :cljs `(cf-cljs ~@args)) - :cljs `(cf-cljs ~@args))) + :cljs `(cf-cljs ~@args) + :cljr (platform-case + :clj `(cf-clj ~@args) + :cljs `(cf-cljs ~@args)))) (defmacro doc-clj "Pass any syntax fragment related to Typed Clojure to print documentation on it. From ef3240ff8a9f531d0346a39a8ea14530c9d11939 Mon Sep 17 00:00:00 2001 From: David Miller Date: Mon, 6 May 2024 17:11:04 -0400 Subject: [PATCH 07/13] (WIP) Add read conditionalization for clj.runtime - more --- typed/clj.runtime/src/clojure/core/typed.cljc | 2 +- .../{coerce_utils.clj => coerce_utils.cljc} | 61 ++++++++++++---- .../src/clojure/core/typed/current_impl.cljc | 3 +- .../src/clojure/core/typed/parse_ast.cljc | 70 +++++++++++++++++-- .../src/typed/cljc/runtime/env.cljc | 1 + .../runtime/{env_utils.clj => env_utils.cljc} | 8 +-- 6 files changed, 119 insertions(+), 26 deletions(-) rename typed/clj.runtime/src/clojure/core/typed/{coerce_utils.clj => coerce_utils.cljc} (63%) rename typed/clj.runtime/src/typed/cljc/runtime/{env_utils.clj => env_utils.cljc} (89%) diff --git a/typed/clj.runtime/src/clojure/core/typed.cljc b/typed/clj.runtime/src/clojure/core/typed.cljc index 2df7f3476..c843d7c09 100644 --- a/typed/clj.runtime/src/clojure/core/typed.cljc +++ b/typed/clj.runtime/src/clojure/core/typed.cljc @@ -438,7 +438,7 @@ for checking namespaces, cf for checking individual forms."} (core/let [qsym (qualify-sym sym)] `(tc-ignore - (when (= "true" (System/getProperty "clojure.core.typed.intern-defaliases")) + (when (= "true" (#?(:cljr Environment/GetEnvironmentVariable :default System/getProperty) "clojure.core.typed.intern-defaliases")) (intern '~qsym '~(with-meta (symbol (name sym)) (meta sym)))) (defalias* '~qsym '~t '~&form))))) diff --git a/typed/clj.runtime/src/clojure/core/typed/coerce_utils.clj b/typed/clj.runtime/src/clojure/core/typed/coerce_utils.cljc similarity index 63% rename from typed/clj.runtime/src/clojure/core/typed/coerce_utils.clj rename to typed/clj.runtime/src/clojure/core/typed/coerce_utils.cljc index f2b3eb966..79adb4776 100644 --- a/typed/clj.runtime/src/clojure/core/typed/coerce_utils.clj +++ b/typed/clj.runtime/src/clojure/core/typed/coerce_utils.cljc @@ -9,11 +9,37 @@ (ns ^:no-doc clojure.core.typed.coerce-utils (:require [typed.clojure :as t] [clojure.string :as str] - [clojure.java.io :as io] + #?(:cljr [clojure.clr.io] :default [clojure.java.io :as io]) [clojure.core.typed.current-impl :as impl]) (:import (clojure.lang RT Var))) (t/ann symbol->Class [t/Sym -> Class]) + +#?(:cljr + +(defn symbol->Class + "Returns the Class represented by the symbol. Works for + primitives (eg. byte, int). Does not further resolve the symbol." + [sym] + {:pre [(symbol? sym)] + :post [(class? %)]} + (case sym + byte Byte + sbyte SByte + short Int16 + ushort UInt16 + int Int32 + uint UInt32 + long Int64 + ulong UInt64 + float Single + double Double + boolean Boolean + char Char + decimal Decimal + (RT/classForName (str sym)))) + +:default (defn symbol->Class "Returns the Class represented by the symbol. Works for primitives (eg. byte, int). Does not further resolve the symbol." @@ -30,12 +56,13 @@ boolean Boolean/TYPE char Character/TYPE (RT/classForName (str sym)))) +) (t/ann Class->symbol [Class -> t/Sym]) -(defn Class->symbol [^Class cls] +(defn Class->symbol [^#?(:cljr Type :default Class) cls] {:pre [(class? cls)] :post [(symbol? %)]} - (symbol (.getName cls))) + (symbol (#?(:cljr .FullName :default .getName) cls))) (t/ann var->symbol [t/AnyVar -> t/Sym]) (defn var->symbol [^Var var] @@ -63,23 +90,29 @@ ex (when suffix? (impl/impl-case :clojure ".clj" - :cljs ".cljs")) + :cljs ".cljs" + :cljr ".cljr")) p (str f ex) - p (if (or (io/resource p) + p (if (or #?(:cljr false :default (io/resource p)) ;; no equivalent of io/resource for CLR (not suffix?)) p (str f ".cljc")) - p (if (.startsWith p "/") (subs p 1) p)] + p (if (#?(:cljr .StartsWith :default .startsWith) p "/") (subs p 1) p)] p))) -(t/ann ns->URL [t/Sym -> (t/Nilable java.net.URL)]) -(defn ns->URL ^java.net.URL [nsym] - {:pre [(symbol? nsym)] - :post [((some-fn #(instance? java.net.URL %) - nil?) - %)]} - (let [p (ns->file nsym)] - (io/resource p))) +#?(:cljr :ignore :default +(do + (t/ann ns->URL [t/Sym -> (t/Nilable java.net.URL)]) + + (defn ns->URL ^java.net.URL [nsym] + {:pre [(symbol? nsym)] + :post [((some-fn #(instance? java.net.URL %) + nil?) + %)]} + (let [p (ns->file nsym)] + (io/resource p))) +)) ;; no equivalent of io/resource for CLR + (t/ann sym->kw [t/Sym -> t/Kw]) (defn sym->kw [sym] diff --git a/typed/clj.runtime/src/clojure/core/typed/current_impl.cljc b/typed/clj.runtime/src/clojure/core/typed/current_impl.cljc index f7cbe2cb5..01726f571 100644 --- a/typed/clj.runtime/src/clojure/core/typed/current_impl.cljc +++ b/typed/clj.runtime/src/clojure/core/typed/current_impl.cljc @@ -21,13 +21,14 @@ ;; copied to typed.cljs.runtime.env (def clojurescript ::clojurescript) -;; We don't have a typed.cljr.runtime.env to copy to -- is this a problem? +;; We don't have a typed.cljr.runtime.env to copy to -- is this a problem? What does this even mean? (def cljr ::cljr) (def unknown ::unknown) (derive clojure unknown) (derive clojurescript unknown) +(derive cljr unknown) ;; :clojure = ::clojure ;; :cljs = ::clojurescript diff --git a/typed/clj.runtime/src/clojure/core/typed/parse_ast.cljc b/typed/clj.runtime/src/clojure/core/typed/parse_ast.cljc index e811f23c5..6c8aab7d5 100644 --- a/typed/clj.runtime/src/clojure/core/typed/parse_ast.cljc +++ b/typed/clj.runtime/src/clojure/core/typed/parse_ast.cljc @@ -27,7 +27,8 @@ (or *parse-type-in-ns* (impl/impl-case :clojure (ns-name *ns*) - :cljs (t/tc-ignore ((requiring-resolve 'typed.cljs.checker.util/cljs-ns)))))) + :cljs (t/tc-ignore ((requiring-resolve 'typed.cljs.checker.util/cljs-ns))) + :cljr (ns-name *ns*)))) (t/ann ^:no-check clojure.core.typed.current-impl/assert-clojure [t/AnySeqable :? :-> nil]) @@ -120,12 +121,12 @@ (t/ann *dotted-scope* (t/Map t/Sym t/Sym)) (def ^:dynamic *dotted-scope* {}) -#?(:clj +#?(:cljs :ignore :default (defmacro with-frees [fs & args] `(binding [*tvar-scope* (merge *tvar-scope* ~fs)] ~@args))) -#?(:clj +#?(:cljs :ignore :default (defmacro with-dfrees [fs & args] `(binding [*dotted-scope* (merge *dotted-scope* ~fs)] ~@args))) @@ -150,6 +151,14 @@ :id NameRef} :optional {:path (t/Vec PathElem)})))) +#?(:cljr + +(do + (def ^:private init-symbol-escape *allow-symbol-escape*) + (.bindRoot #'*allow-symbol-escape* false)) + +) + (t/ann parse-filter [t/Any -> Filter]) (defn parse-filter [syn] (case syn @@ -213,6 +222,12 @@ m (err/int-error (str "Bad filter syntax: " syn)))))) + +#?(:cljr + + (.bindRoot #'*allow-symbol-escape* init-symbol-escape) +) + (t/defalias FilterSet '{:op ':filter-set :then Filter @@ -457,6 +472,22 @@ {'int {:op :cljs-prim :name 'int} 'object {:op :cljs-prim :name 'object}}) +(def cljr-primitives + {'byte {:op :clj-prim :name 'byte} + 'sbyte {:op :clj-pimr :name 'sbyte} + 'short {:op :clj-prim :name 'short} + 'int {:op :clj-prim :name 'int} + 'long {:op :clj-prim :name 'long} + 'ushort {:op :clj-prim :name 'ushort} + 'uint {:op :clj-prim :name 'uint} + 'ulong {:op :clj-prim :name 'ulong} + 'float {:op :clj-prim :name 'float} + 'double {:op :clj-prim :name 'double} + 'boolean {:op :clj-prim :name 'boolean} + 'char {:op :clj-prim :name 'char} + 'decimal {:op :clj-prim :name 'decimal} + 'void {:op :singleton :val nil}}) + (defn parse-free [f gsym] (if (symbol? f) {:op :F @@ -640,7 +671,8 @@ (when (symbol? n) (or (impl/impl-case :clojure (resolve-type-clj->sym n) - :cljs n) + :cljs n + :cljr (resolve-type-clj->sym n)) n)))) (defmethod parse-seq* 'quote [syn] (parse-quote syn)) @@ -1072,7 +1104,8 @@ (or (impl/impl-case :clojure (resolve-type-clj->sym n) ;TODO - :cljs n) + :cljs n + :cljr (resolve-type-clj->sym n)) n))) (defn parse-Any [s] {:op :Any :form s}) @@ -1092,7 +1125,8 @@ [sym] (let [primitives (impl/impl-case :clojure clj-primitives - :cljs cljs-primitives) + :cljs cljs-primitives + :cljr cljr-primitives) free (when (symbol? sym) (*tvar-scope* sym))] (cond @@ -1126,6 +1160,30 @@ (when (contains? (impl/datatype-env) qname) {:op :DataType :name qname :form sym}))))) :cljs (assert nil) + :cljr (let [res (when (symbol? sym) + (resolve-type-clj sym))] + (cond + (class? res) (let [csym (coerce/Class->symbol res) + dt? (contains? (impl/datatype-env) csym)] + {:op (if dt? :DataType :Class) :name csym + :form sym}) + (var? res) (let [vsym (coerce/var->symbol res) + vsym-nsym (-> vsym namespace symbol) + vsym (symbol (name (ns-rewrites-clj vsym-nsym vsym-nsym)) + (name vsym))] + (if (contains? (impl/alias-env) vsym) + {:op :Name :name vsym :form sym} + {:op :Protocol :name vsym :form sym})) + (symbol? sym) + (if-let [qsym (resolve-type-alias-clj sym)] + ; a type alias without an interned var + {:op :Name :name qsym :form sym} + ;an annotated datatype that hasn't been defined yet + ; assume it's in the current namespace + ; do we want to munge the sym also? + (let [qname (symbol (str (namespace-munge (parse-in-ns)) "." sym))] + (when (contains? (impl/datatype-env) qname) + {:op :DataType :name qname :form sym}))))) #_(when-let [res (when (symbol? sym) (resolve-type-cljs sym))] (:name res))) diff --git a/typed/clj.runtime/src/typed/cljc/runtime/env.cljc b/typed/clj.runtime/src/typed/cljc/runtime/env.cljc index 11c5a3fa2..1efaf03de 100644 --- a/typed/clj.runtime/src/typed/cljc/runtime/env.cljc +++ b/typed/clj.runtime/src/typed/cljc/runtime/env.cljc @@ -12,6 +12,7 @@ (defn checker-or-nil [] {:post [(or #?(:clj (instance? clojure.lang.IAtom %) + :cljr (instance? clojure.lang.IAtom %) :cljs (instance? Atom %)) (nil? %))]} *checker*) diff --git a/typed/clj.runtime/src/typed/cljc/runtime/env_utils.clj b/typed/clj.runtime/src/typed/cljc/runtime/env_utils.cljc similarity index 89% rename from typed/clj.runtime/src/typed/cljc/runtime/env_utils.clj rename to typed/clj.runtime/src/typed/cljc/runtime/env_utils.cljc index da38de375..539d3b83a 100644 --- a/typed/clj.runtime/src/typed/cljc/runtime/env_utils.clj +++ b/typed/clj.runtime/src/typed/cljc/runtime/env_utils.cljc @@ -11,7 +11,7 @@ ;; load dependencies when using clojure.core.typed without typed.clojure ;;DON'T require typed.clojure here (:require [typed.clojure :as-alias t]) - (:import [java.lang.ref SoftReference])) + (:import #?(:clj [java.lang.ref SoftReference]))) (defonce ^{:doc "Internal use only"} ^:no-doc parsed-types-invalidation-id (atom (str (random-uuid)))) @@ -23,7 +23,7 @@ (defn delay-type* [f] (let [f (bound-fn* f) this-invalidation-id (volatile! @parsed-types-invalidation-id) - def-ns-vol (volatile! (SoftReference. *ns*)) + def-ns-vol (volatile! (#?(:cljr WeakReference. :default SoftReference.) *ns*)) ->f-delay (fn [] (delay ;; locals clearing issue? ;; reproduce via (refresh) then (clojure.core.typed/envs) @@ -31,8 +31,8 @@ (when f (f))))) d (atom (->f-delay))] (fn [] - (when-some [^SoftReference sr @def-ns-vol] - (when-some [def-ns (.get sr)] + (when-some [^#?(:cljr WeakReference :default SoftReference) sr @def-ns-vol] + (when-some [def-ns (#?(:cljr .Target :default .get) sr)] (assert (instance? clojure.lang.Namespace def-ns)) (if (identical? def-ns (find-ns (ns-name def-ns))) (let [_ (when (not= @this-invalidation-id @parsed-types-invalidation-id) From e21a1c917f5380595bfbec0317fabbe74832b4da Mon Sep 17 00:00:00 2001 From: David Miller Date: Mon, 6 May 2024 22:28:05 -0400 Subject: [PATCH 08/13] (WIP) Add read conditionalization for clj.runtime - more, more --- typed/clj.runtime/deps-clr.edn | 4 +++- .../src/clojure/core/typed/{expand.clj => expand.cljc} | 4 ++-- .../{env_utils_annotations.clj => env_utils_annotations.cljc} | 2 +- typed/clj.runtime/src/typed/clojure/{jvm.clj => jvm.cljc} | 4 ++-- 4 files changed, 8 insertions(+), 6 deletions(-) rename typed/clj.runtime/src/clojure/core/typed/{expand.clj => expand.cljc} (99%) rename typed/clj.runtime/src/typed/cljc/runtime/{env_utils_annotations.clj => env_utils_annotations.cljc} (96%) rename typed/clj.runtime/src/typed/clojure/{jvm.clj => jvm.cljc} (94%) diff --git a/typed/clj.runtime/deps-clr.edn b/typed/clj.runtime/deps-clr.edn index a71131576..2108abfa9 100644 --- a/typed/clj.runtime/deps-clr.edn +++ b/typed/clj.runtime/deps-clr.edn @@ -1 +1,3 @@ -{:paths ["src" "resources"] } \ No newline at end of file +{:paths ["src" "resources"] + :deps {local/typed.cljc.analyzer {:local/root "../cljc.analyzer"}} +} \ No newline at end of file diff --git a/typed/clj.runtime/src/clojure/core/typed/expand.clj b/typed/clj.runtime/src/clojure/core/typed/expand.cljc similarity index 99% rename from typed/clj.runtime/src/clojure/core/typed/expand.clj rename to typed/clj.runtime/src/clojure/core/typed/expand.cljc index 4c8f2dcea..0fc29bc1c 100644 --- a/typed/clj.runtime/src/clojure/core/typed/expand.clj +++ b/typed/clj.runtime/src/clojure/core/typed/expand.cljc @@ -259,7 +259,7 @@ ~(expand-with-open (subvec bindings 2) body) (finally (. ~(bindings 0) close)))) - :else (throw (IllegalArgumentException. "with-open only allows Symbols in bindings"))))] + :else (throw (#?(:cljr ArgumentException. :default IllegalArgumentException.) "with-open only allows Symbols in bindings"))))] (expand-with-open bindings body))) (defmethod -expand-macro 'clojure.core/assert @@ -286,7 +286,7 @@ (if (seq? (first sigs)) sigs ;; Assume single arity syntax - (throw (IllegalArgumentException. + (throw (#?(:cljr ArgumentException. :default IllegalArgumentException.) (if (seq sigs) (str "Parameter declaration " (first sigs) diff --git a/typed/clj.runtime/src/typed/cljc/runtime/env_utils_annotations.clj b/typed/clj.runtime/src/typed/cljc/runtime/env_utils_annotations.cljc similarity index 96% rename from typed/clj.runtime/src/typed/cljc/runtime/env_utils_annotations.clj rename to typed/clj.runtime/src/typed/cljc/runtime/env_utils_annotations.cljc index 57c961689..5d50b0140 100644 --- a/typed/clj.runtime/src/typed/cljc/runtime/env_utils_annotations.clj +++ b/typed/clj.runtime/src/typed/cljc/runtime/env_utils_annotations.cljc @@ -9,7 +9,7 @@ (ns ^:no-doc typed.cljc.runtime.env-utils-annotations (:require [typed.clojure :as t] [typed.cljc.runtime.env-utils :as env-utils]) - (:import [java.lang.ref SoftReference])) + (:import #?(:clojure [java.lang.ref SoftReference]))) (t/defalias env-utils/InvalidationId t/Str) (t/defalias env-utils/ForcedType diff --git a/typed/clj.runtime/src/typed/clojure/jvm.clj b/typed/clj.runtime/src/typed/clojure/jvm.cljc similarity index 94% rename from typed/clj.runtime/src/typed/clojure/jvm.clj rename to typed/clj.runtime/src/typed/clojure/jvm.cljc index 459815f64..8211a97c2 100644 --- a/typed/clj.runtime/src/typed/clojure/jvm.clj +++ b/typed/clj.runtime/src/typed/clojure/jvm.cljc @@ -41,9 +41,9 @@ (apply hash-map args)) this-ns (ns-name *ns*)] `(clojure.core.typed/tc-ignore - (let [nme# (or (when-some [^Class c# (ns-resolve '~this-ns '~nme)] + (let [nme# (or (when-some [^#?(:cljr Type :default Class) c# (ns-resolve '~this-ns '~nme)] (when (class? c#) - (-> c# .getName symbol))) + (-> c# #?(:cljr .FullName :default .getName) symbol))) (throw (ex-info (str "Could not resolve class: " '~nme) {:class-name '~nme})))] ;; TODO runtime env #_ From 2a07824105fba4b196b7bbc2cfc235872883ebe8 Mon Sep 17 00:00:00 2001 From: David Miller Date: Thu, 23 May 2024 12:11:05 -0400 Subject: [PATCH 09/13] (WIP) Add read conditionalization for clj.runtime - more x 3 --- .../src/clojure/core/typed/ast_utils.clj | 38 ++---------- .../src/clojure/core/typed/coerce_utils.cljc | 42 +++++++------ .../src/clojure/core/typed/current_impl.cljc | 3 +- .../src/clojure/core/typed/macros.clj | 3 +- .../src/clojure/core/typed/parse_ast.cljc | 60 ++++++------------- .../src/clojure/core/typed/type_contract.clj | 6 +- .../src/typed/cljc/runtime/env_utils.cljc | 6 +- .../cljc/runtime/env_utils_annotations.cljc | 3 +- typed/clj.runtime/src/typed/clojure.cljc | 51 ++++------------ .../core/typed/{test_rt.clj => test_rt.cljc} | 28 ++++----- 10 files changed, 79 insertions(+), 161 deletions(-) rename typed/clj.runtime/test/clojure/core/typed/{test_rt.clj => test_rt.cljc} (58%) diff --git a/typed/clj.runtime/src/clojure/core/typed/ast_utils.clj b/typed/clj.runtime/src/clojure/core/typed/ast_utils.clj index 17dec5a1c..dd6ed5701 100644 --- a/typed/clj.runtime/src/clojure/core/typed/ast_utils.clj +++ b/typed/clj.runtime/src/clojure/core/typed/ast_utils.clj @@ -19,8 +19,7 @@ (defn emit-form-fn [expr] (impl/impl-case :clojure ((requiring-resolve 'typed.clj.analyzer.passes.emit-form/emit-form) expr) - :cljs ((requiring-resolve 'typed.cljs.checker.util/emit-form) expr) - :cljr ((requiring-resolve 'typed.clj.analyzer.passes.emit-form/emit-form) expr))) + :cljs ((requiring-resolve 'typed.cljs.checker.util/emit-form) expr))) (defn constant-expr [expr] {:pre [(#{:quote} (:op expr)) @@ -41,17 +40,7 @@ (:vals expr)) _ (assert (contains? m key)) vexpr (get m key)] - (:form vexpr)) - - :cljr (case (:op expr) - :map (let [const ((requiring-resolve 'typed.cljc.analyzer.passes.constant-lifter/constant-lift) expr)] - (assert (#{:const} (:op const))) - (map-expr-at const key)) - :const (let [v (:val expr)] - (assert (contains? v key) key) - (get v key))) - - )) + (:form vexpr)))) (defn constant-exprs [exprs] (map constant-expr exprs)) @@ -162,17 +151,7 @@ :cljs (assoc method :params (vec (concat required-params (when rest-param - [rest-param])))) - :cljr (case (:op method) - :fn-method (assoc method - :params (vec (concat required-params - (when rest-param - [rest-param])))) - :method (do (assert (nil? rest-param)) - (assert (seq required-params)) - (assoc method - :this (first required-params) - :params (vec (rest required-params))))))) + [rest-param])))))) (defn let-body-kw [] :body) @@ -181,9 +160,7 @@ {:post [(symbol? %)]} (impl/impl-case :clojure ((requiring-resolve 'clojure.core.typed.coerce-utils/var->symbol) (:var expr)) - :cljs (:name expr) - :cljr ((requiring-resolve 'clojure.core.typed.coerce-utils/var->symbol) (:var expr)) - )) + :cljs (:name expr))) (defn new-op-class [expr] {:pre [(#{:new} (:op expr)) @@ -202,9 +179,7 @@ :clojure ((every-pred map? (comp #{:method} :op)) m) ; FIXME should be nyi-error but c.c.t.errors depends on this namespace - :cljs (assert nil "Method for CLJS") - :cljr ((every-pred map? (comp #{:method} :op)) - m)))) + :cljs (assert nil "Method for CLJS")))) (def fn-method? (fn [m] ((every-pred map? (comp #{:fn-method} :op)) @@ -214,8 +189,7 @@ :clojure ((con/vec-c? fn-method?) ms) :cljs ((every-pred (con/every-c? fn-method?) seq?) - ms) - :clojure ((con/vec-c? fn-method?) ms)))) + ms)))) (defn variadic-method? [m] {:pre [((some-fn fn-method? deftype-method?) m)] diff --git a/typed/clj.runtime/src/clojure/core/typed/coerce_utils.cljc b/typed/clj.runtime/src/clojure/core/typed/coerce_utils.cljc index 79adb4776..fc2fa5dbe 100644 --- a/typed/clj.runtime/src/clojure/core/typed/coerce_utils.cljc +++ b/typed/clj.runtime/src/clojure/core/typed/coerce_utils.cljc @@ -77,28 +77,26 @@ :post [(symbol? %)]} (symbol kw)) -(t/ann ns->file (t/IFn [t/Sym -> t/Str] - [t/Sym t/Bool -> t/Str])) -(defn ns->file - ([nsym] (ns->file nsym true)) - ([nsym suffix?] - {:pre [(symbol? nsym)] - :post [(string? %)]} - ;copied basic approach from tools.emitter.jvm - (let [res (munge nsym) - f (str/replace (str res) #"\." "/") - ex (when suffix? - (impl/impl-case - :clojure ".clj" - :cljs ".cljs" - :cljr ".cljr")) - p (str f ex) - p (if (or #?(:cljr false :default (io/resource p)) ;; no equivalent of io/resource for CLR - (not suffix?)) - p - (str f ".cljc")) - p (if (#?(:cljr .StartsWith :default .startsWith) p "/") (subs p 1) p)] - p))) +(t/ann ns->file [t/Sym -> t/Str]) +(defn ns->file [nsym] + {:pre [(symbol? nsym)] + :post [(string? %)]} + ;copied basic approach from tools.emitter.jvm + (let [res (munge nsym) + f (str/replace (str res) #"\." "/") + p (or (some (fn [ex] + (let [p (str f ex)] + ;;FIXME how to check if file exists on "classpath" in CLR? + (when #?(:cljr (throw (ex-info "how to check if file exists on classpath in CLR?" + {})) + :default (io/resource p)) + p))) + (impl/impl-case + :clojure [#?(:cljr ".cljr") ".clj"] + :cljs [".cljs"])) + (str f ".cljc"))] + (cond-> p + (str/starts-with? p "/") (subs 1)))) #?(:cljr :ignore :default (do diff --git a/typed/clj.runtime/src/clojure/core/typed/current_impl.cljc b/typed/clj.runtime/src/clojure/core/typed/current_impl.cljc index 01726f571..20b90ed73 100644 --- a/typed/clj.runtime/src/clojure/core/typed/current_impl.cljc +++ b/typed/clj.runtime/src/clojure/core/typed/current_impl.cljc @@ -36,14 +36,13 @@ ;; :unknown = ::unknown #?(:cljs :ignore :default -(defmacro impl-case [& {clj-case :clojure cljs-case :cljs cljr-case :cljr unknown :unknown :as opts}] +(defmacro impl-case [& {clj-case :clojure cljs-case :cljs unknown :unknown :as opts}] (let [bad (set/difference (set (keys opts)) #{:clojure :cljs :cljr :unknown})] (assert (empty? bad) (str "Incorrect cases to impl-case: " (pr-str bad)))) `(case (current-impl) ~clojure ~clj-case ~clojurescript ~cljs-case - ~cljr ~cljr-case ~(if (contains? opts :unknown) unknown `(assert nil (str "No case matched for impl-case " (current-impl)))))) diff --git a/typed/clj.runtime/src/clojure/core/typed/macros.clj b/typed/clj.runtime/src/clojure/core/typed/macros.clj index 9cd5c8c1a..ca84765c0 100644 --- a/typed/clj.runtime/src/clojure/core/typed/macros.clj +++ b/typed/clj.runtime/src/clojure/core/typed/macros.clj @@ -23,8 +23,7 @@ (symbol (platform-case :clj "clojure.core.typed" - :cljs "cljs.core.typed" - :cljr "clojure.core.typed") + :cljs "cljs.core.typed") (name sym))) (core/defn core-kw [kw] diff --git a/typed/clj.runtime/src/clojure/core/typed/parse_ast.cljc b/typed/clj.runtime/src/clojure/core/typed/parse_ast.cljc index 6c8aab7d5..34c09061b 100644 --- a/typed/clj.runtime/src/clojure/core/typed/parse_ast.cljc +++ b/typed/clj.runtime/src/clojure/core/typed/parse_ast.cljc @@ -27,8 +27,7 @@ (or *parse-type-in-ns* (impl/impl-case :clojure (ns-name *ns*) - :cljs (t/tc-ignore ((requiring-resolve 'typed.cljs.checker.util/cljs-ns))) - :cljr (ns-name *ns*)))) + :cljs (t/tc-ignore ((requiring-resolve 'typed.cljs.checker.util/cljs-ns)))))) (t/ann ^:no-check clojure.core.typed.current-impl/assert-clojure [t/AnySeqable :? :-> nil]) @@ -457,36 +456,40 @@ :upper-bound {:op :Any} :lower-bound {:op :U :types []}}) +#?( +:cljr (def clj-primitives {'byte {:op :clj-prim :name 'byte} + 'sbyte {:op :clj-pimr :name 'sbyte} 'short {:op :clj-prim :name 'short} 'int {:op :clj-prim :name 'int} 'long {:op :clj-prim :name 'long} + 'ushort {:op :clj-prim :name 'ushort} + 'uint {:op :clj-prim :name 'uint} + 'ulong {:op :clj-prim :name 'ulong} 'float {:op :clj-prim :name 'float} 'double {:op :clj-prim :name 'double} 'boolean {:op :clj-prim :name 'boolean} 'char {:op :clj-prim :name 'char} + 'decimal {:op :clj-prim :name 'decimal} 'void {:op :singleton :val nil}}) -(def cljs-primitives - {'int {:op :cljs-prim :name 'int} - 'object {:op :cljs-prim :name 'object}}) - -(def cljr-primitives +:default +(def clj-primitives {'byte {:op :clj-prim :name 'byte} - 'sbyte {:op :clj-pimr :name 'sbyte} 'short {:op :clj-prim :name 'short} 'int {:op :clj-prim :name 'int} 'long {:op :clj-prim :name 'long} - 'ushort {:op :clj-prim :name 'ushort} - 'uint {:op :clj-prim :name 'uint} - 'ulong {:op :clj-prim :name 'ulong} 'float {:op :clj-prim :name 'float} 'double {:op :clj-prim :name 'double} 'boolean {:op :clj-prim :name 'boolean} 'char {:op :clj-prim :name 'char} - 'decimal {:op :clj-prim :name 'decimal} 'void {:op :singleton :val nil}}) + ) + +(def cljs-primitives + {'int {:op :cljs-prim :name 'int} + 'object {:op :cljs-prim :name 'object}}) (defn parse-free [f gsym] (if (symbol? f) @@ -671,8 +674,7 @@ (when (symbol? n) (or (impl/impl-case :clojure (resolve-type-clj->sym n) - :cljs n - :cljr (resolve-type-clj->sym n)) + :cljs n) n)))) (defmethod parse-seq* 'quote [syn] (parse-quote syn)) @@ -1104,8 +1106,7 @@ (or (impl/impl-case :clojure (resolve-type-clj->sym n) ;TODO - :cljs n - :cljr (resolve-type-clj->sym n)) + :cljs n) n))) (defn parse-Any [s] {:op :Any :form s}) @@ -1125,8 +1126,7 @@ [sym] (let [primitives (impl/impl-case :clojure clj-primitives - :cljs cljs-primitives - :cljr cljr-primitives) + :cljs cljs-primitives) free (when (symbol? sym) (*tvar-scope* sym))] (cond @@ -1160,30 +1160,6 @@ (when (contains? (impl/datatype-env) qname) {:op :DataType :name qname :form sym}))))) :cljs (assert nil) - :cljr (let [res (when (symbol? sym) - (resolve-type-clj sym))] - (cond - (class? res) (let [csym (coerce/Class->symbol res) - dt? (contains? (impl/datatype-env) csym)] - {:op (if dt? :DataType :Class) :name csym - :form sym}) - (var? res) (let [vsym (coerce/var->symbol res) - vsym-nsym (-> vsym namespace symbol) - vsym (symbol (name (ns-rewrites-clj vsym-nsym vsym-nsym)) - (name vsym))] - (if (contains? (impl/alias-env) vsym) - {:op :Name :name vsym :form sym} - {:op :Protocol :name vsym :form sym})) - (symbol? sym) - (if-let [qsym (resolve-type-alias-clj sym)] - ; a type alias without an interned var - {:op :Name :name qsym :form sym} - ;an annotated datatype that hasn't been defined yet - ; assume it's in the current namespace - ; do we want to munge the sym also? - (let [qname (symbol (str (namespace-munge (parse-in-ns)) "." sym))] - (when (contains? (impl/datatype-env) qname) - {:op :DataType :name qname :form sym}))))) #_(when-let [res (when (symbol? sym) (resolve-type-cljs sym))] (:name res))) diff --git a/typed/clj.runtime/src/clojure/core/typed/type_contract.clj b/typed/clj.runtime/src/clojure/core/typed/type_contract.clj index 6d0bda9e7..cbffd3f6d 100644 --- a/typed/clj.runtime/src/clojure/core/typed/type_contract.clj +++ b/typed/clj.runtime/src/clojure/core/typed/type_contract.clj @@ -67,8 +67,7 @@ (:Name) (impl/impl-case :clojure (gen-inner (ops/resolve-Name t) arg) - :cljs (err/int-error (str "TODO CLJS Name")) - :cljr (gen-inner (ops/resolve-Name t) arg)) + :cljs (err/int-error (str "TODO CLJS Name"))) ; (cond ; (empty? (:poly? t)) `(instance? ~(:the-class t) ~arg) ; :else (err/int-error (str "Cannot generate predicate for polymorphic Class"))) @@ -202,8 +201,7 @@ (:Name) (impl/impl-case :clojure (gen-inner (ops/resolve-Name t) arg) - :cljs (err/int-error (str "TODO CLJS Name")) - :cljr (gen-inner (ops/resolve-Name t) arg)) + :cljs (err/int-error (str "TODO CLJS Name"))) ; (cond ; (empty? (:poly? t)) `(instance? ~(:the-class t) ~arg) ; :else (err/int-error (str "Cannot generate predicate for polymorphic Class"))) diff --git a/typed/clj.runtime/src/typed/cljc/runtime/env_utils.cljc b/typed/clj.runtime/src/typed/cljc/runtime/env_utils.cljc index 539d3b83a..0c4c914ca 100644 --- a/typed/clj.runtime/src/typed/cljc/runtime/env_utils.cljc +++ b/typed/clj.runtime/src/typed/cljc/runtime/env_utils.cljc @@ -23,7 +23,7 @@ (defn delay-type* [f] (let [f (bound-fn* f) this-invalidation-id (volatile! @parsed-types-invalidation-id) - def-ns-vol (volatile! (#?(:cljr WeakReference. :default SoftReference.) *ns*)) + def-ns-vol (volatile! (#?(:cljr identity :default SoftReference.) *ns*)) ->f-delay (fn [] (delay ;; locals clearing issue? ;; reproduce via (refresh) then (clojure.core.typed/envs) @@ -31,8 +31,8 @@ (when f (f))))) d (atom (->f-delay))] (fn [] - (when-some [^#?(:cljr WeakReference :default SoftReference) sr @def-ns-vol] - (when-some [def-ns (#?(:cljr .Target :default .get) sr)] + (when-some [^#?(:cljr Object :default SoftReference) sr @def-ns-vol] + (when-some [def-ns #?(:cljr sr :default (.get sr))] (assert (instance? clojure.lang.Namespace def-ns)) (if (identical? def-ns (find-ns (ns-name def-ns))) (let [_ (when (not= @this-invalidation-id @parsed-types-invalidation-id) diff --git a/typed/clj.runtime/src/typed/cljc/runtime/env_utils_annotations.cljc b/typed/clj.runtime/src/typed/cljc/runtime/env_utils_annotations.cljc index 5d50b0140..82876bdcb 100644 --- a/typed/clj.runtime/src/typed/cljc/runtime/env_utils_annotations.cljc +++ b/typed/clj.runtime/src/typed/cljc/runtime/env_utils_annotations.cljc @@ -8,8 +8,7 @@ (ns ^:no-doc typed.cljc.runtime.env-utils-annotations (:require [typed.clojure :as t] - [typed.cljc.runtime.env-utils :as env-utils]) - (:import #?(:clojure [java.lang.ref SoftReference]))) + [typed.cljc.runtime.env-utils :as env-utils])) (t/defalias env-utils/InvalidationId t/Str) (t/defalias env-utils/ForcedType diff --git a/typed/clj.runtime/src/typed/clojure.cljc b/typed/clj.runtime/src/typed/clojure.cljc index acf36cb55..e74f57ba5 100644 --- a/typed/clj.runtime/src/typed/clojure.cljc +++ b/typed/clj.runtime/src/typed/clojure.cljc @@ -82,9 +82,7 @@ :cljr (defmacro inst-ctor [& args] - (platform-case - :clj `(clojure.core.typed/inst-ctor ~@args) - :cljs (throw (ex-info "inst-ctor does not applicable in CLJS" {})))) + `(clojure.core.typed/inst-ctor ~@args)) ) @@ -157,16 +155,15 @@ :cljs `(cljs.core.typed/atom ~@args))) #?(:clj - (defmacro ref [& args] - (platform-case - :clj `(clojure.core.typed/ref ~@args) - :cljs (throw (ex-info "ref does not exist in CLJS" {})))) +(defmacro ref [& args] + (platform-case + :clj `(clojure.core.typed/ref ~@args) + :cljs (throw (ex-info "ref does not exist in CLJS" {})))) :cljr - (defmacro ref [& args] - (platform-case - :clj `(clojure.core.typed/ref ~@args) - :cljs (throw (ex-info "ref does not exist in CLJS" {})))) +(defmacro ref [& args] + `(clojure.core.typed/ref ~@args)) + ) ;; checker ops @@ -212,10 +209,7 @@ ;; - if *ns* ends in $macros, check-ns-clj ;; - otherwise, check-ns-cljs :cljs `(check-ns-cljs ~@args) - :cljr (platform-case - ;; hmm, should this be evaluated at compile-time too for consistency? - :clj `(check-ns-clj ~@args) - :cljs (apply (requiring-resolve 'cljs.core.typed/check-ns-expansion-side-effects) args)))) + :cljr `(check-ns-clj ~@args))) (defmacro cf-clj "Check a Clojure form in the current *ns*." @@ -232,16 +226,7 @@ 2 (concat args [true])))))) ;;TODO check in macros ns? :cljs `(cljs.core.typed/cf ~@args) - :cljr (platform-case - :clj `(clojure.core.typed/cf ~@args) - :cljs (binding [*ns* (create-ns @(requiring-resolve 'cljs.analyzer/*cljs-ns*))] - (list 'quote - (apply (requiring-resolve 'clojure.core.typed/check-form*) - (case (count args) - ;; form | expected expected-provided? - 1 (concat args [nil nil]) - ;; form expected | expected-provided? - 2 (concat args [true])))))))) + :cljr `(clojure.core.typed/cf ~@args))) (defmacro cf-cljs "Check a ClojureScript form in the same namespace as the current platform." @@ -262,21 +247,13 @@ ;; form expected | expected-provided? 2 (concat args [true]))))) :cljs `(cljs.core.typed/cf ~@args) - :cljr (platform-case - :clj `(with-bindings {(requiring-resolve 'cljs.analyzer/*cljs-ns*) (ns-name *ns*)} + :cljr `(with-bindings {(requiring-resolve 'cljs.analyzer/*cljs-ns*) (ns-name *ns*)} (apply (requiring-resolve 'cljs.core.typed/check-form*) '~(case (count args) ;; form | expected expected-provided? 1 (concat args [nil nil]) ;; form expected | expected-provided? - 2 (concat args [true])))) - :cljs (list 'quote - (apply (requiring-resolve 'cljs.core.typed/check-form*) - (case (count args) - ;; form | expected expected-provided? - 1 (concat args [nil nil]) - ;; form expected | expected-provided? - 2 (concat args [true]))))))) + 2 (concat args [true])))))) ;; TODO add check-form-clj{s} defn's for symmetry (defmacro cf @@ -287,9 +264,7 @@ :clj `(cf-clj ~@args) :cljs `(cf-cljs ~@args)) :cljs `(cf-cljs ~@args) - :cljr (platform-case - :clj `(cf-clj ~@args) - :cljs `(cf-cljs ~@args)))) + :cljr `(cf-clj ~@args))) (defmacro doc-clj "Pass any syntax fragment related to Typed Clojure to print documentation on it. diff --git a/typed/clj.runtime/test/clojure/core/typed/test_rt.clj b/typed/clj.runtime/test/clojure/core/typed/test_rt.cljc similarity index 58% rename from typed/clj.runtime/test/clojure/core/typed/test_rt.clj rename to typed/clj.runtime/test/clojure/core/typed/test_rt.cljc index e88cb508a..b9a49d06b 100644 --- a/typed/clj.runtime/test/clojure/core/typed/test_rt.clj +++ b/typed/clj.runtime/test/clojure/core/typed/test_rt.cljc @@ -1,41 +1,41 @@ (ns clojure.core.typed.test-rt (:require [clojure.core.typed :as t] [clojure.core.typed.errors :as err] - [clojure.java.io :as io] + #?(:cljr [clojure.clr.io :as io] :default [clojure.java.io :as io]) [clojure.test :refer [deftest is]])) (deftest typed-clojure-loaded (is (nil? (require 'clojure.core.typed)))) (deftest ^:typed/skip-from-repo-root checking-ops - (is (thrown? java.io.FileNotFoundException + (is (thrown? #?(:cljr System.IO.FileNotFoundException :default java.io.FileNotFoundException) (t/load-if-needed))) - (is (thrown? java.io.FileNotFoundException + (is (thrown? #?(:cljr System.IO.FileNotFoundException :default java.io.FileNotFoundException) (t/reset-caches))) - (is (thrown? java.io.FileNotFoundException + (is (thrown? #?(:cljr System.IO.FileNotFoundException :default java.io.FileNotFoundException) (t/method-type 'foo))) - (is (thrown? java.io.FileNotFoundException + (is (thrown? #?(:cljr System.IO.FileNotFoundException :default java.io.FileNotFoundException) (t/into-array> 'foo 'bar [1]))) - (is (thrown? java.io.FileNotFoundException + (is (thrown? #?(:cljr System.IO.FileNotFoundException :default java.io.FileNotFoundException) (t/cf 1))) - (is (thrown? java.io.FileNotFoundException + (is (thrown? #?(:cljr System.IO.FileNotFoundException :default java.io.FileNotFoundException) (t/check-form* 1))) - (is (thrown? java.io.FileNotFoundException + (is (thrown? #?(:cljr System.IO.FileNotFoundException :default java.io.FileNotFoundException) (t/check-form-info 1))) - (is (thrown? java.io.FileNotFoundException + (is (thrown? #?(:cljr System.IO.FileNotFoundException :default java.io.FileNotFoundException) (t/check-ns 'foo))) - (is (thrown? java.io.FileNotFoundException + (is (thrown? #?(:cljr System.IO.FileNotFoundException :default java.io.FileNotFoundException) (t/check-ns-info 'foo))) - (is (thrown? java.io.FileNotFoundException + (is (thrown? #?(:cljr System.IO.FileNotFoundException :default java.io.FileNotFoundException) (t/statistics ['foo]))) - (is (thrown? java.io.FileNotFoundException + (is (thrown? #?(:cljr System.IO.FileNotFoundException :default java.io.FileNotFoundException) (t/var-coverage)))) (defmacro thrown-blame? [& e] `(try (try (do ~@e) false - (catch clojure.lang.Compiler$CompilerException e# - (throw (.source e#)))) + (catch #?(:cljr clojure.lang.Compiler+CompilerException :default clojure.lang.Compiler$CompilerException) e# + (throw (#?(:cljr .FileSource :default .source) e#)))) (catch clojure.lang.ExceptionInfo e# (boolean (-> e# ex-data :blame))))) From 6730092e83f5fa2f941f04bb98e6fb4dd5c6f584 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Thu, 23 May 2024 11:26:15 -0500 Subject: [PATCH 10/13] enable build --- .github/workflows/clj.yml | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/.github/workflows/clj.yml b/.github/workflows/clj.yml index f782b0594..c4f8164f3 100644 --- a/.github/workflows/clj.yml +++ b/.github/workflows/clj.yml @@ -13,14 +13,6 @@ env: jobs: setup: - # delegate self-pull-requests to push jobs and run cron only in main repo - if: ${{ !((github.repository == 'typedclojure/typedclojure' || - github.repository_owner == 'frenchy64') - && github.event_name == 'pull_request') - && - (github.repository == 'typedclojure/typedclojure' || - github.event_name != 'schedule') - }} runs-on: ubuntu-20.04 outputs: matrix: ${{ steps.set-matrix.outputs.matrix }} @@ -35,14 +27,6 @@ jobs: id: set-matrix run: ./script/print-actions-matrix.clj test: - # delegate self-pull-requests to push jobs and run cron only in main repo - if: ${{ !((github.repository == 'typedclojure/typedclojure' || - github.repository_owner == 'frenchy64') - && github.event_name == 'pull_request') - && - (github.repository == 'typedclojure/typedclojure' || - github.event_name != 'schedule') - }} needs: setup runs-on: ubuntu-20.04 strategy: From fa33dbc4d4c8ad61648a78df4880dd681470784c Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Thu, 23 May 2024 11:29:23 -0500 Subject: [PATCH 11/13] pin --- example-projects/clj-kondo-hooks/deps.edn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example-projects/clj-kondo-hooks/deps.edn b/example-projects/clj-kondo-hooks/deps.edn index e6f0398a1..915f11bb5 100644 --- a/example-projects/clj-kondo-hooks/deps.edn +++ b/example-projects/clj-kondo-hooks/deps.edn @@ -2,7 +2,7 @@ org.typedclojure/typed.clj.runtime {:local/root "../../typed/clj.runtime"}} :aliases {:dev {:extra-paths ["test"]} :clj-kondo - {:replace-deps {clj-kondo/clj-kondo {:mvn/version "RELEASE"}} + {:replace-deps {clj-kondo/clj-kondo {:mvn/version "2024-03-11"}} :main-opts ["-m" "clj-kondo.main"]} :test {:extra-deps {io.github.cognitect-labs/test-runner {:git/tag "v0.5.0" :git/sha "b3fd0d2"}} From 15c3c994ee33a5ec6cbdd958cf138e554c05bae6 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Thu, 23 May 2024 11:31:28 -0500 Subject: [PATCH 12/13] 13 --- example-projects/clj-kondo-hooks/deps.edn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example-projects/clj-kondo-hooks/deps.edn b/example-projects/clj-kondo-hooks/deps.edn index 915f11bb5..6d4264206 100644 --- a/example-projects/clj-kondo-hooks/deps.edn +++ b/example-projects/clj-kondo-hooks/deps.edn @@ -2,7 +2,7 @@ org.typedclojure/typed.clj.runtime {:local/root "../../typed/clj.runtime"}} :aliases {:dev {:extra-paths ["test"]} :clj-kondo - {:replace-deps {clj-kondo/clj-kondo {:mvn/version "2024-03-11"}} + {:replace-deps {clj-kondo/clj-kondo {:mvn/version "2024-03-13"}} :main-opts ["-m" "clj-kondo.main"]} :test {:extra-deps {io.github.cognitect-labs/test-runner {:git/tag "v0.5.0" :git/sha "b3fd0d2"}} From db41bbed342aed2f9ddf058e89e660bb34ea2cc8 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Thu, 23 May 2024 11:32:43 -0500 Subject: [PATCH 13/13] dot --- example-projects/clj-kondo-hooks/deps.edn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example-projects/clj-kondo-hooks/deps.edn b/example-projects/clj-kondo-hooks/deps.edn index 6d4264206..d426e8fc5 100644 --- a/example-projects/clj-kondo-hooks/deps.edn +++ b/example-projects/clj-kondo-hooks/deps.edn @@ -2,7 +2,7 @@ org.typedclojure/typed.clj.runtime {:local/root "../../typed/clj.runtime"}} :aliases {:dev {:extra-paths ["test"]} :clj-kondo - {:replace-deps {clj-kondo/clj-kondo {:mvn/version "2024-03-13"}} + {:replace-deps {clj-kondo/clj-kondo {:mvn/version "2024.03.13"}} :main-opts ["-m" "clj-kondo.main"]} :test {:extra-deps {io.github.cognitect-labs/test-runner {:git/tag "v0.5.0" :git/sha "b3fd0d2"}} pFad - Phonifier reborn

    Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

    Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


    Alternative Proxies:

    pFad Proxy

    pFad v3 Proxy

    pFad v4 Proxy

    Alternative Proxy