<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>Clojure Q&amp;A - Recent questions and answers</title>
<link>https://ask.clojure.org/index.php/qa</link>
<description></description>
<item>
<title>AVLMap does not implement isEmpty for java.util.Map</title>
<link>https://ask.clojure.org/index.php/15243/avlmap-does-not-implement-isempty-for-java-util-map</link>
<description>&lt;p&gt;The clojure.data.avl &lt;code&gt;AVLMap&lt;/code&gt; does not have an implementation for the &lt;code&gt;isEmpty&lt;/code&gt; method of the &lt;code&gt;java.util.Map&lt;/code&gt; interface.&lt;/p&gt;
&lt;p&gt;The cider debugger calls &lt;code&gt;isEmpty&lt;/code&gt; on instances of &lt;code&gt;java.util.Map&lt;/code&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/clojure-emacs/orchard/blob/329ac7464e324758f3443918fe7598eca47327cf/src/orchard/print.clj#L242&quot;&gt;when printing values&lt;/a&gt; while stepping through execution. If the value is an &lt;code&gt;AVLMap&lt;/code&gt;, this throws an AbstractMethodError that prevents the debugger from working (see the stacktrace below).&lt;/p&gt;
&lt;p&gt;I have a workaround, which is to use a &lt;code&gt;:local/root&lt;/code&gt; version of clojure.data.avl with &lt;code&gt;isEmpty&lt;/code&gt; implemented.&lt;/p&gt;
&lt;p&gt;I have not checked if this problem exists on the CLJS implementation.&lt;/p&gt;
&lt;p&gt;I am on Clojure 1.12.4 and clojure.data.avl 0.2.1.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  Show: Project-Only All 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;  Hide: Clojure Java REPL Tooling Duplicates  (35 frames hidden)&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Unhandled java.lang.AbstractMethodError&lt;br&gt;
Method clojure/data/avl/AVLMap.isEmpty()Z is abstract&lt;pre&gt;&lt;code&gt;            avl.clj:   -1  clojure.data.avl.AVLMap/isEmpty
          print.clj:  166  orchard.print/print-map
          print.clj:  165  orchard.print/print-map
          print.clj:  174  orchard.print/eval46055/fn
       MultiFn.java:  234  clojure.lang.MultiFn/invoke
          print.clj:  301  orchard.print/print-str/fn
          print.clj:  301  orchard.print/print-str
          print.clj:  295  orchard.print/print-str
          debug.clj:  195  cider.nrepl.middleware.debug/pr-short
          debug.clj:  183  cider.nrepl.middleware.debug/pr-short
           core.clj: 7059  clojure.core/mapv/fn
      protocols.clj:   42  clojure.core.protocols/iterator-reduce!
      protocols.clj:   52  clojure.core.protocols/iter-reduce
      protocols.clj:   74  clojure.core.protocols/fn
      protocols.clj:   74  clojure.core.protocols/fn
      protocols.clj:   13  clojure.core.protocols/fn/G
           core.clj: 6965  clojure.core/reduce
           core.clj: 7050  clojure.core/mapv
           core.clj: 7050  clojure.core/mapv
           core.clj: 2641  clojure.core/partial/fn
           core.clj: 7059  clojure.core/mapv/fn
      protocols.clj:   42  clojure.core.protocols/iterator-reduce!
      protocols.clj:   52  clojure.core.protocols/iter-reduce
      protocols.clj:   74  clojure.core.protocols/fn
      protocols.clj:   74  clojure.core.protocols/fn
      protocols.clj:   13  clojure.core.protocols/fn/G
           core.clj: 6965  clojure.core/reduce
           core.clj: 7050  clojure.core/mapv
           core.clj: 7050  clojure.core/mapv
          debug.clj:  200  cider.nrepl.middleware.debug/locals-for-message
          debug.clj:  197  cider.nrepl.middleware.debug/locals-for-message
           core.clj: 6259  clojure.core/update
           core.clj: 6251  clojure.core/update
          debug.clj:  244  cider.nrepl.middleware.debug/read-debug-input
          debug.clj:  233  cider.nrepl.middleware.debug/read-debug-input
          debug.clj:  356  cider.nrepl.middleware.debug/read-debug-command
          debug.clj:  322  cider.nrepl.middleware.debug/read-debug-command
          debug.clj:  557  cider.nrepl.middleware.debug/break
          debug.clj:  535  cider.nrepl.middleware.debug/break
           Var.java:  401  clojure.lang.Var/invoke
  DebugSupport.java:   23  cider.nrepl.middleware.DebugSupport/doBreak
               REPL:  749  fredb.index.storage/eval82032/materialize
               REPL:  767  fredb.index.storage/eval82041
               REPL:  767  fredb.index.storage/eval82041
      Compiler.java: 7757  clojure.lang.Compiler/eval
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;   interruptible_eval.clj:  106  nrepl.middleware.interruptible-eval/evaluator/run/fn&lt;br&gt;
   interruptible_eval.clj:  101  nrepl.middleware.interruptible-eval/evaluator/run&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;        session.clj:  251  nrepl.middleware.session/session-exec/session-loop
 SessionThread.java:   21  nrepl.SessionThread/run
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
</description>
<category>data.avl</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15243/avlmap-does-not-implement-isempty-for-java-util-map</guid>
<pubDate>Thu, 08 Oct 2026 04:44:14 +0000</pubDate>
</item>
<item>
<title>Behavior when an alias is defined in multiple deps.edn might be surprising</title>
<link>https://ask.clojure.org/index.php/15242/behavior-when-alias-defined-multiple-deps-might-surprising</link>
<description>&lt;p&gt;&lt;strong&gt;Situation:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Define the &lt;strong&gt;same&lt;/strong&gt; alias in multiple &lt;code&gt;deps.edn&lt;/code&gt; locations—user, project, extra, i.e., via &lt;code&gt;-Sdeps&lt;/code&gt;—and then use it in a Clojure CLI invocation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Behavior:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The definitions of that alias are &lt;em&gt;merged&lt;/em&gt; across the four sources.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why that might be surprising:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Per the &lt;a rel=&quot;nofollow&quot; href=&quot;https://clojure.org/reference/clojure_cli#deps_sources&quot;&gt;CLI deps sources reference&lt;/a&gt; &quot;The merge &lt;em&gt;[of the EDN files]&lt;/em&gt; is essentially &lt;code&gt;merge-with merge&lt;/code&gt;, except for &lt;code&gt;:paths&lt;/code&gt; where only the last deps source &lt;code&gt;:paths&lt;/code&gt; is used.&quot;&lt;/p&gt;
&lt;p&gt;In addition, per the &lt;a rel=&quot;nofollow&quot; href=&quot;https://clojure.org/reference/clojure_cli#aliases&quot;&gt;CLI deps aliases reference&lt;/a&gt; When &lt;strong&gt;multiple&lt;/strong&gt; aliases are provided, the attributes of each alias are merged together under a specific set of rules.&lt;/p&gt;
&lt;p&gt;Based on both of these, if you have a &lt;strong&gt;single&lt;/strong&gt; alias defined in multiple sources, you might expect a simple &quot;last definition wins&quot; behavior, since the second part doesn't apply, and the first part indicates &lt;code&gt;:aliases&lt;/code&gt; will be simply &lt;code&gt;merge&lt;/code&gt;'d across the sources.&lt;/p&gt;
&lt;p&gt;However, in &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/clojure/tools.deps/blob/dec86fcce4787c0a778fee673bf1e9e03b1a304a/src/main/clojure/clojure/tools/deps.clj#L702-L705&quot;&gt;tools.deps&lt;/a&gt; we see that &lt;code&gt;create-basis&lt;/code&gt; takes the EDN maps from all four tiers, gets the &lt;code&gt;:aliases&lt;/code&gt; entry from each and does &lt;code&gt;merge-with merge&lt;/code&gt; on those.&lt;/p&gt;
&lt;p&gt;That's why the alias ends up with a &lt;code&gt;merge&lt;/code&gt; of its definitions. I don't think this is documented?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why does it happen?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I'm not sure, but I suspect this is part of the &quot;aliases are 'just' data&quot; aspect, where a project-level (and extra level) alias can override &lt;em&gt;parts&lt;/em&gt; of an &quot;earlier&quot; definition, from other source &lt;code&gt;deps.edn&lt;/code&gt; files.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Does it matter?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I ran into this experimenting with the new Clojure CLI REPL project. I added &lt;code&gt;:repl&lt;/code&gt;, &lt;code&gt;:serve&lt;/code&gt;, and &lt;code&gt;:attach&lt;/code&gt; aliases to my user &lt;code&gt;deps.edn&lt;/code&gt; and got a warning (about unnamed access) when starting the REPL. I added &lt;code&gt;:jvm-opts&lt;/code&gt; to &lt;code&gt;:repl&lt;/code&gt; but still got the warning. Later, I added &lt;code&gt;:jvm-opts&lt;/code&gt; to &lt;code&gt;:attach&lt;/code&gt; so at least connecting a subsequent client didn't get the warning.&lt;/p&gt;
&lt;p&gt;Then I noticed that using &lt;code&gt;:repl&lt;/code&gt; no longer produced the warning. I looked at the CLI REPL code and it spawns the client at the process level, using &lt;code&gt;clojure&lt;/code&gt; and specifying &lt;code&gt;-Sdeps&lt;/code&gt; with an alias of &lt;code&gt;:attach&lt;/code&gt; to provide the dependencies and &lt;code&gt;:main-opts&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;That means that any tooling that runs Clojure processes, expecting to define and then use an alias via &lt;code&gt;-Sdeps&lt;/code&gt; can be affected by whatever happens to be in a user's project or user &lt;code&gt;deps.edn&lt;/code&gt; file: if the user has the same named alias defined, the tooling gets a &lt;strong&gt;merged&lt;/strong&gt; alias, not just the one it specifies.&lt;/p&gt;
</description>
<category>tools.deps</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15242/behavior-when-alias-defined-multiple-deps-might-surprising</guid>
<pubDate>Sun, 04 Oct 2026 20:42:19 +0000</pubDate>
</item>
<item>
<title>int-map: difference ignores its second argument when the first is itself a difference result</title>
<link>https://ask.clojure.org/index.php/15241/difference-ignores-second-argument-itself-difference-result</link>
<description>&lt;pre&gt;&lt;code&gt;(require '[clojure.data.int-map :as i])

(-&amp;gt; (i/int-set [10 1000297])
      (i/difference (i/int-set [10]))        ;=&amp;gt; #{1000297}
      (i/difference (i/int-set [1000297])))  ;=&amp;gt; #{1000297}, expected #{}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When SingleContainer/difference removes its only element, it returns null.  IntSet/difference puts that null into the tree instead of dropping the key. In the next difference, the entry with the null value goes to the else branch, which is meant for k1 &amp;gt; k2. That branch moves i2 forward without comparing anything, so the rest of the first set gets copied as is.&lt;/p&gt;
&lt;p&gt;Skipping null values from the first set in that loop should fix it. So should not storing empty results in the first place. :)&lt;/p&gt;
</description>
<category>data.int-map</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15241/difference-ignores-second-argument-itself-difference-result</guid>
<pubDate>Fri, 02 Oct 2026 11:28:00 +0000</pubDate>
</item>
<item>
<title>Answered: Nullpointer exception when using clojure cli with bad deps.edn file</title>
<link>https://ask.clojure.org/index.php/15238/nullpointer-exception-when-using-clojure-cli-with-deps-file?show=15239#a15239</link>
<description>&lt;p&gt;What I get is:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;~/tmp/err  $ clj -version
Clojure CLI version 1.12.6.1673
~/tmp/err  $ clj
Error building classpath. Error reading edn. Unmatched delimiter: }  (/Users/alex.miller/tmp/err/deps.edn)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Can you double-check version and update to latest clj if it's old?&lt;/p&gt;
</description>
<category>Clojure CLI</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15238/nullpointer-exception-when-using-clojure-cli-with-deps-file?show=15239#a15239</guid>
<pubDate>Mon, 21 Sep 2026 00:05:25 +0000</pubDate>
</item>
<item>
<title>Answered: tools.build copy task does not respect non-replaced-exts</title>
<link>https://ask.clojure.org/index.php/15208/tools-build-copy-task-does-not-respect-non-replaced-exts?show=15236#a15236</link>
<description>&lt;p&gt;Jira created &lt;a rel=&quot;nofollow&quot; href=&quot;https://clojure.atlassian.net/browse/TBUILD-48&quot;&gt;https://clojure.atlassian.net/browse/TBUILD-48&lt;/a&gt;&lt;/p&gt;
</description>
<category>tools.build</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15208/tools-build-copy-task-does-not-respect-non-replaced-exts?show=15236#a15236</guid>
<pubDate>Mon, 14 Sep 2026 22:24:38 +0000</pubDate>
</item>
<item>
<title>ClojureCLR: case with a boolean-literal branch returns the wrong value when bound to a local</title>
<link>https://ask.clojure.org/index.php/15235/clojureclr-boolean-literal-branch-returns-wrong-value-bound</link>
<description>&lt;p&gt;I was working on an project with claude, and found an issue with AOT compilation and unboxing.  Here is a summary (generated w/ claude)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;A case whose branches are all boolean-typed, with at least one literal true/false, gives wrong results once its value is bound to a local. The same case in tail position is correct.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; (let [f (fn [k x] (case k :a (= 0 x) :b true false))]
   [(f :a 0) (f :a 1) (f :b 0) (f nil 0) (f :zzz 0)])
  ;=&amp;gt; [true false true false false]   ; correct

 (let [f (fn [k x] (let [r (case k :a (= 0 x) :b true false)] r))]
   [(f :a 0) (f :a 1) (f :b 0) (f nil 0) (f :zzz 0)])
  ;=&amp;gt; [true false true true true]     ; the `false` default reads as true
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;(let [f (fn [k x] (let [r (boolean (case k :a (= 0 x) :b true false))] r))] (f :a 0))
 ;=&amp;gt; InvalidProgramException: Common Language Runtime detected an invalid program.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt; Reproduces on 1.12.2, 1.12.3-alpha8, and 1.12.6, with keyword, string, and int keys, with let and loop. Branches that are all calls ((= 0 x), (= 1 x)) are fine, as are cond, if, and a fn-call boundary around the case.&lt;/p&gt;
&lt;p&gt; What I think is happening, from master: BooleanExpr reports ClrType =&amp;gt; typeof(bool) but is not a MaybePrimitiveExpr. CaseExpr unifies its branch types to bool and CanEmitPrimitive only checks that type, so LetExpr declares a bool local and asks the case to emit unboxed. Inside CaseExpr.EmitExpr, the literal branch is not a MaybePrimitiveExpr, so it falls to Emit and pushes a boxed bool onto a stack slot typed bool. The non-null reference reads as true. IfExpr avoids this because its CanEmitPrimitive requires both branches to be MaybePrimitiveExpr.&lt;/p&gt;
&lt;p&gt; This looks like the same gap as CLJCLR-151, where David's comment proposes letting BooleanExpr implement MaybePrimitiveExpression. That change would fix this too. A smaller alternative is giving CaseExpr.CanEmitPrimitive the same guard IfExpr has.&lt;/p&gt;
&lt;p&gt; Is this already tracked, and should it go on CLJCLR-151 or a new ticket? Happy to write it up in JIRA if useful.&lt;/p&gt;
</description>
<category>ClojureCLR</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15235/clojureclr-boolean-literal-branch-returns-wrong-value-bound</guid>
<pubDate>Fri, 11 Sep 2026 17:25:20 +0000</pubDate>
</item>
<item>
<title>Answered: LRUCache works as FIFOCache when composed with a TTLCache</title>
<link>https://ask.clojure.org/index.php/15233/lrucache-works-as-fifocache-when-composed-with-a-ttlcache?show=15234#a15234</link>
<description>&lt;p&gt;Created &lt;a rel=&quot;nofollow&quot; href=&quot;https://clojure.atlassian.net/browse/CCACHE-70&quot;&gt;https://clojure.atlassian.net/browse/CCACHE-70&lt;/a&gt;&lt;/p&gt;
</description>
<category>core.cache</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15233/lrucache-works-as-fifocache-when-composed-with-a-ttlcache?show=15234#a15234</guid>
<pubDate>Wed, 09 Sep 2026 18:36:05 +0000</pubDate>
</item>
<item>
<title>some-&gt; intermediate step suppresses JavaScript extern inference</title>
<link>https://ask.clojure.org/index.php/15232/some-intermediate-suppresses-javascript-extern-inference</link>
<description>&lt;p&gt;ClojureScript does not seem to infer an extern or emit an inference warning for a JavaScript method call after an intermediate &lt;code&gt;some-&amp;gt;&lt;/code&gt; step. &lt;/p&gt;
&lt;p&gt;Advanced compilation then renames the call across an npm boundary and causes a runtime error.&lt;/p&gt;
&lt;p&gt;I reproduced this with ClojureScript 1.12.145 and with an uberjar built from &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/clojure/clojurescript/commit/b45dff9f9aeb506864ecb5618ba686ff2ee8de77&quot;&gt;master at &lt;code&gt;b45dff9f&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Reproduction&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;deps.edn&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{:deps {org.clojure/clojure {:mvn/version &quot;1.12.4&quot;}
        org.clojure/clojurescript {:mvn/version &quot;1.12.145&quot;}}
 :paths [&quot;src&quot;]}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;package.json&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{&quot;dependencies&quot;:{&quot;formatter-lib&quot;:&quot;file:formatter-lib&quot;},&quot;private&quot;:true}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;formatter-lib/package.json&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{&quot;main&quot;:&quot;index.js&quot;,&quot;name&quot;:&quot;formatter-lib&quot;,&quot;version&quot;:&quot;1.0.0&quot;}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;formatter-lib/index.js&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;class Formatter {
  constructor(value) {
    this.value = value;
  }

  toPattern(pattern) {
    return `${this.value}:${pattern}`;
  }
}

module.exports = (value) =&amp;gt; new Formatter(value);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;src/repro/core.cljs&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(ns repro.core
  (:require [&quot;formatter-lib&quot; :as formatter]))

(set! *warn-on-infer* true)

(defn -main []
  (println (some-&amp;gt; (formatter 42) identity (.toPattern &quot;yyyy&quot;))))

(set! *main-cli-fn* -main)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;build.edn&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{:infer-externs true
 :install-deps false
 :main repro.core
 :npm-deps {&quot;formatter-lib&quot; &quot;1.0.0&quot;}
 :optimizations :advanced
 :output-dir &quot;target/out&quot;
 :output-to &quot;target/main.js&quot;
 :target :nodejs}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Run:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm install
clojure -M -m cljs.main -co build.edn -c repro.core
node target/main.js
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The compile emits no extern inference warning. The generated call is renamed and Node fails:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;TypeError: a.Yb is not a function
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The same result occurs with the uberjar built from master:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;java -cp /path/to/clojurescript/target/cljs.jar:src \
  clojure.main -m cljs.main -co build.edn -c repro.core
node target/main.js
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Control&lt;/h3&gt;
&lt;p&gt;Removing the intermediate &lt;code&gt;identity&lt;/code&gt; step:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(println (some-&amp;gt; (formatter 42) (.toPattern &quot;yyyy&quot;)))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;causes the compiler to infer the extern:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;WARNING: Adding extern to Object for property toPattern due to ambiguous expression
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The generated method remains &lt;code&gt;toPattern&lt;/code&gt;, and Node prints:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;42:yyyy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I expected the version with the intermediate step to infer the same extern, or at least emit a warning that the target type could not be inferred.&lt;/p&gt;
</description>
<category>ClojureScript</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15232/some-intermediate-suppresses-javascript-extern-inference</guid>
<pubDate>Mon, 07 Sep 2026 23:32:03 +0000</pubDate>
</item>
<item>
<title>Answered: Rose Tree Children Appear to be Eagerly Evaluated (Clojure 1.12+)</title>
<link>https://ask.clojure.org/index.php/15226/rose-tree-children-appear-to-be-eagerly-evaluated-clojure-12?show=15228#a15228</link>
<description>&lt;p&gt;What's forcing the child seqs?&lt;/p&gt;
</description>
<category>test.check</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15226/rose-tree-children-appear-to-be-eagerly-evaluated-clojure-12?show=15228#a15228</guid>
<pubDate>Mon, 31 Aug 2026 22:08:55 +0000</pubDate>
</item>
<item>
<title>Approach to case tableswitch may consume significant bytecode space</title>
<link>https://ask.clojure.org/index.php/15219/approach-tableswitch-consume-significant-bytecode-space</link>
<description>&lt;p&gt;The issue:&lt;br&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;https://ask.clojure.org/index.php/13407/method-large-compiling-expression-unfortunate-clause-hashes&quot;&gt;https://ask.clojure.org/index.php/13407/method-large-compiling-expression-unfortunate-clause-hashes&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Logged as:&lt;br&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;https://clojure.atlassian.net/browse/CLJ-2808&quot;&gt;https://clojure.atlassian.net/browse/CLJ-2808&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Possible approaches:&lt;br&gt;
&amp;gt; One approach is to only allow smaller lookup tables.&lt;br&gt;
Another would be to lift the lookup code for large tables into a function or a separate compiled method...&lt;/p&gt;
&lt;p&gt;I suggest an approach that just measures a gap between tests.&lt;br&gt;
No need to big span and shift/mask model.&lt;br&gt;
If the gap is less than 128, then we use tableswitch; otherwise, we use lookupswitch.&lt;br&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/clojure/clojure/compare/master...magnalium:clojure:dev-2808&quot;&gt;https://github.com/clojure/clojure/compare/master...magnalium:clojure:dev-2808&lt;/a&gt;&lt;/p&gt;
</description>
<category>Compiler</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15219/approach-tableswitch-consume-significant-bytecode-space</guid>
<pubDate>Sat, 29 Aug 2026 18:34:55 +0000</pubDate>
</item>
<item>
<title>Answered: Some core predicates aren't generic over all types</title>
<link>https://ask.clojure.org/index.php/15216/some-core-predicates-arent-generic-over-all-types?show=15218#a15218</link>
<description>&lt;p&gt;I don't think that we can change the behavior of those predicates since code may rely on the throw. However, docstring updates could help with clarifying what happens when the preds are called with values that might throw.&lt;/p&gt;
</description>
<category>Clojure</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15216/some-core-predicates-arent-generic-over-all-types?show=15218#a15218</guid>
<pubDate>Mon, 24 Aug 2026 14:32:48 +0000</pubDate>
</item>
<item>
<title>Bug with installing clojure in OS that isn't in English</title>
<link>https://ask.clojure.org/index.php/15217/bug-with-installing-clojure-in-os-that-isnt-in-english</link>
<description>&lt;p&gt;I found this bug when trying to install Clojure on my computer that is in Portuguese.&lt;br&gt;
When running the linux-install.sh it was failing silently with -1&lt;/p&gt;
&lt;p&gt;I tried to download the tar and do the checksum manually, with this i discovered that the &lt;br&gt;
&lt;code&gt;echo &quot;77dd6868948074adcc93e83a796f8e8f15a1a92bcb1b9002d715fd2210e476f3  clojure-tools-1.12.5.1664.tar.gz&quot; | sha256sum -c&lt;/code&gt; &lt;br&gt;
part was printing &lt;code&gt;clojure-tools-1.12.5.1664.tar.gz: SUCESSO&lt;/code&gt;, making the &lt;code&gt;grep &quot;^clojure-tools-1.12.5.1664.tar.gz: OK$&lt;/code&gt; fail.&lt;/p&gt;
&lt;p&gt;I solved the problem by using &lt;code&gt;LC_ALL=C sudo ./linux-install.sh&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Relevant information:&lt;br&gt;
OS: Fedora Linux 44 KDE&lt;br&gt;
Locale: pt_BR.UTF-8&lt;/p&gt;
</description>
<category>Clojure CLI</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15217/bug-with-installing-clojure-in-os-that-isnt-in-english</guid>
<pubDate>Sat, 22 Aug 2026 18:48:24 +0000</pubDate>
</item>
<item>
<title>Answered: Why is clojure.core/derive not commutative?</title>
<link>https://ask.clojure.org/index.php/12878/why-is-clojure-core-derive-not-commutative?show=15212#a15212</link>
<description>&lt;p&gt;I am falling into this trap as well.&lt;/p&gt;
&lt;p&gt;There seems to be a reason for this check?&lt;/p&gt;
</description>
<category>Clojure</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/12878/why-is-clojure-core-derive-not-commutative?show=15212#a15212</guid>
<pubDate>Thu, 06 Aug 2026 14:07:33 +0000</pubDate>
</item>
<item>
<title>Answered: tools.reader project file version is outdated</title>
<link>https://ask.clojure.org/index.php/15209/tools-reader-project-file-version-is-outdated?show=15210#a15210</link>
<description>&lt;p&gt;Contrib libraries are built with Maven, not Leiningen. Any &lt;code&gt;project.clj&lt;/code&gt; files were added by the individual maintainers, purely for their own convenience, and should not be relied on.&lt;/p&gt;
</description>
<category>tools.reader</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15209/tools-reader-project-file-version-is-outdated?show=15210#a15210</guid>
<pubDate>Tue, 04 Aug 2026 13:58:22 +0000</pubDate>
</item>
<item>
<title>Answered: Concurrency bug in tools.deps use of Aether/Maven libs?</title>
<link>https://ask.clojure.org/index.php/15192/concurrency-bug-in-tools-deps-use-of-aether-maven-libs?show=15205#a15205</link>
<description>&lt;p&gt;In Clojure CLI 1.12.5.1664 I have moved tools.deps to use a single shared context/system/session instead of creating and caching one per thread. The previous mode was attempting to increase isolation when Maven was handling this poorly. In the newer version of these libs, they have made these interface support concurrency better and I believe this will be better.&lt;/p&gt;
</description>
<category>tools.deps</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15192/concurrency-bug-in-tools-deps-use-of-aether-maven-libs?show=15205#a15205</guid>
<pubDate>Mon, 27 Jul 2026 22:04:28 +0000</pubDate>
</item>
<item>
<title>Answered: Add assoc-some for constructing maps while skipping nil values</title>
<link>https://ask.clojure.org/index.php/15184/add-assoc-some-for-constructing-maps-while-skipping-values?show=15204#a15204</link>
<description>&lt;p&gt;We have an existing jira for this idea at &lt;a rel=&quot;nofollow&quot; href=&quot;https://clojure.atlassian.net/browse/CLJ-2707&quot;&gt;https://clojure.atlassian.net/browse/CLJ-2707&lt;/a&gt;&lt;/p&gt;
</description>
<category>Clojure</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15184/add-assoc-some-for-constructing-maps-while-skipping-values?show=15204#a15204</guid>
<pubDate>Mon, 27 Jul 2026 13:09:36 +0000</pubDate>
</item>
<item>
<title>Answered: `(nth nil 10)` returns `nil` when it should throw</title>
<link>https://ask.clojure.org/index.php/15195/nth-nil-10-returns-nil-when-it-should-throw?show=15196#a15196</link>
<description>&lt;p&gt;This is the expected behvaior (older ticket where this was considered is at &lt;a rel=&quot;nofollow&quot; href=&quot;https://clojure.atlassian.net/browse/CLJ-2029&quot;&gt;https://clojure.atlassian.net/browse/CLJ-2029&lt;/a&gt;). &lt;code&gt;nth&lt;/code&gt;, like &lt;code&gt;get&lt;/code&gt; or &lt;code&gt;contains?&lt;/code&gt; has polymorphic behavior on nil, and that is as intended. The docstring could probably be clarified.&lt;/p&gt;
</description>
<category>Collections</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15195/nth-nil-10-returns-nil-when-it-should-throw?show=15196#a15196</guid>
<pubDate>Wed, 22 Jul 2026 13:52:32 +0000</pubDate>
</item>
<item>
<title>JVM-parity bug in how :clojure.datafy/class is set in clojureCLR</title>
<link>https://ask.clojure.org/index.php/15191/jvm-parity-bug-in-how-clojure-datafy-class-is-set-clojureclr</link>
<description>&lt;p&gt;As I was working on the &lt;code&gt;magic&lt;/code&gt; compiler (the compiler to build to il2cpp in Unity), I noticed i was not having the same behaviour for datafy than clojureCLR.&lt;/p&gt;
&lt;p&gt;In fact, we found a small JVM-parity bug in &lt;code&gt;clojure.datafy/datafy&lt;/code&gt;, in how &lt;code&gt;:clojure.datafy/class&lt;/code&gt; is set in ClojureCLR:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;;; JVM clojure (datafy.clj) : fully qualified name, e.g. my.ns.CombinationB
(vary-meta v assoc ::obj x ::class (-&amp;gt; x class .getName symbol))

;; MAGIC's port : .FullName is the CLR equivalent of .getName, so same result
(vary-meta v assoc ::obj x ::class (-&amp;gt; x class .FullName symbol))

;; ClojureCLR (Clojure.Source/clojure/datafy.clj) : .Name is only the short name,
;; e.g. CombinationB, so the namespace is lost
(vary-meta v assoc ::obj x ::class (-&amp;gt; x class .Name symbol))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This breaks code that resolves the class back from the metadata (e.g. reconstructing records from datafied data ). The fix is small change: &lt;code&gt;.Name&lt;/code&gt; → &lt;code&gt;.FullName&lt;/code&gt;.&lt;/p&gt;
</description>
<category>ClojureCLR</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15191/jvm-parity-bug-in-how-clojure-datafy-class-is-set-clojureclr</guid>
<pubDate>Tue, 21 Jul 2026 06:27:09 +0000</pubDate>
</item>
<item>
<title>Answered: Possible bug in conditional with NaN comparison</title>
<link>https://ask.clojure.org/index.php/15174/possible-bug-in-conditional-with-nan-comparison?show=15190#a15190</link>
<description>&lt;p&gt;It's definitely a bug. Will be fixed in the next release.  (I'll have a new alpha out this week, but plan to do a GA release toward the end of the week.) &lt;/p&gt;
&lt;p&gt;For those who like details:&lt;/p&gt;
&lt;p&gt;It's a bug that only occurs when calling a one of &amp;lt;, &amp;lt;=, &amp;gt;, &amp;gt;= on two arguments in a context where both arguments have known types and the types are both double, and the context of the call is the test in a conditional.  So only when we have something like &lt;code&gt;(if (&amp;lt;= ^double x ^double y) ... )&lt;/code&gt;.  And the generated code gives an incorrect answer only when one or both of the arguments is NaN.  &lt;/p&gt;
&lt;p&gt;Why? (Asks no one.)&lt;/p&gt;
&lt;p&gt;Both the ClojureJVM and ClojureCLR compilers detect calls to numeric comparison operators as the test of a conditional and replace a static method call with an equivalent sequence of direct bytecode/MSIL instructions.   The ClojureCLR code copied the comparator code for integer arguments when doing the double, which involved a negation.  For integers, the negation of a &amp;lt;= is &amp;gt;.  That is not true for doubles, when an argument is NaN.  Brain cramp.&lt;/p&gt;
</description>
<category>ClojureCLR</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15174/possible-bug-in-conditional-with-nan-comparison?show=15190#a15190</guid>
<pubDate>Mon, 20 Jul 2026 14:29:43 +0000</pubDate>
</item>
<item>
<title>Answered: Implement ^:async (CLJS) for protocol functions and multi-methods</title>
<link>https://ask.clojure.org/index.php/15187/implement-async-cljs-for-protocol-functions-multi-methods?show=15189#a15189</link>
<description>&lt;p&gt;As this isn't going to be supported (yet) a workaround that you can use everywhere is:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;((^:async fn [] ...your method body here...))
&lt;/code&gt;&lt;/pre&gt;
</description>
<category>ClojureScript</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15187/implement-async-cljs-for-protocol-functions-multi-methods?show=15189#a15189</guid>
<pubDate>Sun, 19 Jul 2026 15:59:04 +0000</pubDate>
</item>
<item>
<title>Answered: destructuring with :keys! and :or</title>
<link>https://ask.clojure.org/index.php/15179/destructuring-with-keys-and-or?show=15180#a15180</link>
<description>&lt;p&gt;Yes, this is as expected.&lt;/p&gt;
&lt;p&gt;Note that pre-1.13, :or was a map of binding (unadorned symbol) to default value to be used if a bound key was missing. Any other key type had no meaning and was ignored. In 1.13, :or may contain literal keys that will be added to the :defaults map or be used to fill in the :select map (they have no other use).&lt;/p&gt;
&lt;p&gt;1) No :defaults or :select, so :a is just ignored.&lt;/p&gt;
&lt;p&gt;2) a is now bound and thus :a is required. Because of this, there is no possibility to use :a from :or in :defaults or :select, so this is now an error.&lt;/p&gt;
&lt;p&gt;3) Again, :b is not needed for :defaults or :select, so ignored (really same as #1).&lt;/p&gt;
</description>
<category>Syntax and reader</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15179/destructuring-with-keys-and-or?show=15180#a15180</guid>
<pubDate>Tue, 14 Jul 2026 20:13:00 +0000</pubDate>
</item>
<item>
<title>Answered: require yields confusing &quot;namespace ... not found after loading ...&quot; error if masked by empty test file</title>
<link>https://ask.clojure.org/index.php/15173/require-yields-confusing-namespace-found-after-loading-masked?show=15176#a15176</link>
<description>&lt;p&gt;I realize that I made a mistake, the test file should have been named &lt;code&gt;llm_test.clj&lt;/code&gt; instead of &lt;code&gt;llm.clj&lt;/code&gt;. Nevertheless the compiler error message could be more user-friendly, perhaps by including the full path to the problematic file.&lt;/p&gt;
</description>
<category>Clojure</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15173/require-yields-confusing-namespace-found-after-loading-masked?show=15176#a15176</guid>
<pubDate>Tue, 14 Jul 2026 01:43:38 +0000</pubDate>
</item>
<item>
<title>Answered: Additional handling for `&amp;` symbol in map destructuring for :keys/:syms/:strs could be a breaking change.</title>
<link>https://ask.clojure.org/index.php/15171/additional-handling-symbol-destructuring-breaking-change?show=15172#a15172</link>
<description>&lt;p&gt;Yes, the intent here is to carve this out of being allowed so it is available for syntax purposes in destructuring. We did a fair amount of searching and do not see this being used anywhere. &lt;/p&gt;
&lt;p&gt;We've updated the reference page at &lt;a rel=&quot;nofollow&quot; href=&quot;https://clojure.org/reference/reader#_symbols&quot;&gt;https://clojure.org/reference/reader#_symbols&lt;/a&gt; to explicitly note this.&lt;/p&gt;
</description>
<category>Syntax and reader</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15171/additional-handling-symbol-destructuring-breaking-change?show=15172#a15172</guid>
<pubDate>Thu, 09 Jul 2026 15:57:10 +0000</pubDate>
</item>
<item>
<title>Browser REPL on different port</title>
<link>https://ask.clojure.org/index.php/15170/browser-repl-on-different-port</link>
<description>&lt;p&gt;Clojurescript's built-in browser REPL is on port 9000 by default but that clashes with ZScaler on my work laptop so I use port 8090 instead. It took a few goes to get it working but now I have it sorted.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;clojure -M -m cljs.main -v -p 8090 -co '{:closure-defines {&quot;clojure.browser.repl.PORT&quot; 8090}}' -c foo.core -r&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;There are some points in the documentation that might benefit from clarification. The &lt;code&gt;-p&lt;/code&gt; flag is not mentioned on &lt;a rel=&quot;nofollow&quot; href=&quot;https://clojurescript.org/reference/repl-and-main&quot;&gt;The REPL and main entry points&lt;/a&gt; but seems to serve the same purpose as :port described on &lt;a rel=&quot;nofollow&quot; href=&quot;https://clojurescript.org/reference/repl-options&quot;&gt;REPL Options&lt;/a&gt; because this also works:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;clojure -M -m cljs.main -v -ro '{:port 8090}' -co '{:closure-defines {&quot;clojure.browser.repl.PORT&quot; 8090}}' -c foo.core -r&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;What is a little bit surprising is that :port is only mentioned under the Node REPL Options section but applies to browser REPLs too.&lt;/p&gt;
&lt;p&gt;Not really a question in all this but I wanted to share this for others who might get stuck.&lt;/p&gt;
&lt;p&gt;Versions for posterity: Clojure CLI version (deps.clj) 1.12.2.1565 on Windows 11 and ClojureScript 1.11.54.&lt;/p&gt;
</description>
<category>ClojureScript</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15170/browser-repl-on-different-port</guid>
<pubDate>Wed, 08 Jul 2026 07:16:39 +0000</pubDate>
</item>
<item>
<title>Answered: Will :keys! work with nested maps?</title>
<link>https://ask.clojure.org/index.php/15160/will-keys-work-with-nested-maps?show=15166#a15166</link>
<description>&lt;p&gt;If we try that code in a REPL, we see that it complains about &lt;code&gt;:e&lt;/code&gt; being missing:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;user=&amp;gt; (let [sample-map {:a 1 :b {:a 2 :b 3 :c 4 :d 42}}
             {a :a {aa :a :as m :keys! [b c &amp;amp; d e]} :b} (dissoc sample-map :c)] b)
Execution error (IllegalArgumentException) at user/eval126 (REPL:1).
Missing required key: :e
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;But the test is weird because &lt;code&gt;sample-map&lt;/code&gt; doesn't actually have a &lt;code&gt;:c&lt;/code&gt; key at the top level, only nested under &lt;code&gt;:b&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;In answer to your overall question, yes, &lt;code&gt;:keys!&lt;/code&gt; works anywhere that &lt;code&gt;:keys&lt;/code&gt; already works, and that includes nested map destructuring.&lt;/p&gt;
&lt;p&gt;Here's an example from our code at work:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  [{:keys! [worldsingles-application members actioner database]
    {:keys! [&amp;amp; redis-pubsub] pubsub :redis-pubsub} :worldsingles-application
    :as service}]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This checks that &lt;code&gt;:redis-pubsub&lt;/code&gt; is a key under &lt;code&gt;:worldsingles-application&lt;/code&gt; which is a key of &lt;code&gt;service&lt;/code&gt;, but does not bind &lt;code&gt;redis-pubsub&lt;/code&gt;, and also binds &lt;code&gt;pubsub&lt;/code&gt; to the &lt;code&gt;:redis-pubsub&lt;/code&gt; key. Yes, we have Alpha 2 in  production and this code used to be multiple &lt;code&gt;let&lt;/code&gt; bindings and explicit checks for keys being present.&lt;/p&gt;
</description>
<category>Test</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15160/will-keys-work-with-nested-maps?show=15166#a15166</guid>
<pubDate>Mon, 06 Jul 2026 16:08:02 +0000</pubDate>
</item>
<item>
<title>Weird install paths can break linux-install.sh or posix-install.sh scripts</title>
<link>https://ask.clojure.org/index.php/15164/weird-install-paths-break-linux-install-posix-install-scripts</link>
<description>&lt;p&gt;I'm trying to install clojure from the official installer for once, instead of my old &quot;install lein from apt&quot; method -- I wanted the official tool CLIs.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ curl -L -O https://github.com/clojure/brew-install/releases/latest/download/linux-install.sh
(completes)
$ chmod u+x linux-install.sh 
$ ./linux-install.sh --prefix &quot;$HOME/.local&quot;
Downloading and expanding tar
clojure-tools-1.12.5.1654.tar.gz: OK
Installing libs into /home/fgabolde@/.local/lib/clojure
Installing clojure and clj into /home/fgabolde@/.local/bin
sed: -e expression #1, char 25: unknown option to `s'
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Undeterred, I go back to the &lt;a rel=&quot;nofollow&quot; href=&quot;https://clojure.org/guides/install_clojure&quot;&gt;docs&lt;/a&gt; and find a &quot;POSIX&quot; installer. Aha! That must be it. The other installer assumed something about my shell environment and this one must be written to POSIX specs and that will fix everything!&lt;/p&gt;
&lt;p&gt;I download posix-installer.sh, do the same dance, and exactly the same happens.&lt;/p&gt;
&lt;p&gt;At this point I remember that when this machine was provisioned, IT made a typo and my homedir is &lt;code&gt;/home/fgabolde@&lt;/code&gt; for no good reason. This has tripped up other programs before. And indeed, the sed invocations in the install script use &lt;code&gt;@&lt;/code&gt; as a delimiter, so my weird homedir terminates the replacement string early.&lt;/p&gt;
&lt;p&gt;I fixed it by changing the delimiters in the install script and rerunning.&lt;/p&gt;
</description>
<category>Clojure CLI</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15164/weird-install-paths-break-linux-install-posix-install-scripts</guid>
<pubDate>Mon, 06 Jul 2026 15:46:10 +0000</pubDate>
</item>
<item>
<title>Answered: Namespaced map conversion fails when namespace keyword starts with a number</title>
<link>https://ask.clojure.org/index.php/15159/namespaced-conversion-fails-namespace-keyword-starts-number?show=15161#a15161</link>
<description>&lt;blockquote&gt;&lt;p&gt;It looks like Clojure has no problem with either :0 or :0/a&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It does, it just doesn't complain - there are very few explicit checks and in general it's GIGO (garbage in, garbage out).&lt;/p&gt;
&lt;p&gt;From &lt;a rel=&quot;nofollow&quot; href=&quot;https://clojure.org/reference/reader&quot;&gt;https://clojure.org/reference/reader&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Symbols begin with a non-numeric character [...]
[...]&lt;br&gt;
Keywords are like symbols [...]&lt;/p&gt;
&lt;/blockquote&gt;
</description>
<category>Clojure</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15159/namespaced-conversion-fails-namespace-keyword-starts-number?show=15161#a15161</guid>
<pubDate>Mon, 06 Jul 2026 15:27:22 +0000</pubDate>
</item>
<item>
<title>Answered: Changing type tags can lead to cryptic errors</title>
<link>https://ask.clojure.org/index.php/15124/changing-type-tags-can-lead-to-cryptic-errors?show=15156#a15156</link>
<description>&lt;p&gt;It might be useful for the compiler to give a warning when a var is redefined such that it loses a primitive interface.&lt;/p&gt;
&lt;p&gt;We could still detect these changes without compiler changes like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Clojure 1.12.5
user=&amp;gt; (defn f ^long [^long a] a)
#'user/f
user=&amp;gt; (add-watch #'f ::undo-prim (fn [_ _ old new] (when (and (instance? clojure.lang.IFn$LL old) (not (instance? clojure.lang.IFn$LL new))) (println &quot;WARNING: removed clojure.lang.IFn$LL from f&quot;))))
#'user/f
user=&amp;gt; (defn f [a] a)
WARNING: removed clojure.lang.IFn$LL from f
#'user/f
&lt;/code&gt;&lt;/pre&gt;
</description>
<category>Compiler</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15124/changing-type-tags-can-lead-to-cryptic-errors?show=15156#a15156</guid>
<pubDate>Fri, 03 Jul 2026 00:06:18 +0000</pubDate>
</item>
<item>
<title>Possibly avoidable identity call to force instance method on Class literals</title>
<link>https://ask.clojure.org/index.php/15155/possibly-avoidable-identity-force-instance-method-literals</link>
<description>&lt;p&gt;As of Clojure 1.13.0-alpha2, &lt;code&gt;(.method ClassName)&lt;/code&gt; expands to &lt;code&gt;(.method ^Class (identity ClassName))&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This is to force &lt;code&gt;(.method ClassName)&lt;/code&gt; to always be an instance method. Without this, it would expand to &lt;code&gt;(. ClassName method)&lt;/code&gt;, which may instead be interpreted as a static method.&lt;/p&gt;
&lt;p&gt;For example, &lt;code&gt;(.getMethods String)&lt;/code&gt; expands to &lt;code&gt;(.getMethods ^Class (identity String))&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This was introduced in these two commits:&lt;br&gt;
- &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/clojure/clojure/commit/f95175264df36c3d8fe2113aa9af92cda0f2f5c8&quot;&gt;force instance member interpretation of (.method ClassName), e.g. (.getMethods String) works&lt;/a&gt;&lt;br&gt;
- &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/clojure/clojure/commit/e45046da8f7fef82157b58af54d1ac6de8e31160&quot;&gt;added autohinting to Class in macroexpansion of (.instanceMethodOfClass Classname) calls&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Since then, Clojure has added support for qualified methods which we can use to reliably propagate the tag without any runtime changes. For example, expanding to &lt;code&gt;(Class/.getMethods String)&lt;/code&gt; is now equivalent to &lt;code&gt;(.getMethods ^Class (identity String))&lt;/code&gt; in terms of tag propagation.&lt;/p&gt;
&lt;p&gt;I have a proof-of-concept &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/frenchy64/clojure/pull/52/changes&quot;&gt;here&lt;/a&gt; that includes disassembled and decompiled output before and after the change. The net effect of using qualified methods in this case under direct linking is a removal of a single method call to &lt;code&gt;identity&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;   3: invokestatic  #20                 // Method clojure/core$identity.invokeStatic:(Ljava/lang/Object;)Ljava/lang/Object;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The effect is more substantial without direct linking (not included in the PR), with &lt;code&gt;clojure.core/identity&lt;/code&gt; also being added to the static initializer.&lt;/p&gt;
&lt;p&gt;I've also experimented with expanding to &lt;code&gt;(. (do String) getMethods)&lt;/code&gt; (see earlier commits in that PR), which seems to also work and might be another approach.&lt;/p&gt;
</description>
<category>Compiler</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15155/possibly-avoidable-identity-force-instance-method-literals</guid>
<pubDate>Thu, 02 Jul 2026 23:47:10 +0000</pubDate>
</item>
<item>
<title>error printed using pprint in clojure 1.13.0-alpha1</title>
<link>https://ask.clojure.org/index.php/15153/error-printed-using-pprint-in-clojure-1-13-0-alpha1</link>
<description>&lt;pre&gt;&lt;code&gt;❯ clj -Sdeps '{:deps {org.clojure/clojure {:mvn/version &quot;1.13.0-alpha1&quot;}}}'
Clojure 1.13.0-alpha1
user=&amp;gt; (clojure.pprint/pprint :foo)
Execution error (ClassCastException) at clojure.pprint.proxy$java.io.Writer$IDeref$PrettyFlush$4923d848/flush (REPL:-1).
class clojure.pprint.proxy$java.io.Writer$IDeref$PrettyFlush$4923d848 cannot be cast to class clojure.pprint.PrettyFlush (clojure.pprint.proxy$java.io.Writer$IDeref$PrettyFlush$4923d848 is in unnamed module of loader 'app'; clojure.pprint.PrettyFlush is in unnamed module of loader clojure.lang.DynamicClassLoader @36a58466)
:foo
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;reported by djblue in #clojure-dev&lt;/p&gt;
</description>
<category>Printing</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15153/error-printed-using-pprint-in-clojure-1-13-0-alpha1</guid>
<pubDate>Thu, 02 Jul 2026 20:22:36 +0000</pubDate>
</item>
<item>
<title>Syntax-quoted lists can return nil, differs from ClojureScript</title>
<link>https://ask.clojure.org/index.php/15152/syntax-quoted-lists-can-return-differs-from-clojurescript</link>
<description>&lt;p&gt;Syntax quoted lists can return &lt;code&gt;nil&lt;/code&gt; if only empty seqables are spliced into it:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Clojure 1.12.5
user=&amp;gt; `(~@[])
nil
user=&amp;gt; `(~@[] ~@[])
nil
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;However, the implementation then ensures syntax-quoted empty lists are not nil:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Clojure 1.12.5
user=&amp;gt; `()
()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ClojureScript returns an empty list in these cases:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;`(~@[])
=&amp;gt; ()
`(~@[] ~@[])
=&amp;gt; ()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The expansion of syntax quote itself is not necessarily a problem if it differs between platforms, but here the evaluation of the expansion differs. This can cause macros to behave differently between platforms (e.g., JVM Clojure vs bootstrapped cljs).&lt;/p&gt;
&lt;p&gt;This behavior seems to be present with all versions of Clojure &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/clojure/clojure/blob/f85444e6f890eb585e598efefdbd84727427e0a4/src/jvm/clojure/lang/LispReader.java#L731&quot;&gt;including 1.0.0&lt;/a&gt;, so perhaps the ship has sailed here. I went searching for an existing issue or documentation and AFAICT only &lt;a rel=&quot;nofollow&quot; href=&quot;https://clojure.atlassian.net/browse/CLJ-1425&quot;&gt;CLJ-1425&lt;/a&gt; mentions this oddity.&lt;/p&gt;
&lt;p&gt;The reference docs for &lt;a rel=&quot;nofollow&quot; href=&quot;https://clojure.org/reference/reader#syntax-quote&quot;&gt;Syntax Quote&lt;/a&gt; also seem to contradict this behavior:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;For Lists/Vectors/Sets/Maps, syntax-quote establishes a template of the corresponding data structure.&lt;/p&gt;
&lt;/blockquote&gt;
</description>
<category>Syntax and reader</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15152/syntax-quoted-lists-can-return-differs-from-clojurescript</guid>
<pubDate>Sun, 28 Jun 2026 20:43:55 +0000</pubDate>
</item>
<item>
<title>Answered: how to run a clojurescript repl</title>
<link>https://ask.clojure.org/index.php/15134/how-to-run-a-clojurescript-repl?show=15145#a15145</link>
<description>&lt;p&gt;This is covered in the QuickStart &lt;a rel=&quot;nofollow&quot; href=&quot;https://clojurescript.org/guides/quick-start&quot;&gt;https://clojurescript.org/guides/quick-start&lt;/a&gt; and there is a REPL category under Reference same as clojure.org.&lt;/p&gt;
&lt;p&gt;Anything we could do that would make this easier for you to find?&lt;/p&gt;
</description>
<category>ClojureScript</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15134/how-to-run-a-clojurescript-repl?show=15145#a15145</guid>
<pubDate>Wed, 17 Jun 2026 14:35:29 +0000</pubDate>
</item>
<item>
<title>Answered: clj risk of automatic dependency update causing RCE</title>
<link>https://ask.clojure.org/index.php/15140/clj-risk-of-automatic-dependency-update-causing-rce?show=15144#a15144</link>
<description>&lt;p&gt;There is no code execution performed during dependency downloads. So, done.&lt;/p&gt;
</description>
<category>Clojure CLI</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15140/clj-risk-of-automatic-dependency-update-causing-rce?show=15144#a15144</guid>
<pubDate>Tue, 16 Jun 2026 20:30:50 +0000</pubDate>
</item>
<item>
<title>Answered: Why is aset at least 25 times faster than aset-long?</title>
<link>https://ask.clojure.org/index.php/15138/why-is-aset-at-least-25-times-faster-than-aset-long?show=15139#a15139</link>
<description>&lt;p&gt;We’ve spent a bunch of time on this and got into some surprising places with it. I am very much hoping all these set functions will be rewritten in next release.&lt;/p&gt;
</description>
<category>Clojure</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15138/why-is-aset-at-least-25-times-faster-than-aset-long?show=15139#a15139</guid>
<pubDate>Mon, 15 Jun 2026 17:05:19 +0000</pubDate>
</item>
<item>
<title>Answered: Why do literal vectors ignore type hinting?</title>
<link>https://ask.clojure.org/index.php/15136/why-do-literal-vectors-ignore-type-hinting?show=15137#a15137</link>
<description>&lt;p&gt;Literal collections are tagged as IPersistentVector, IPersistentMap, etc and as constant expressions won’t preserve type hints. It is better here to use the new qualified method syntax with param-tags hints if needed.&lt;/p&gt;
</description>
<category>Clojure</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15136/why-do-literal-vectors-ignore-type-hinting?show=15137#a15137</guid>
<pubDate>Sun, 14 Jun 2026 23:09:31 +0000</pubDate>
</item>
<item>
<title>Consider including a built-in wrapper around `java.net.http.HttpClient` in future versions of Clojure</title>
<link>https://ask.clojure.org/index.php/15129/consider-including-wrapper-around-httpclient-versions-clojure</link>
<description>&lt;p&gt;Java 9 introduced &lt;code&gt;java.net.http.HttpClient&lt;/code&gt;[1] with support for HTTP/1.1, HTTP/2 as well as WebSocket along with other features. It was later standardized in Java 11[2] and has become one of the top picks for Java programs. The latest version of the HTTP client shipped with Java 26 also added support for HTTP/3.[3] &lt;/p&gt;
&lt;p&gt;It would be nice for future versions of Clojure that are based on Java 11+ to include a new namespace with wrapper functions around &lt;code&gt;java.net.http.HttpClient&lt;/code&gt; to make it easier (without all the OOP ceremonies) to work with HTTP in Clojure programs out of the box without relying on any 3rd-party libraries.&lt;/p&gt;
&lt;p&gt;Examples of prior art:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/gnarroway/hato&quot;&gt;https://github.com/gnarroway/hato&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/schmee/java-http-clj&quot;&gt;https://github.com/schmee/java-http-clj&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/babashka/http-client&quot;&gt;https://github.com/babashka/http-client&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://central.sonatype.com/artifact/com.cognitect/http-client&quot;&gt;https://central.sonatype.com/artifact/com.cognitect/http-client&lt;/a&gt;&lt;br&gt;
(upcoming?)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;[1] &lt;a rel=&quot;nofollow&quot; href=&quot;https://openjdk.org/jeps/110&quot;&gt;https://openjdk.org/jeps/110&lt;/a&gt;&lt;br&gt;
[2] &lt;a rel=&quot;nofollow&quot; href=&quot;https://openjdk.org/jeps/321&quot;&gt;https://openjdk.org/jeps/321&lt;/a&gt;&lt;br&gt;
[3] &lt;a rel=&quot;nofollow&quot; href=&quot;https://openjdk.org/jeps/517&quot;&gt;https://openjdk.org/jeps/517&lt;/a&gt;&lt;/p&gt;
</description>
<category>Java Interop</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15129/consider-including-wrapper-around-httpclient-versions-clojure</guid>
<pubDate>Mon, 08 Jun 2026 01:37:14 +0000</pubDate>
</item>
<item>
<title>Answered: Object.clone() confusion</title>
<link>https://ask.clojure.org/index.php/15125/object-clone-confusion?show=15128#a15128</link>
<description>&lt;p&gt;clone() is a protected method - you should generally not call it on an arbitrary object.  In Java, you can't even make that call, you'll get &quot;clone() has protected access in java.lang.Object&quot;. It's a quirk of Clojure's impl that it even makes it possible via reflection. &lt;/p&gt;
&lt;p&gt;So, my suggestion is to not call clone() at all. There are many, many reasons clone() is problematic and considered one of the more questionable features of Java's early design.&lt;/p&gt;
</description>
<category>Clojure</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15125/object-clone-confusion?show=15128#a15128</guid>
<pubDate>Sat, 06 Jun 2026 00:06:59 +0000</pubDate>
</item>
<item>
<title>Request: allow a user function to be specified as the target of clojure.main/report-error</title>
<link>https://ask.clojure.org/index.php/15120/request-allow-function-specified-target-clojure-report-error</link>
<description>&lt;p&gt;The three current targets (&lt;code&gt;file&lt;/code&gt;, &lt;code&gt;none&lt;/code&gt;, &lt;code&gt;stderr&lt;/code&gt;) all serialize all of the error data to a string. During development, it would be convenient to be able to define a function that is called with the exception instance. This function might capture additional application state, or open a window in the user's editor, etc.&lt;/p&gt;
&lt;p&gt;Note that it is not possible to work around this by replacing &lt;code&gt;report-error&lt;/code&gt; itself because the entire clojure.main namespace is AOT-compiled, so &lt;code&gt;alter-var-root&lt;/code&gt; has no effect.&lt;/p&gt;
&lt;p&gt;See &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/clojure-emacs/cider/issues/3850&quot;&gt;https://github.com/clojure-emacs/cider/issues/3850&lt;/a&gt; for an example where this feature would be helpful.&lt;/p&gt;
&lt;p&gt;Related Slack thread: &lt;a rel=&quot;nofollow&quot; href=&quot;https://clojurians.slack.com/archives/C03S1KBA2/p1779991120304049&quot;&gt;https://clojurians.slack.com/archives/C03S1KBA2/p1779991120304049&lt;/a&gt;&lt;/p&gt;
</description>
<category>Clojure</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15120/request-allow-function-specified-target-clojure-report-error</guid>
<pubDate>Tue, 02 Jun 2026 23:53:32 +0000</pubDate>
</item>
<item>
<title>Answered: :or destructuring doesn't update object</title>
<link>https://ask.clojure.org/index.php/13141/or-destructuring-doesnt-update-object?show=15118#a15118</link>
<description>&lt;p&gt;I logged an improvement request for this here, happy to collect more ideas here. &lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://clojure.atlassian.net/browse/CLJ-2957&quot;&gt;https://clojure.atlassian.net/browse/CLJ-2957&lt;/a&gt;&lt;/p&gt;
</description>
<category>Clojure</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/13141/or-destructuring-doesnt-update-object?show=15118#a15118</guid>
<pubDate>Mon, 01 Jun 2026 17:45:30 +0000</pubDate>
</item>
<item>
<title>Answered: `eval` using functions with metadata</title>
<link>https://ask.clojure.org/index.php/15115/eval-using-functions-with-metadata?show=15116#a15116</link>
<description>&lt;p&gt;You're eval'ing + to a function object there when it seems like you should be staying in symbol land:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;user=&amp;gt; (eval (list (with-meta '+ {}) 1 2))
3
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A function object itself is not Clojure data (other than opaquely as an object). When working symbolically, you should stay in symbols.&lt;/p&gt;
&lt;p&gt;There are some places where the compiler uses an escape hatch of print + read-eval (&lt;code&gt;#=&lt;/code&gt;) to recover custom types (sorted maps and sets), but I'd consider that implementation details, not something you as a user should be doing generally.&lt;/p&gt;
</description>
<category>Syntax and reader</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15115/eval-using-functions-with-metadata?show=15116#a15116</guid>
<pubDate>Mon, 01 Jun 2026 16:31:28 +0000</pubDate>
</item>
<item>
<title>Answered: Should reduce-kv support String?</title>
<link>https://ask.clojure.org/index.php/15109/should-reduce-kv-support-string?show=15110#a15110</link>
<description>&lt;p&gt;Interesting idea! Logged as &lt;a rel=&quot;nofollow&quot; href=&quot;https://clojure.atlassian.net/browse/CLJ-2956&quot;&gt;https://clojure.atlassian.net/browse/CLJ-2956&lt;/a&gt;&lt;/p&gt;
</description>
<category>Protocols</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15109/should-reduce-kv-support-string?show=15110#a15110</guid>
<pubDate>Fri, 29 May 2026 21:21:22 +0000</pubDate>
</item>
<item>
<title>Consider allowing passing two arguments to sets used as functions</title>
<link>https://ask.clojure.org/index.php/15104/consider-allowing-passing-two-arguments-sets-used-functions</link>
<description>&lt;p&gt;Similar to how &lt;code&gt;get&lt;/code&gt; works with the 3rd &lt;code&gt;not-found&lt;/code&gt; argument.&lt;/p&gt;
&lt;p&gt;It already works in CLJS:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ClojureScript 1.12.116
cljs.user=&amp;gt; (#{:a} :b :c)
:c
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In Clojure, it errors out:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Clojure 1.12.0
user=&amp;gt; (#{:a} :b :c)
Execution error (ArityException) at user/eval1 (REPL:1).
Wrong number of args (2) passed to: clojure.lang.PersistentHashSet
&lt;/code&gt;&lt;/pre&gt;
</description>
<category>Clojure</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15104/consider-allowing-passing-two-arguments-sets-used-functions</guid>
<pubDate>Tue, 26 May 2026 13:44:16 +0000</pubDate>
</item>
<item>
<title>Answered: gitlibs/tags throws a NPE if the repository has no tags</title>
<link>https://ask.clojure.org/index.php/15094/gitlibs-tags-throws-a-npe-if-the-repository-has-no-tags?show=15101#a15101</link>
<description>&lt;p&gt;Thanks! Fixed in tools.gitlibs 2.6.217.&lt;/p&gt;
</description>
<category>Tools</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15094/gitlibs-tags-throws-a-npe-if-the-repository-has-no-tags?show=15101#a15101</guid>
<pubDate>Sun, 24 May 2026 21:02:21 +0000</pubDate>
</item>
<item>
<title>Answered: The behavior of `filter` on infinite sequences in Transducers</title>
<link>https://ask.clojure.org/index.php/15095/the-behavior-of-filter-on-infinite-sequences-in-transducers?show=15096#a15096</link>
<description>&lt;p&gt;&lt;code&gt;take&lt;/code&gt; converts its collection argument into a seq, and making a seq out of an eduction is done via the &lt;code&gt;java.lang.Iterable&lt;/code&gt; route. That route moves the data around in chunks of size 32. So &lt;code&gt;(take ... (eduction ...))&lt;/code&gt; will try to fetch 32 elements regardless of the number passed to &lt;code&gt;take&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;So, it's not about transducers, it's about how eduction and converting it into a seq work.&lt;/p&gt;
&lt;p&gt;You'll see the same behavior with &lt;code&gt;sequence&lt;/code&gt; - but that's because it creates a chunked sequence internally.&lt;/p&gt;
</description>
<category>Transducers</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15095/the-behavior-of-filter-on-infinite-sequences-in-transducers?show=15096#a15096</guid>
<pubDate>Sun, 24 May 2026 08:31:02 +0000</pubDate>
</item>
<item>
<title>Answered: Can 'write-pom' in tools.build support providing additional dependencies in the pom.xml with scope 'provided'?</title>
<link>https://ask.clojure.org/index.php/12817/tools-support-providing-additional-dependencies-provided?show=15093#a15093</link>
<description>&lt;p&gt;&lt;code&gt;tools.build&lt;/code&gt; supports &lt;code&gt;:optional true&lt;/code&gt; in a dependency, which adds &lt;code&gt;&amp;lt;optional&amp;gt;true&amp;lt;/optional&amp;gt;&lt;/code&gt; to &lt;code&gt;pom.xml&lt;/code&gt; and &lt;a rel=&quot;nofollow&quot; href=&quot;https://cljdoc.org&quot;&gt;https://cljdoc.org&lt;/a&gt; fetches the dependency, so analysis works, but the dependency does not get pulled in as a transitive dep for &quot;normal&quot; project usage.&lt;/p&gt;
&lt;p&gt;See my &lt;code&gt;rephrase&lt;/code&gt; project for an example of this working:&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/seancorfield/rephrase/blob/main/deps.edn#L4-L6&quot;&gt;https://github.com/seancorfield/rephrase/blob/main/deps.edn#L4-L6&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt; :aliases
 {:optional
  {:extra-deps {nrepl/nrepl {:mvn/version &quot;1.7.0&quot; :optional true}}}
  ...&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/seancorfield/rephrase/blob/main/build.clj#L34&quot;&gt;https://github.com/seancorfield/rephrase/blob/main/build.clj#L34&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt; :basis     (b/create-basis {:aliases [:optional]})&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;(used for the &lt;code&gt;write-pom&lt;/code&gt; call)&lt;/p&gt;
&lt;p&gt;Doesn't show up when used via &lt;code&gt;deps.edn&lt;/code&gt;:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;clojure -Spath -Sforce -Sdeps '{:deps {org.corfield/rephrase {:mvn/version &quot;1.0.2&quot;}}}'
src:/home/sean/.m2/repository/org/clojure/clojure/1.12.5/clojure-1.12.5.jar:/home/sean/.m2/repository/org/corfield/rephrase/1.0.2/rephrase-1.0.2.jar:/home/sean/.m2/repository/org/clojure/core.specs.alpha/0.4.74/core.specs.alpha-0.4.74.jar:/home/sean/.m2/repository/org/clojure/spec.alpha/0.5.238/spec.alpha-0.5.238.jar&lt;/code&gt;&lt;/p&gt;
</description>
<category>tools.build</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/12817/tools-support-providing-additional-dependencies-provided?show=15093#a15093</guid>
<pubDate>Thu, 21 May 2026 21:36:50 +0000</pubDate>
</item>
<item>
<title>Answered: core.unify does not preserve want-occurs? in recursive unify-variable calls</title>
<link>https://ask.clojure.org/index.php/15082/core-unify-preserve-occurs-recursive-unify-variable-calls?show=15089#a15089</link>
<description>&lt;p&gt;Thanks for the report. Definitely not intentional.&lt;/p&gt;
&lt;p&gt;Logged at &lt;a rel=&quot;nofollow&quot; href=&quot;https://clojure.atlassian.net/browse/UNIFY-12&quot;&gt;https://clojure.atlassian.net/browse/UNIFY-12&lt;/a&gt;&lt;/p&gt;
</description>
<category>core.unify</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15082/core-unify-preserve-occurs-recursive-unify-variable-calls?show=15089#a15089</guid>
<pubDate>Tue, 19 May 2026 20:32:36 +0000</pubDate>
</item>
<item>
<title>Answered: linux installer fails for non english locale</title>
<link>https://ask.clojure.org/index.php/15081/linux-installer-fails-for-non-english-locale?show=15088#a15088</link>
<description>&lt;p&gt;Logged as &lt;a rel=&quot;nofollow&quot; href=&quot;https://clojure.atlassian.net/browse/TDEPS-280&quot;&gt;https://clojure.atlassian.net/browse/TDEPS-280&lt;/a&gt;, definitely will fix!&lt;/p&gt;
</description>
<category>Tools</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15081/linux-installer-fails-for-non-english-locale?show=15088#a15088</guid>
<pubDate>Tue, 19 May 2026 19:59:16 +0000</pubDate>
</item>
<item>
<title>Answered: Can clojure builds be reproducible? (new Debian forky requirement)</title>
<link>https://ask.clojure.org/index.php/15083/can-clojure-builds-reproducible-debian-forky-requirement?show=15087#a15087</link>
<description>&lt;p&gt;Reproducible compilation is not currently a priority for us. But happy to leave this open to hear more reasons why that is important and collect votes.&lt;/p&gt;
</description>
<category>Clojure</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15083/can-clojure-builds-reproducible-debian-forky-requirement?show=15087#a15087</guid>
<pubDate>Tue, 19 May 2026 19:56:55 +0000</pubDate>
</item>
<item>
<title>Answered: `(:k m)` returns `nil` while `(identical? (first (keys m)) :k)` is `true` — two coexisting `Keyword` instances?</title>
<link>https://ask.clojure.org/index.php/15073/returns-while-identical-first-coexisting-keyword-instances?show=15078#a15078</link>
<description>&lt;p&gt;It might also be interesting to know if you are getting a null due to not-found key vs null value in the map. You could supply a not-found arg on (:payload result :NOT-FOUND) to distinguish.&lt;/p&gt;
&lt;p&gt;Have you recently updated Clojure?&lt;/p&gt;
&lt;p&gt;Is this problem reproducible such that you could try it again with different code, deps, etc?&lt;/p&gt;
&lt;p&gt;Keyword invocation uses special call sites and the compiler code for that changed in Clojure 1.12.3, so I would be interested in whether the behavior changes if you use Clojure 1.12.2. &lt;/p&gt;
&lt;p&gt;Or alternately, does the behavior change if you modify the code from &lt;code&gt;(:payload result)&lt;/code&gt; to &lt;code&gt;(get result :payload)&lt;/code&gt;.&lt;/p&gt;
</description>
<category>Clojure</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15073/returns-while-identical-first-coexisting-keyword-instances?show=15078#a15078</guid>
<pubDate>Mon, 11 May 2026 16:12:27 +0000</pubDate>
</item>
<item>
<title>Answered: Reflection warning when long hint on an argument</title>
<link>https://ask.clojure.org/index.php/15067/reflection-warning-when-long-hint-on-an-argument?show=15068#a15068</link>
<description>&lt;p&gt;It's the same thing as in &lt;a rel=&quot;nofollow&quot; href=&quot;https://ask.clojure.org/index.php/13501/primitive-type-hints-arguments-turns-the-return-value-object&quot;&gt;https://ask.clojure.org/index.php/13501/primitive-type-hints-arguments-turns-the-return-value-object&lt;/a&gt;.&lt;/p&gt;
</description>
<category>Java Interop</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15067/reflection-warning-when-long-hint-on-an-argument?show=15068#a15068</guid>
<pubDate>Fri, 01 May 2026 21:12:15 +0000</pubDate>
</item>
</channel>
</rss>