<?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>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>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</link>
<description>&lt;p&gt;It is not possible to tell &lt;code&gt;tools.build&lt;/code&gt; to copy files without substitution for a custom set of file extensions because the &lt;code&gt;copy&lt;/code&gt; function does not actually use its parameter (&lt;code&gt;non-replaced-exts&lt;/code&gt;) - it always uses &lt;code&gt;default-non-replaced-exts&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(defn copy
  [{:keys [target-dir src-dirs include replace ignores non-replaced-exts]
    :or {include &quot;**&quot;, ignores default-ignores, non-replaced-exts default-non-replaced-exts}
    :as _params}]
  (let [to-path (.toPath (file/ensure-dir (api/resolve-path target-dir)))
        ignore-regexes (map re-pattern ignores)
        non-replaced (map #(str &quot;.&quot; %) default-non-replaced-exts)]
  ...)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The binding &lt;code&gt;non-replaced-exts&lt;/code&gt; exists and defaults to &lt;code&gt;default-non-replaced-exts&lt;/code&gt; but the function body never uses &lt;code&gt;non-replaced-exts&lt;/code&gt;: it has &lt;code&gt;default-non-replaced-exts&lt;/code&gt; hardcoded.&lt;/p&gt;
&lt;p&gt;A new feature in the next version of &lt;code&gt;deps-new&lt;/code&gt; depends on this working correctly.&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</guid>
<pubDate>Sun, 02 Aug 2026 15:39:16 +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>
<item>
<title>Default implementation of AsElements to treat numbers as numbers, not strings</title>
<link>https://ask.clojure.org/index.php/15060/default-implementation-aselements-numbers-numbers-strings</link>
<description>&lt;p&gt;I'm slowly converting some code from using &lt;code&gt;xml/element&lt;/code&gt; to &lt;code&gt;xml/sexp-as-element&lt;/code&gt;, and I've noticed a discrepancy. &lt;code&gt;xml/element&lt;/code&gt; does (almost) no processing of the &quot;content&quot;, inserting it directly (unless it's &lt;code&gt;nil&lt;/code&gt;). &lt;code&gt;xml/sexp-as-element&lt;/code&gt; calls &lt;code&gt;(str)&lt;/code&gt; on the &quot;content&quot; if it's not seq of some kind (vector or ISeq) or a keyword. This means that &lt;code&gt;(= (xml/element :foo {} 1) (xml/sexp-as-element [:foo 1]))&lt;/code&gt; is false.&lt;/p&gt;
&lt;p&gt;There are probably other differences, but this one seems relatively big, as there's no way to use numbers in &lt;code&gt;xml/sexp-as-element&lt;/code&gt; without calling &lt;code&gt;extend-protocol&lt;/code&gt; yourself.&lt;/p&gt;
&lt;p&gt;May I recommend/request adding this extension? It will make &lt;code&gt;xml/sexp-as-element&lt;/code&gt; match &lt;code&gt;xml/element&lt;/code&gt; for numbers, and make &lt;code&gt;xml/sexp-as-element&lt;/code&gt; match hiccup in general.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(extend-protocol clojure.data.xml.protocols/AsElements
  java.lang.Number
  (as-elements [n] [n]))
&lt;/code&gt;&lt;/pre&gt;
</description>
<category>data.xml</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15060/default-implementation-aselements-numbers-numbers-strings</guid>
<pubDate>Tue, 28 Apr 2026 16:10:26 +0000</pubDate>
</item>
<item>
<title>Answered: Installing Clojure on IPv6-only machine</title>
<link>https://ask.clojure.org/index.php/15051/installing-clojure-on-ipv6-only-machine?show=15053#a15053</link>
<description>&lt;p&gt;I haven't double-checked this but it seems that repo1.maven.org is IPv4-only, so you can't download artifacts from your IPv6-only server.&lt;/p&gt;
&lt;p&gt;However, Sonatype offer &lt;a rel=&quot;nofollow&quot; href=&quot;https://ipv6.repo1.maven.org/maven2&quot;&gt;https://ipv6.repo1.maven.org/maven2&lt;/a&gt; for IPv6.&lt;/p&gt;
&lt;p&gt;I don't know whether you can override the Maven Central URL that the Clojure CLI uses -- because it knows about Maven and Clojars internally and checks them in order first, for security reasons.&lt;/p&gt;
&lt;p&gt;Hopefully, Alex will chime in on this.&lt;/p&gt;
</description>
<category>Tools</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15051/installing-clojure-on-ipv6-only-machine?show=15053#a15053</guid>
<pubDate>Sat, 25 Apr 2026 00:45:08 +0000</pubDate>
</item>
<item>
<title>Answered: Porting .NET 4.8 application using Clojure CLR to .NET 8</title>
<link>https://ask.clojure.org/index.php/14187/porting-net-4-8-application-using-clojure-clr-to-net-8?show=15048#a15048</link>
<description>&lt;p&gt;&lt;code&gt;clojure.core/load&lt;/code&gt; calls &lt;code&gt;RT.load&lt;/code&gt; as seen in the stack trace.&lt;br&gt;
The set of probe paths for &lt;code&gt;RT.load&lt;/code&gt; is&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the directory of the domain of the thread that is running (domains really being more relevant to .NET Framework at this point)&lt;/li&gt;
&lt;li&gt;the current directory&lt;/li&gt;
&lt;li&gt;the directory where Clojure.dll is located&lt;/li&gt;
&lt;li&gt;the directory of the entry assembly&lt;/li&gt;
&lt;li&gt;all directories listed as the value of the environment variable &lt;code&gt;CLOJURE_LOAD_PATH&lt;/code&gt;&lt;ul&gt;
&lt;li&gt;this is equivalent to the classpath in Java-land.&lt;/li&gt;
&lt;li&gt;separator character is &lt;code&gt;System.IO.Path.PathSeparator&lt;/code&gt;  (&lt;code&gt;;&lt;/code&gt; on Windows)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Clearly this is not sufficiently documented.  Will work on that.&lt;/p&gt;
</description>
<category>ClojureCLR</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/14187/porting-net-4-8-application-using-clojure-clr-to-net-8?show=15048#a15048</guid>
<pubDate>Thu, 23 Apr 2026 04:55:40 +0000</pubDate>
</item>
<item>
<title>Answered: Does Clojure have an anti LLM code contributions policy? Would it make sense for Clojure to adopt one?</title>
<link>https://ask.clojure.org/index.php/15004/clojure-contributions-policy-would-make-sense-clojure-adopt?show=15036#a15036</link>
<description>&lt;p&gt;We've added a statement in this regard to several pages on the site to clarify what is allowed under the Clojure contributor agreement.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://clojure.org/dev/contributor_agreement#_no_generated_code&quot;&gt;https://clojure.org/dev/contributor_agreement#_no_generated_code&lt;/a&gt;&lt;/p&gt;
</description>
<category>Meta</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15004/clojure-contributions-policy-would-make-sense-clojure-adopt?show=15036#a15036</guid>
<pubDate>Mon, 06 Apr 2026 13:24:09 +0000</pubDate>
</item>
<item>
<title>Answered: Optimize `eduction`</title>
<link>https://ask.clojure.org/index.php/15027/optimize-eduction?show=15033#a15033</link>
<description>&lt;p&gt;Logged as &lt;a rel=&quot;nofollow&quot; href=&quot;https://clojure.atlassian.net/browse/CLJ-2953&quot;&gt;https://clojure.atlassian.net/browse/CLJ-2953&lt;/a&gt;&lt;/p&gt;
</description>
<category>Transducers</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15027/optimize-eduction?show=15033#a15033</guid>
<pubDate>Sun, 05 Apr 2026 21:50:04 +0000</pubDate>
</item>
<item>
<title>Answered: &quot;Nested&quot; vs &quot;lateral&quot; exception causes</title>
<link>https://ask.clojure.org/index.php/15031/nested-vs-lateral-exception-causes?show=15032#a15032</link>
<description>&lt;p&gt;I'm not sure this problem is common enough to warrant solving in core or extending the existing ex-info. If you are trying to throw a map bundling multiple exceptions, this really seems like a data problem more than an exception problem, and we have plenty of ways to bundle data into the ex map.&lt;/p&gt;
&lt;p&gt;In Java, the typical solution for (one) lateral exception is to use &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutionException.html&quot;&gt;ExecutionException&lt;/a&gt;, doesn't handle multiple though.&lt;/p&gt;
</description>
<category>Errors</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15031/nested-vs-lateral-exception-causes?show=15032#a15032</guid>
<pubDate>Sun, 05 Apr 2026 21:46:32 +0000</pubDate>
</item>
<item>
<title>Answered: Destructuring {:as opts} unexpected behaviour with seq</title>
<link>https://ask.clojure.org/index.php/15028/destructuring-as-opts-unexpected-behaviour-with-seq?show=15029#a15029</link>
<description>&lt;p&gt;A lot of this can be broadly considered &quot;garbage-in, garbage-out&quot;. &lt;code&gt;{:as opts}&lt;/code&gt; is map destructuring and so if you give it a non-map, you'll get undefined behavior.&lt;/p&gt;
&lt;p&gt;In particular, try these expressions on Clojure 1.10 and you'll see that many of them throw exceptions.&lt;/p&gt;
&lt;p&gt;Clojure 1.11 introduced a new meaning for some key/value destructuring -- see &lt;a rel=&quot;nofollow&quot; href=&quot;https://clojure.org/news/2021/03/18/apis-serving-people-and-programs&quot;&gt;https://clojure.org/news/2021/03/18/apis-serving-people-and-programs&lt;/a&gt; -- which changed the undefined behavior, in order to support new use cases.&lt;/p&gt;
&lt;p&gt;Bottom line: pass a non-map to map destructuring and you are in undefined behavior territory. It just happened to change between 1.10 and 1.11 so that some cases that threw exceptions now just produce &quot;junk&quot; instead.&lt;/p&gt;
</description>
<category>Sequences</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15028/destructuring-as-opts-unexpected-behaviour-with-seq?show=15029#a15029</guid>
<pubDate>Sun, 05 Apr 2026 02:22:50 +0000</pubDate>
</item>
<item>
<title>Missing protocol error will hang on infinite `(range)` input in ClojureScript but not Clojure</title>
<link>https://ask.clojure.org/index.php/15026/missing-protocol-error-infinite-range-clojurescript-clojure</link>
<description>&lt;p&gt;functions like &lt;code&gt;transient&lt;/code&gt;, &lt;code&gt;assoc&lt;/code&gt;, etc  will throw helpful missing-protocol error when receiving invalid input but it will hang if it receives infinite &lt;code&gt;(range)&lt;/code&gt;.&lt;br&gt;
this is related to issue below&lt;br&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;https://ask.clojure.org/index.php/14578/even-range-hangs?show=14578#q14578&quot;&gt;https://ask.clojure.org/index.php/14578/even-range-hangs?show=14578#q14578&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;however, missing-protocol only hang in clojurescript but not clojure so I am wondering if this difference is intended.&lt;/p&gt;
&lt;p&gt;example calls that should throws&lt;br&gt;
- &lt;code&gt;(transient (range))&lt;/code&gt;&lt;br&gt;
- &lt;code&gt;(assoc (range) :a 1)&lt;/code&gt;&lt;/p&gt;
</description>
<category>ClojureScript</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15026/missing-protocol-error-infinite-range-clojurescript-clojure</guid>
<pubDate>Fri, 03 Apr 2026 11:16:47 +0000</pubDate>
</item>
<item>
<title>Answered: requiring an empty .clj without an alias should fail as with an alias</title>
<link>https://ask.clojure.org/index.php/15022/requiring-an-empty-clj-without-alias-should-fail-with-alias?show=15023#a15023</link>
<description>&lt;p&gt;Logged:&lt;br&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;https://clojure.atlassian.net/browse/CLJ-2951&quot;&gt;https://clojure.atlassian.net/browse/CLJ-2951&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;And one for compile:&lt;br&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;https://clojure.atlassian.net/browse/CLJ-2952&quot;&gt;https://clojure.atlassian.net/browse/CLJ-2952&lt;/a&gt;&lt;/p&gt;
</description>
<category>Clojure</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15022/requiring-an-empty-clj-without-alias-should-fail-with-alias?show=15023#a15023</guid>
<pubDate>Thu, 02 Apr 2026 20:41:10 +0000</pubDate>
</item>
<item>
<title>Answered: Is taggedliteral's equality check inefficient?</title>
<link>https://ask.clojure.org/index.php/15002/is-taggedliterals-equality-check-inefficient?show=15020#a15020</link>
<description>&lt;p&gt;Logged as &lt;a rel=&quot;nofollow&quot; href=&quot;https://clojure.atlassian.net/browse/CLJ-2950&quot;&gt;https://clojure.atlassian.net/browse/CLJ-2950&lt;/a&gt;&lt;/p&gt;
</description>
<category>Records and Types</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15002/is-taggedliterals-equality-check-inefficient?show=15020#a15020</guid>
<pubDate>Tue, 31 Mar 2026 19:58:35 +0000</pubDate>
</item>
<item>
<title>Answered: Optimized str function</title>
<link>https://ask.clojure.org/index.php/14990/optimized-str-function?show=15003#a15003</link>
<description>&lt;p&gt;I've done some &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/bsless/prrr&quot;&gt;independent exploration&lt;/a&gt; of the options space for optimizing &lt;code&gt;str&lt;/code&gt; which does not involve anything ground shattering but still gives good performance improvements&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;variadic arities (up to 20, yuck) will probably give the best performance. Can settle for common cases like up to 5  (apply str will still suck but whatever)&lt;/li&gt;
&lt;li&gt;using reduce instead of a loop (would probably require redefining str or providing a str1 with the old impl for bootstrap purposes)&lt;/li&gt;
&lt;li&gt;using inline meta, orthogonal to all other options&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Additionally, having a function like &lt;code&gt;str&lt;/code&gt; which only takes a sequence and reduces over it could provide a better code path than (apply str xs)&lt;/p&gt;
&lt;p&gt;Similar work has been done in &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/joinr/spork/blob/master/src/spork/util/general.clj#L835&quot;&gt;spork&lt;/a&gt; and &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/kumarshantanu/stringer&quot;&gt;stringer&lt;/a&gt;&lt;/p&gt;
</description>
<category>Sequences</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/14990/optimized-str-function?show=15003#a15003</guid>
<pubDate>Sun, 29 Mar 2026 08:47:19 +0000</pubDate>
</item>
</channel>
</rss>