<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>Clojure Q&amp;A - Recent activity</title>
<link>https://ask.clojure.org/index.php/activity</link>
<description></description>
<item>
<title>Commented: `(: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=15079#c15079</link>
<description>Thank you for the response, Alex — really appreciate it.&lt;br /&gt;
&lt;br /&gt;
Clojure upgrade:&lt;br /&gt;
We jumped from Clojure 1.11.1 to 1.12.4 on 2025-12-22. Same commit also moved us from JDK 17 to JDK 25 with virtual threads. The bug investigation started around March 2026, so there's roughly a 2 month gap between the upgrade and our first reports though it's possible the bug existed earlier and went unnoticed.&lt;br /&gt;
&lt;br /&gt;
Reproducibility:&lt;br /&gt;
Not manually. But we see this happening about 1 to 3 times a week. We have 10 instances running and handling roughly the same amount of workload, but the bug suddenly starts on one of the instances and then doesn't stop. We haven't been able to identify any patterns. It seems quite random.&lt;br /&gt;
&lt;br /&gt;
Experiments we will try:&lt;br /&gt;
1. (:payload result :NOT-FOUND)&lt;br /&gt;
2. (get result :payload) vs (:payload result)&lt;br /&gt;
&lt;br /&gt;
Since the bug isn't manually reproducible and nREPL recompile fixes it for the affected instance, each experiment needs a new release, and a probabilistic waiting window of ~1 week before we can claim a result with any confidence. We will do both the experiments above in a single release.&lt;br /&gt;
&lt;br /&gt;
Depending on the results from the first two experiments, we will also consider downgrading Clojure to 1.12.2 and seeing if that fixes the issue.&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
Given that your hypothesis points at the keyword call-site compilation rather than at duplicate interned instances, would logging `System/identityHashCode` of the :payload literal and payload-key still be a useful diagnostic to add? Or does the call-site explanation make it largely irrelevant?&lt;br /&gt;
&lt;br /&gt;
I'll report back as soon as we have signal — likely within a week. Thank you again.</description>
<category>Clojure</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15073/returns-while-identical-first-coexisting-keyword-instances?show=15079#c15079</guid>
<pubDate>Tue, 12 May 2026 06:06:08 +0000</pubDate>
</item>
<item>
<title>Answer selected: 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, 08 May 2026 10:11:04 +0000</pubDate>
</item>
<item>
<title>Comment edited: Do primitive type hints in fn arguments turns the return value as an Object?</title>
<link>https://ask.clojure.org/index.php/13501/primitive-type-hints-arguments-turns-the-return-value-object?show=15071#c15071</link>
<description>Indeed @alexmiller, it seems the same issue as &lt;a href=&quot;https://ask.clojure.org/index.php/15067/reflection-warning-when-long-hint-on-an-argument&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://ask.clojure.org/index.php/15067/reflection-warning-when-long-hint-on-an-argument&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Was there any reason why this didn't go forward? Is it more involved than a simple bugfix? Asking because I cannot see the ticket.</description>
<category>Java Interop</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/13501/primitive-type-hints-arguments-turns-the-return-value-object?show=15071#c15071</guid>
<pubDate>Sat, 02 May 2026 11:07:04 +0000</pubDate>
</item>
<item>
<title>Commented: 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?show=15066#c15066</link>
<description>That was my first reaction as well. Seems like content should generally be considered as a string, so maybe it's the xml/element constructor doing the wrong thing here.</description>
<category>data.xml</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15060/default-implementation-aselements-numbers-numbers-strings?show=15066#c15066</guid>
<pubDate>Thu, 30 Apr 2026 12:28:22 +0000</pubDate>
</item>
<item>
<title>Commented: 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=15063#c15063</link>
<description>System.Text.Json comes in only as a transitive dependency. &amp;nbsp;Not sure what other libs require it -- could be several. &amp;nbsp;Installed version is 10.0.7. &amp;nbsp;Could be a version issue? &amp;nbsp;Not sure how to even figure these things out in your scenario. &amp;nbsp;(I had to do some serious tweaking to get all the right libraries in place for my little C++ console app.)</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=15063#c15063</guid>
<pubDate>Wed, 29 Apr 2026 02:52:51 +0000</pubDate>
</item>
<item>
<title>Commented: Installing Clojure on IPv6-only machine</title>
<link>https://ask.clojure.org/index.php/15051/installing-clojure-on-ipv6-only-machine?show=15055#c15055</link>
<description>Yeah, between Maven's regular repo URL and Clojars and GitHub all not offering IPv6, I don't know how far you're going to get.</description>
<category>Tools</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15051/installing-clojure-on-ipv6-only-machine?show=15055#c15055</guid>
<pubDate>Sat, 25 Apr 2026 01:16:16 +0000</pubDate>
</item>
<item>
<title>Commented: 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=15046#c15046</link>
<description>I think &amp;quot;Code generated by a large language model ...&amp;quot; would include LLM auto complete.</description>
<category>Meta</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15004/clojure-contributions-policy-would-make-sense-clojure-adopt?show=15046#c15046</guid>
<pubDate>Mon, 13 Apr 2026 14:53:13 +0000</pubDate>
</item>
<item>
<title>Commented: Allow multiple bindings for if-let, when-let, if-some, and when-some</title>
<link>https://ask.clojure.org/index.php/3786/allow-multiple-bindings-for-if-let-when-let-some-and-when-some?show=15043#c15043</link>
<description>I would like to improve Issue 2213 as follows. Do you think, this makes sense?&lt;br /&gt;
&lt;br /&gt;
The new description would be:&lt;br /&gt;
&lt;br /&gt;
When developing Input-Process-Output tools I am often in the situation, that I have a sequence of activities (e.g. opening a file, spec checking a file, calling external tools, creating files), which each could fail in certain ways. Clojure does not have a good way to control such a sequence of activities in a way that all sorts of things, which could go wrong, can be handled comfortably. In imperative programming languages concepts like early exit or bailout are used. These are not not very functional. Unfortunately practical problems are often like this.&lt;br /&gt;
&lt;br /&gt;
The issue is a bit more general and a solution would be nice not only for those who develop such sort of tools. So I can give a simple example.&lt;br /&gt;
&lt;br /&gt;
(let [config-file (get-file-from-network xy)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;config-file (parse-edn config-file)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;syntax-ok? &amp;nbsp;&amp;nbsp;(spec-check config-file)]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;(do-something-with config-file))&lt;br /&gt;
&lt;br /&gt;
As all these steps can fail, we could instead implement it like this.&lt;br /&gt;
&lt;br /&gt;
(if-let [config-file (get-file-from-network xy)]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;(if-let [config-file (parse-edn config-file)]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(if (spec-check config-file)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(do-something-with config-file))))&lt;br /&gt;
&lt;br /&gt;
Now the code has suffered already a lot. The sequential nature of the problem is lost. And it is not even doing what we need. We have to report to the user what went wrong.&lt;br /&gt;
&lt;br /&gt;
(if-let [config-file (get-file-from-network xy)]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;(if-let [config-file (parse-edn config-file)]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(if (spec-check config-file)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(do-something-with config-file)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:file-has-syntax-errors)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:file-not-valid-edn)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;:file-cannot be openned)&lt;br /&gt;
&lt;br /&gt;
But this is still not doing what we need. We have to provide more information about each failure. If a file cannot be openned, is it because the file does not exist or we do not have read permissions? And what did the spec check tell us? So we cannot just use nil as a universal failure. We must deliver more information when failing. And we cannot use if-let, either. So we are not even done.&lt;br /&gt;
&lt;br /&gt;
This problem report asks for a better solution for this conceptual challenge.&lt;br /&gt;
&lt;br /&gt;
This example depicts a conflict that should not happen when using an appropriate programming language: First we are able to quickly make a prototype. But in the end the final code has not much in common with the first code any more. The final design is not driven by the problem domain, but by the technical need for an error handling. The need for a bailout mechanism in this example imposes too many huge code changes.&lt;br /&gt;
&lt;br /&gt;
The principal problem with all these solutions is that they coerce a sequence of actions into something which is not a sequence. If your problem is a sequence, then the implementation should also be a sequence.&lt;br /&gt;
Idea: Exceptions&lt;br /&gt;
&lt;br /&gt;
As an alternative implementation I went with Exceptions. But it feels wrong, because I am talking about things, that are expected to fail. I cannot just use the Exceptions that are comming out of Java for example when opening a file for read. I need detailed information, what went wrong. If you are a command line tool, it is expected from you, that you provide good error messages. I ended up catching and rethrowing exceptions everywhere in the program.&lt;br /&gt;
Idea: Like for/doseq&lt;br /&gt;
&lt;br /&gt;
For me I created a small macro, that extends let. Then I use this syntax:&lt;br /&gt;
&lt;br /&gt;
(let [[config-file error] (get-file-from-network xy)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:escape &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;error&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;config-file (parse-edn config-file)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;syntax-ok? &amp;nbsp;&amp;nbsp;(spec-check config-file)]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;(do-something-with config-file))&lt;br /&gt;
&lt;br /&gt;
This often allows a surprisingly intuitive code. For example here:&lt;br /&gt;
&lt;br /&gt;
(let [[config-file error-code] (get-file-from-network xy)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:escape &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(if (= error-code :does-not-exist) &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:file-xy-does-not-exist)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:escape &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(if (= error-code :io-error)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:file-xy-cannot-be-read)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[config-file error-code] (parse-edn config-file)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:escape &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(if error-code :file-xy-not-legal-edn)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;syntax-ok? &amp;nbsp;&amp;nbsp;(spec-check config-file)]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;(do-something-with config-file))&lt;br /&gt;
&lt;br /&gt;
This is inspired by the for/doseq. But I don't claim that this is a good solution for Clojure (although I think so). But I think, the let macro is a good candidate when improving how Clojure can be used for such imperative things.&lt;br /&gt;
Idea: Using if-let&lt;br /&gt;
&lt;br /&gt;
I also investigated the solution, that was originally proposed by this issue.&lt;br /&gt;
&lt;br /&gt;
(if-let [config-file (get-file-from-network xy)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;config-file (parse-edn config-file)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;config-file-ok? (spec-check config-file)]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;(do-something-with config-file)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;:error)&lt;br /&gt;
&lt;br /&gt;
This problem with this solution is that none of the bindings are available in the else part. That makes it very hard to react accordingly. This is a nice and small new language feature. But I don't think, that in practice it would be of help so often. The example from the original issue was very artificial with mathematical operations that cannot fail. The first draft of this issue with that artificial example does not actally describe a real problem. That is why this issue has completelly been rewritten.&lt;br /&gt;
&lt;br /&gt;
Or course we could still bind everything, which was not failed. But I don't think, we would want that. It would have very interesting consequences to the compiling model.&lt;br /&gt;
Idea: Threading macros&lt;br /&gt;
&lt;br /&gt;
As this issue is a about a sequence of activities, a new type of threading macro (e.g. let-&amp;gt;) could also be an intuitive solution. But I have not tried anything like this.&lt;br /&gt;
Final Words&lt;br /&gt;
&lt;br /&gt;
The principle challenge is, that all these solutions establish a sort of alternative control flow. It is a hard challenge to do this right, especially in a functional language. Like exceptions, that immediatelly exit and magically jump somewhere else. Clojure as a practically language could address this challenge.</description>
<category>Clojure</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/3786/allow-multiple-bindings-for-if-let-when-let-some-and-when-some?show=15043#c15043</guid>
<pubDate>Thu, 09 Apr 2026 22:03:01 +0000</pubDate>
</item>
<item>
<title>Commented: Cannot resolve public generic method from package-private base class</title>
<link>https://ask.clojure.org/index.php/4255/cannot-resolve-public-generic-method-package-private-class?show=15042#c15042</link>
<description>I hit this with Google’s [mug](&lt;a href=&quot;https://github.com/google/mug&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://github.com/google/mug&lt;/a&gt;) library. The [format method](&lt;a href=&quot;https://google.github.io/mug/apidocs/com/google/mu/util/StringFormat.html#format(java.lang.Object,java.lang.Object)&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://google.github.io/mug/apidocs/com/google/mu/util/StringFormat.html#format(java.lang.Object,java.lang.Object)&lt;/a&gt;) is declared as public final on AbstractStringFormat, which is package-private. StringFormat is public and [inherits](&lt;a href=&quot;https://github.com/google/mug/blob/master/mug/src/main/java/com/google/mu/util/StringFormat.java#L86&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://github.com/google/mug/blob/master/mug/src/main/java/com/google/mu/util/StringFormat.java#L86&lt;/a&gt;) it.&lt;br /&gt;
&lt;br /&gt;
In Java this works fine — javac emits invokevirtual on the public subclass. In Clojure, all three interop paths fail:&lt;br /&gt;
&lt;br /&gt;
1. *Type-hinted call* `(.format ^StringFormat fmt &amp;quot;a&amp;quot; &amp;quot;b&amp;quot;)` -&amp;gt; No matching method format found taking 2 args&lt;br /&gt;
2. *Method reference* `^[Object Object] StringFormat/.format` -&amp;gt; IllegalAccessError: failed to access class AbstractStringFormat&lt;br /&gt;
3. *No type hint (reflection)* `(.format fmt &amp;quot;a&amp;quot; &amp;quot;b&amp;quot;)` -&amp;gt; same as #1&lt;br /&gt;
&lt;br /&gt;
`java.lang.reflect.Method` works fine — `StringFormat.class.getMethod(&amp;quot;format&amp;quot;, Object, Object)` finds and invokes it without issues.&lt;br /&gt;
&lt;br /&gt;
This looks like [CLJ-1243](&lt;a href=&quot;https://clojure.atlassian.net/browse/CLJ-1243&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://clojure.atlassian.net/browse/CLJ-1243&lt;/a&gt;) (open since 2013). &lt;br /&gt;
&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
#_(&lt;br /&gt;
DEPS='{:deps {com.google.mug/mug {:mvn/version &amp;quot;9.9.9&amp;quot;}}}'&lt;br /&gt;
exec clojure -Sdeps &amp;quot;$DEPS&amp;quot; -M &amp;quot;$0&amp;quot; &amp;quot;$@&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
;; &lt;a href=&quot;https://clojure.atlassian.net/browse/CLJ-1243&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://clojure.atlassian.net/browse/CLJ-1243&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
(import '(com.google.mu.util StringFormat))&lt;br /&gt;
&lt;br /&gt;
(def fmt (StringFormat. &amp;quot;{a}/{b}&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
(println &amp;quot;=== 1 ===&amp;quot;)&lt;br /&gt;
(try&lt;br /&gt;
&amp;nbsp;&amp;nbsp;(eval '(.format ^StringFormat fmt &amp;quot;a&amp;quot; &amp;quot;b&amp;quot;))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;(catch Throwable e&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(println (str &amp;quot; &amp;nbsp;&amp;quot; (.getClass e) &amp;quot;: &amp;quot; (.getMessage e)))))&lt;br /&gt;
&lt;br /&gt;
(println &amp;quot;=== 2 ===&amp;quot;)&lt;br /&gt;
(try&lt;br /&gt;
&amp;nbsp;&amp;nbsp;(eval '(let [f ^[Object Object] StringFormat/.format]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(f fmt &amp;quot;a&amp;quot; &amp;quot;b&amp;quot;)))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;(catch Throwable e&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(println (str &amp;quot; &amp;nbsp;&amp;quot; (.getClass e) &amp;quot;: &amp;quot; (.getMessage (or (.getCause e) e))))))&lt;br /&gt;
&lt;br /&gt;
(println)&lt;br /&gt;
(println &amp;quot;=== 3 ===&amp;quot;)&lt;br /&gt;
(try&lt;br /&gt;
&amp;nbsp;&amp;nbsp;(let [result (.format fmt &amp;quot;a&amp;quot; &amp;quot;b&amp;quot;)]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(println (str &amp;quot; &amp;nbsp;result: &amp;quot; result)))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;(catch Throwable e&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(println (str &amp;quot; &amp;nbsp;&amp;quot; (.getClass e) &amp;quot;: &amp;quot; (.getMessage e)))))&lt;br /&gt;
&lt;br /&gt;
(println)&lt;br /&gt;
(println &amp;quot;=== 4 &amp;nbsp;===&amp;quot;)&lt;br /&gt;
(let [m (-&amp;gt; StringFormat (.getMethod &amp;quot;format&amp;quot; (into-array Class [Object Object])))]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;(.setAccessible m true)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;(println (str &amp;quot; &amp;nbsp;result: &amp;quot; (.invoke m fmt (object-array [&amp;quot;a&amp;quot; &amp;quot;b&amp;quot;])))))</description>
<category>Java Interop</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/4255/cannot-resolve-public-generic-method-package-private-class?show=15042#c15042</guid>
<pubDate>Wed, 08 Apr 2026 21:37:42 +0000</pubDate>
</item>
<item>
<title>Closed: Unroll constantly to improve performance of multi-arity calls</title>
<link>https://ask.clojure.org/index.php/1894/unroll-constantly-to-improve-performance-multi-arity-calls?show=1894#q1894</link>
<description>This was found to be a hot spot when testing some Specter use cases.&lt;br /&gt;
&lt;br /&gt;
Review of common uses of constantly shows that the arity 1 case is the most common use of `constantly` in the wild, so only unrolled to two arguments.&lt;br /&gt;
&lt;br /&gt;
Perf test:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(use 'criterium.core)&lt;br /&gt;
(def f (constantly 1))&lt;br /&gt;
(bench (dotimes [_ 1000] (f)))&lt;br /&gt;
(bench (dotimes [_ 1000] (f 1)))&lt;br /&gt;
(bench (dotimes [_ 1000] (f 1 2)))&lt;br /&gt;
&lt;br /&gt;
;; Results:&lt;br /&gt;
;; Arity Before &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;After&lt;br /&gt;
;; 0 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;611.455589 ns &amp;nbsp;607.800747 ns &amp;nbsp;&amp;nbsp;&amp;nbsp;(no change was expected)&lt;br /&gt;
;; 1 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3.098828 µs &amp;nbsp;&amp;nbsp;&amp;nbsp;611.116510 ns &amp;nbsp;&amp;nbsp;&amp;nbsp;(~5x improvement)&lt;br /&gt;
;; 2 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3.508726 µs &amp;nbsp;&amp;nbsp;&amp;nbsp;620.415032 ns &amp;nbsp;&amp;nbsp;&amp;nbsp;(~5x improvement)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Patch:* 0001-CLJ-2228-Improve-performance-of-constantly.patch&lt;br /&gt;
&lt;br /&gt;
*Prescreened by:* Alex Miller</description>
<category>Clojure</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/1894/unroll-constantly-to-improve-performance-multi-arity-calls?show=1894#q1894</guid>
<pubDate>Tue, 07 Apr 2026 21:25:53 +0000</pubDate>
</item>
<item>
<title>Commented: &quot;Nested&quot; vs &quot;lateral&quot; exception causes</title>
<link>https://ask.clojure.org/index.php/15031/nested-vs-lateral-exception-causes?show=15040#c15040</link>
<description>I guess I don't follow your argument about LazyTest. For something to have a &amp;quot;list of exceptions&amp;quot;, then it has already caught and accumulated all of those exceptions in a Clojure data structure -- so once it is &amp;quot;done&amp;quot;, it could just (throw (ex-info &amp;quot;failures&amp;quot; {:causes list-of-caught-exes})) -- that data-conveyance is exactly what ex-info is intended for.&lt;br /&gt;
&lt;br /&gt;
All exceptions in Java-land (including ex-info's ExceptionInfo) have .getCause as a method and Clojure's ex-cause is &amp;quot;just&amp;quot; a wrapper around that (that works across dialects too: ClojureScript's API and behavior here is essentially identical to Clojure's, just mapped to JS).&lt;br /&gt;
&lt;br /&gt;
The work in dealing with the &amp;quot;list of exceptions&amp;quot; is in the domain-specific part of the code here: something has to catch &amp;amp; accumulate in a way that is appropriate for the domain.</description>
<category>Errors</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15031/nested-vs-lateral-exception-causes?show=15040#c15040</guid>
<pubDate>Tue, 07 Apr 2026 16:04:04 +0000</pubDate>
</item>
<item>
<title>Closed: Is the recent change to flow's futurize safe?</title>
<link>https://ask.clojure.org/index.php/14994/is-the-recent-change-to-flows-futurize-safe?show=14994#q14994</link>
<description>&lt;p&gt;Previously flow's futurize would rethrow any exceptions thrown by the function when deref'ed. With the recent changes to return a CompletableFuture it no longer does that and instead if the function throws deref'ing will just hang forever.&lt;/p&gt;
</description>
<category>core.async</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/14994/is-the-recent-change-to-flows-futurize-safe?show=14994#q14994</guid>
<pubDate>Mon, 06 Apr 2026 21:24:03 +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>Edited: Destructuring {:as opts} unexpected behaviour with seq</title>
<link>https://ask.clojure.org/index.php/15028/destructuring-as-opts-unexpected-behaviour-with-seq?show=15028#q15028</link>
<description>&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;I found out something weird in some old code, where I wanted to pass the first map in a sequence and by mistake the code was working while actually passing the sequence itself!&lt;/p&gt;
&lt;p&gt;After digging to make sense of this, I found out it has to do with the &lt;code&gt;{:as opts}&lt;/code&gt; destructuring.&lt;/p&gt;
&lt;p&gt;Here's some code:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;;; even if something is assigned sequential vs associative
;; the `:as` is transparent
(let [[:as opts] {1 2 3 4}]
  opts)
#_=&amp;gt; {1 2, 3 4}
(let [{:as opts} [1 2 3 4]]
  opts)
#_=&amp;gt; [1 2 3 4]
;; however with a seq it's returned as a map
(let [{:as opts} (seq [1 2 3 4])]
  opts)
#_=&amp;gt; {1 2, 3 4}

;; and it only gets weirder!
(let [{:as opts} (seq [{:k :v}])]
  opts)
#_=&amp;gt; {:k :v}
(let [{:as opts} (seq [{:k1 :v1} {:k2 :v2}])]
  opts)
#_=&amp;gt; {{:k1 :v1} {:k2 :v2}}
(let [{:as opts} (seq [{:k1 :v1} {:k2 :v2} {:k3 :v3}])]
  opts)
#_=&amp;gt; {{:k1 :v1} {:k2 :v2}, :k3 :v3}
(let [{:as opts} (seq [{:k1 :v1} {:k2 :v2} :not-a-map])]
  opts)
;; java.lang.IllegalArgumentException: Don't know how to create ISeq from: clojure.lang.Keyword
(let [{:as opts} (seq [1 2 3])]
  opts)
;; java.lang.IllegalArgumentException: Don't know how to create ISeq from: java.lang.Long
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In my case I didn't realize my code was wrong because &lt;code&gt;{:as opts} {:k :v}&lt;/code&gt; is the same as &lt;code&gt;{:as opts} (seq [{:k :v}])&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;To me this is behaviour I would expect closer to &lt;code&gt;&amp;amp; {:as opts}&lt;/code&gt; rather than just plain map destructuring &lt;code&gt;{:as opts}&lt;/code&gt;. Maybe both behaviours should be separated?&lt;/p&gt;
&lt;p&gt;I think this should be tackled either by&lt;br&gt;
1. make &lt;code&gt;:as&lt;/code&gt; transparent regardless of what comes in to always bind&lt;br&gt;
2. throw an error earlier when it's not of the expected destructuring&lt;br&gt;
3. Document this very unexpected edge case in &lt;a rel=&quot;nofollow&quot; href=&quot;https://clojure.org/reference/special_forms#associative-destructuring&quot;&gt;https://clojure.org/reference/special_forms#associative-destructuring&lt;/a&gt;&lt;br&gt;
4. Separate the keyword arguments use case from plain map destructuring? (Assuming both are now mixed together)&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=15028#q15028</guid>
<pubDate>Sun, 05 Apr 2026 09:19:47 +0000</pubDate>
</item>
<item>
<title>Edited: 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?show=15026#q15026</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?show=15026#q15026</guid>
<pubDate>Fri, 03 Apr 2026 11:22:38 +0000</pubDate>
</item>
<item>
<title>Commented: How to fix error 'could not acquire write lock for 'artifact:org.bytedeco:opencv:4.5.5-1.5.7' ?</title>
<link>https://ask.clojure.org/index.php/12730/error-could-acquire-write-lock-artifact-org-bytedeco-opencv?show=15025#c15025</link>
<description>GitHub agents are a good spot to see the problem, as they start with an &amp;quot;empty&amp;quot; .m2 folder.&lt;br /&gt;
If here:&lt;br /&gt;
&lt;a href=&quot;https://github.com/scicloj/metamorph.ml/blob/14b4e609a18ec9b291bc26a160108d249e56ba70/.github/workflows/main.yml#L50&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://github.com/scicloj/metamorph.ml/blob/14b4e609a18ec9b291bc26a160108d249e56ba70/.github/workflows/main.yml#L50&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
I would remove here the &amp;quot;-Sthreads 1&amp;quot;, the build would (I believe) fail &amp;nbsp;on each run.</description>
<category>tools.deps</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/12730/error-could-acquire-write-lock-artifact-org-bytedeco-opencv?show=15025#c15025</guid>
<pubDate>Fri, 03 Apr 2026 09:52:20 +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>Commented: Is taggedliteral's equality check inefficient?</title>
<link>https://ask.clojure.org/index.php/15002/is-taggedliterals-equality-check-inefficient?show=15021#c15021</link>
<description>Uploaded a patch</description>
<category>Records and Types</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15002/is-taggedliterals-equality-check-inefficient?show=15021#c15021</guid>
<pubDate>Wed, 01 Apr 2026 17:31:34 +0000</pubDate>
</item>
<item>
<title>Closed: Controlled Bailout, Jira issue 2213</title>
<link>https://ask.clojure.org/index.php/14999/controlled-bailout-jira-issue-2213?show=14999#q14999</link>
<description>&lt;p&gt;I would like to improve &lt;a rel=&quot;nofollow&quot; href=&quot;https://clojure.atlassian.net/browse/CLJ-2213&quot;&gt;Issue 2213&lt;/a&gt; as follows. Do you think, this makes sense? Shall I become contributor for this? &lt;/p&gt;
&lt;p&gt;The new description would be:&lt;/p&gt;
&lt;p&gt;When developing Input-Process-Output tools I am often in the situation, that I have a sequence of activities (e.g. opening a file, spec checking a file, calling external tools, creating files), which each could fail in certain ways. Clojure does not have a good way to control such a sequence of activities in a way that all sorts of things, which could go wrong, can be handled comfortably. In imperative programming languages concepts like early exit or bailout are used. These are not not very functional. Unfortunately practical problems are often like this.&lt;/p&gt;
&lt;p&gt;The issue is a bit more general and a solution would be nice not only for those who develop such sort of tools. So I can give a simple example.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(let [config-file (get-file-from-network xy)
      config-file (parse-edn config-file)
      syntax-ok?   (spec-check config-file)]
  (do-something-with config-file))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;As all these steps can fail, we could instead implement it like this.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(if-let [config-file (get-file-from-network xy)]
  (if-let [config-file (parse-edn config-file)]
    (if (spec-check config-file)
      (do-something-with config-file))))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now the code has suffered already a lot. The sequential nature of the problem is lost. And it is not even doing what we need. We have to report to the user what went wrong.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(if-let [config-file (get-file-from-network xy)]
  (if-let [config-file (parse-edn config-file)]
    (if (spec-check config-file)
      (do-something-with config-file)
      :file-has-syntax-errors)
    :file-not-valid-edn)
  :file-cannot be openned)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;But this is still not doing what we need. We have to provide more information about each failure. If a file cannot be openned, is it because the file does not exist or we do not have read permissions? And what did the spec check tell us? So we cannot just use &lt;code&gt;nil&lt;/code&gt; as a universal failure. We must deliver more information when failing. And we cannot use if-let, either. So we are not even done.&lt;/p&gt;
&lt;p&gt;This problem report asks for a better solution for this conceptual challenge.&lt;/p&gt;
&lt;p&gt;This example depicts a conflict that should not happen when using an appropriate programming language: First we are able to quickly make a prototype. But in the end the final code has not much in common with the first code any more. The final design is not driven by the problem domain, but by the technical need for an error handling. The need for a bailout mechanism in this example imposes too many huge code changes.&lt;/p&gt;
&lt;p&gt;The principal problem with all these solutions is that they coerce a sequence of actions into something which is not a sequence. If your problem is a sequence, then the implementation should also be a sequence.&lt;/p&gt;
&lt;h2&gt;Idea: Exceptions&lt;/h2&gt;
&lt;p&gt;As an alternative implementation I went with Exceptions. But it feels wrong, because I am talking about things, that are expected to fail. I cannot just use the Exceptions that are comming out of Java for example when opening a file for read. I need detailed information, what went wrong. If you are a command line tool, it is expected from you, that you provide good error messages. I ended up catching and rethrowing exceptions everywhere in the program.&lt;/p&gt;
&lt;h2&gt;Idea: Like for/doseq&lt;/h2&gt;
&lt;p&gt;For me I created a small macro, that extends &lt;code&gt;let&lt;/code&gt;. Then I use this syntax:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(let [[config-file error] (get-file-from-network xy)
      :escape     error
      config-file (parse-edn config-file)
      syntax-ok?   (spec-check config-file)]
  (do-something-with config-file))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This often allows a surprisingly intuitive code. For example here:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(let [[config-file error-code] (get-file-from-network xy)
      :escape     (if (= error-code :does-not-exist) 
                    :file-xy-does-not-exist)
      :escape     (if (= error-code :io-error)
                    :file-xy-cannot-be-read)
      [config-file error-code] (parse-edn config-file)
      :escape     (if error-code :file-xy-not-legal-edn)
      syntax-ok?   (spec-check config-file)]
  (do-something-with config-file))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is inspired by the &lt;code&gt;for&lt;/code&gt;/&lt;code&gt;doseq&lt;/code&gt;. But I don't claim that this is a good solution for Clojure (although I think so). But I think, the &lt;code&gt;let&lt;/code&gt; macro is a good candidate when improving how Clojure can be used for such imperative things.&lt;/p&gt;
&lt;h2&gt;Idea: Using &lt;code&gt;if-let&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;I also investigated the solution, that was originally proposed by this issue.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(if-let [config-file (get-file-from-network xy)
         config-file (parse-edn config-file)
         config-file-ok? (spec-check config-file)]
  (do-something-with config-file)
  :error)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This problem with this solution is that none of the bindings are available in the else part. That makes it very hard to react accordingly. This is a nice and small new language feature. But I don't think, that in practice it would be of help so often. The example from the original issue was very artificial with mathematical operations that cannot fail. The first draft of this issue with that artificial example does not actally describe a real problem. That is why this issue has completelly been rewritten.&lt;/p&gt;
&lt;p&gt;Or course we could still bind everything, which was not failed. But I don't think, we would want that. It would have very interesting consequences to the compiling model.&lt;/p&gt;
&lt;h2&gt;Idea: Threading macros&lt;/h2&gt;
&lt;p&gt;As this issue is a about a sequence of activities, a new type of threading macro (e.g. &lt;code&gt;let-&amp;gt;&lt;/code&gt;) could also be an intuitive solution. But I have not tried anything like this.&lt;/p&gt;
&lt;h2&gt;Final Words&lt;/h2&gt;
&lt;p&gt;The principle challenge is, that all these solutions establish a sort of alternative control flow. It is a hard challenge to do this right, especially in a functional language. Like exceptions, that immediatelly exit and magically jump somewhere else. Clojure as a practically language could address this challenge.&lt;/p&gt;
</description>
<category>Clojure</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/14999/controlled-bailout-jira-issue-2213?show=14999#q14999</guid>
<pubDate>Tue, 31 Mar 2026 19:54:30 +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>
<item>
<title>Closed: Why doesn't defn also implicitly name the anonymous function it defines for recursion?</title>
<link>https://ask.clojure.org/index.php/15000/doesnt-defn-implicitly-anonymous-function-defines-recursion?show=15000#q15000</link>
<description>&lt;p&gt;Why doesn't &lt;code&gt;defn&lt;/code&gt; implicitly name the function to create a named recursion point?&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(clojure.walk/macroexpand-all
  '(defn foo [x]
     (foo x)))
; =&amp;gt;
(def foo
  (fn*
    ([x]
     (foo x))))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This could instead expand to&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(def foo
  (fn* foo ; note the foo here
    ([x]
     (foo x))))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;How it works right now, &lt;code&gt;foo&lt;/code&gt; resolves to a global var &lt;code&gt;#'foo&lt;/code&gt;, which is created when the &lt;code&gt;(def ...)&lt;/code&gt; form is analyzed. In the second case, it resolves directly to the function object. Thus, it should save us a var dereference at runtime in this case.&lt;/p&gt;
&lt;p&gt;EDIT: Found out, this is exactly what &lt;a rel=&quot;nofollow&quot; href=&quot;https://clojure.org/reference/compilation#directlinking&quot;&gt;direct linking&lt;/a&gt; is used for.&lt;/p&gt;
</description>
<category>Macros</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/15000/doesnt-defn-implicitly-anonymous-function-defines-recursion?show=15000#q15000</guid>
<pubDate>Thu, 26 Mar 2026 17:24:24 +0000</pubDate>
</item>
<item>
<title>Edited: Evaluating forms using eval can create a valid undesirable recursion point</title>
<link>https://ask.clojure.org/index.php/14991/evaluating-forms-using-create-valid-undesirable-recursion?show=14991#q14991</link>
<description>&lt;p&gt;When the &lt;code&gt;eval&lt;/code&gt; function in Clojure is called with an argument that is an instance of &lt;code&gt;IPersistentCollection&lt;/code&gt; which likely isn't a special def-like form (the first element isn't a symbol at all or it does not start with &lt;code&gt;&quot;def&quot;&lt;/code&gt;), the form is first wrapped in an anonymous function which then gets compiled and invoked, which indirectly evaluates the original form.&lt;/p&gt;
&lt;p&gt;There aren't any extra checks performed and it makes forms like these 2 valid, which should normally be rejected and a compiler exception should be thrown:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(recur)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;or&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(let []
  (print &quot;Hello&quot;)
  (Thread/sleep 1000)
  (recur))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;where the 2nd form keeps printing &quot;Hello&quot; and loops infinitely over the outer wrapper function.&lt;/p&gt;
</description>
<category>Clojure</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/14991/evaluating-forms-using-create-valid-undesirable-recursion?show=14991#q14991</guid>
<pubDate>Thu, 26 Mar 2026 04:05:02 +0000</pubDate>
</item>
<item>
<title>Comment edited: shasum not found error when using ./posix-install on linux</title>
<link>https://ask.clojure.org/index.php/14987/shasum-not-found-error-when-using-posix-install-on-linux?show=14989#c14989</link>
<description>from &lt;a href=&quot;https://clojure.org/guides/install_clojure&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://clojure.org/guides/install_clojure&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;gt; This installer should work on Linux, BSD, and even Mac (but will conflict with brew!)&lt;br /&gt;
&lt;br /&gt;
That made me think that I should expect the posix installer to work.</description>
<category>Tools</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/14987/shasum-not-found-error-when-using-posix-install-on-linux?show=14989#c14989</guid>
<pubDate>Thu, 12 Mar 2026 00:09:15 +0000</pubDate>
</item>
<item>
<title>Answer selected: clojure.core.cache caches delays that hold exceptions as of version 1.2.254</title>
<link>https://ask.clojure.org/index.php/14965/clojure-core-cache-caches-delays-that-hold-exceptions-version?show=14970#a14970</link>
<description>&lt;p&gt;Version 1.2.263 solves both the cache stampede bug and the cached exceptions bug, and does so without locking. Thank you, Claude Opus 4.6.&lt;/p&gt;
</description>
<category>core.cache</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/14965/clojure-core-cache-caches-delays-that-hold-exceptions-version?show=14970#a14970</guid>
<pubDate>Wed, 11 Mar 2026 18:21:37 +0000</pubDate>
</item>
<item>
<title>Closed: tools.cli: capture unrecognized options as unparsed arguments</title>
<link>https://ask.clojure.org/index.php/14977/tools-cli-capture-unrecognized-options-unparsed-arguments?show=14977#q14977</link>
<description>&lt;p&gt;I frequently write a command that accepts options and in turn execute a shell command passing arguments through; I want to be able to specify additional arguments to that shell command.&lt;/p&gt;
&lt;p&gt;In tools.cli, the :in-order key &lt;em&gt;almost&lt;/em&gt; does what i want:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;`&lt;/code&gt;&lt;br&gt;
(require '[clojure.tools.cli :as cli])&lt;br&gt;
=&amp;gt; nil&lt;br&gt;
(def opts [[&quot;-d&quot; &quot;--debug&quot;]])&lt;br&gt;
=&amp;gt; #'net.lewisship.cli-tools-test/opts&lt;br&gt;
(cli/parse-opts&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[&quot;--foo&quot;]
[]
:in-order true)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;=&amp;gt; {:options {}, :arguments [], :summary &quot;&quot;, :errors [&quot;Unknown option: \&quot;--foo\&quot;&quot;]}&lt;br&gt;
(cli/parse-opts&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[&quot;xxx&quot; &quot;--foo&quot;]
[]
:in-order true)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;=&amp;gt; {:options {}, :arguments [&quot;xxx&quot; &quot;--foo&quot;], :summary &quot;&quot;, :errors nil}&lt;br&gt;
&lt;code&gt;`&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;However, it will assume an undefined option is an error until the first non-option argument is consumed.&lt;/p&gt;
&lt;p&gt;I would like a further option that is like :in-order but accepting of these unrecognized options.  Maybe, :passthru-options would be a good name?&lt;/p&gt;
&lt;p&gt;I can work on a patch if we have some consensus on direction.&lt;/p&gt;
</description>
<category>tools.cli</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/14977/tools-cli-capture-unrecognized-options-unparsed-arguments?show=14977#q14977</guid>
<pubDate>Tue, 10 Mar 2026 16:08:38 +0000</pubDate>
</item>
<item>
<title>Closed: Review cli-matic for inspiration for enhancing tools.cli</title>
<link>https://ask.clojure.org/index.php/7812/review-cli-matic-for-inspiration-for-enhancing-tools-cli?show=7812#q7812</link>
<description>&lt;p&gt;See &lt;a rel=&quot;nofollow&quot; href=&quot;https://cljdoc.org/d/cli-matic/cli-matic/0.2.7/doc/readme&quot;&gt;https://cljdoc.org/d/cli-matic/cli-matic/0.2.7/doc/readme&lt;/a&gt;&lt;/p&gt;
</description>
<category>tools.cli</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/7812/review-cli-matic-for-inspiration-for-enhancing-tools-cli?show=7812#q7812</guid>
<pubDate>Fri, 06 Mar 2026 01:06:24 +0000</pubDate>
</item>
<item>
<title>Closed: Tools.cli :validate: provide a way to post-validate (after updates)</title>
<link>https://ask.clojure.org/index.php/10267/tools-cli-validate-provide-way-post-validate-after-updates?show=10267#q10267</link>
<description>&lt;p&gt;aratare on Slack had this code:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[&quot;-v&quot; nil &quot;Verbosity level; may be specified up to 2 times. Levels: INFO (Default) -&amp;gt; DEBUG -&amp;gt; TRACE&quot;
    ;; If no long-option is specified, an option :id must be given
    :id :min-level
    :default 0
    :update-fn inc
    :validate [(fn [a]
                 (println a)
                 (&amp;lt;= a 2)) &quot;Verbosity level cannot exceed 2.&quot;]]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and asked:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;and &lt;code&gt;a&lt;/code&gt; is printed as &lt;code&gt;true&lt;/code&gt; instead of either the level before or after applying &lt;code&gt;update-fn&lt;/code&gt;. Is there a way to work around this so I can validate after &lt;code&gt;update-fn&lt;/code&gt; has been called? Thanks in advance. (edited) &lt;/p&gt;
&lt;/blockquote&gt;
</description>
<category>tools.cli</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/10267/tools-cli-validate-provide-way-post-validate-after-updates?show=10267#q10267</guid>
<pubDate>Fri, 06 Mar 2026 01:05:21 +0000</pubDate>
</item>
<item>
<title>Closed: Tools.cli :validate: provide function of invalid value in addition to fixed string</title>
<link>https://ask.clojure.org/index.php/10265/tools-validate-provide-function-invalid-value-addition-string?show=10265#q10265</link>
<description>&lt;p&gt;The &lt;code&gt;:validate&lt;/code&gt; option currently takes a validation function and a string error message.&lt;/p&gt;
&lt;p&gt;Could we extend the second argument to a function instead so you can return an error message like &lt;code&gt;&quot;--foo should be greater than 10, but was: 11&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;We could even plug &lt;code&gt;clojure.spec.alpha&lt;/code&gt; or &lt;code&gt;malli&lt;/code&gt; in there:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(def cli-options
  [[&quot;-n&quot; &quot;--number NUM&quot; &quot;A number&quot;
    :parse-fn (m/decoder int? mt/string-transformer)
    :validate [(fn [input]
                 (m/validate [:&amp;lt; 100] input))
               (fn [input]
                 (me/humanize (m/explain [:&amp;lt; 100] input)))]]])
&lt;/code&gt;&lt;/pre&gt;
</description>
<category>tools.cli</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/10265/tools-validate-provide-function-invalid-value-addition-string?show=10265#q10265</guid>
<pubDate>Fri, 06 Mar 2026 01:04:56 +0000</pubDate>
</item>
<item>
<title>Closed: tools.cli: display default value for --[no-]foo flags in help summary</title>
<link>https://ask.clojure.org/index.php/12069/tools-cli-display-default-value-for-no-foo-flags-help-summary?show=12069#q12069</link>
<description>&lt;p&gt;Salut&lt;/p&gt;
&lt;p&gt;While boolean options of the form &quot;--foo&quot; are false by default and enabled by specifying them, flag options of the form &quot;--[no-]foo&quot; accept &quot;--foo&quot; and &quot;--no-foo&quot; to toggle them on or off respectively. The default could be true or false, but the user has no way to tell what the default value is based on the help summary.&lt;/p&gt;
&lt;p&gt;For those options I think it is helpful (even necessary) to always display the default value, whether the option is required or not.&lt;/p&gt;
&lt;p&gt;I've drafted a patch that could serve as a starting point.&lt;/p&gt;
&lt;p&gt;A related thought: shouldn't the default always be shown, even if it isn't a required option? Maybe there is a good reason for this, but I don't get why non-required options hide their default in the help summary.&lt;/p&gt;
&lt;p&gt;Thanks for your work!&lt;/p&gt;
</description>
<category>tools.cli</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/12069/tools-cli-display-default-value-for-no-foo-flags-help-summary?show=12069#q12069</guid>
<pubDate>Fri, 06 Mar 2026 01:04:34 +0000</pubDate>
</item>
<item>
<title>Closed: Compile parser ahead of time</title>
<link>https://ask.clojure.org/index.php/12697/compile-parser-ahead-of-time?show=12697#q12697</link>
<description>&lt;p&gt;&lt;code&gt;tools.cli/parse-opts&lt;/code&gt; accepts the args, the option-spec, and the additional options. It calls &lt;code&gt;compile-option-specs&lt;/code&gt; and &lt;code&gt;required-arguments&lt;/code&gt; to build the &lt;code&gt;specs&lt;/code&gt; and &lt;code&gt;req&lt;/code&gt;. Then it performs the validation with those specs and req on the provided &lt;code&gt;args&lt;/code&gt; (along with the options). For a given application, the first two steps aren't going to change across calls.&lt;/p&gt;
&lt;p&gt;I propose a new &lt;code&gt;make-parse-opts-fn&lt;/code&gt; function that performs the &lt;code&gt;compile-option-specs&lt;/code&gt; and &lt;code&gt;required-arguments&lt;/code&gt; up front and returns a function that relies on the compiled &lt;code&gt;specs&lt;/code&gt; and &lt;code&gt;req&lt;/code&gt;. It could be used like this: &lt;code&gt;(def compiled-parser (make-parse-opts-fn cli-options))&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Microbenchmarking with criterium shows a more than double increase in speed (tools.cli/parse-opts first, pre-compiled parser second):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;; user=&amp;gt; (def cli-options
  [[&quot;-h&quot; &quot;--help&quot; &quot;This message&quot;]
   [nil &quot;--extra&quot; &quot;Output in extra format&quot;
    :default false]
   [&quot;-q&quot; &quot;--quiet&quot; &quot;Print no suggestions, only return exit code&quot;
    :default false]])
#'user/cli-options

; user=&amp;gt; (bench (cli/parse-opts [&quot;--quiet&quot; &quot;src&quot;] cli-options :in-order true))
Evaluation count : 10962 in 6 samples of 1827 calls.
             Execution time mean : 65.021329 µs
    Execution time std-deviation : 5.276033 µs
   Execution time lower quantile : 58.658638 µs ( 2.5%)
   Execution time upper quantile : 69.724228 µs (97.5%)
                   Overhead used : 9.607933 ns
nil

; user=&amp;gt; (bench (compiled-parser [&quot;--quiet&quot; &quot;src&quot;] :in-order true))
Evaluation count : 24660 in 6 samples of 4110 calls.
             Execution time mean : 25.090846 µs
    Execution time std-deviation : 253.361821 ns
   Execution time lower quantile : 24.769079 µs ( 2.5%)
   Execution time upper quantile : 25.413286 µs (97.5%)
                   Overhead used : 9.607933 ns
nil
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If the additional options are lifted into the &lt;code&gt;make-parse-opts-fn&lt;/code&gt; as well (trading flexibility for speed), the difference is even more dramatic, providing roughly 10x speed increase over the existing &lt;code&gt;tools.cli/parse-opts&lt;/code&gt; function:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;; user=&amp;gt; (bench (compiled-parser-2 [&quot;--quiet&quot; &quot;src&quot;]))
Evaluation count : 73116 in 6 samples of 12186 calls.
             Execution time mean : 8.349923 µs
    Execution time std-deviation : 51.419864 ns
   Execution time lower quantile : 8.282266 µs ( 2.5%)
   Execution time upper quantile : 8.407998 µs (97.5%)
                   Overhead used : 9.607933 ns

Found 2 outliers in 6 samples (33.3333 %)
	low-severe	 1 (16.6667 %)
	low-mild	 1 (16.6667 %)
 Variance from outliers : 13.8889 % Variance is moderately inflated by outliers
nil
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I can provide a patch for this if there's interest.&lt;/p&gt;
</description>
<category>tools.cli</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/12697/compile-parser-ahead-of-time?show=12697#q12697</guid>
<pubDate>Fri, 06 Mar 2026 01:03:57 +0000</pubDate>
</item>
<item>
<title>Closed: Providing nil for long option in tools.cli does not seem to work per readme</title>
<link>https://ask.clojure.org/index.php/14260/providing-nil-for-long-option-tools-cli-does-seem-work-readme?show=14260#q14260</link>
<description>&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;A very simplified tools.cli call:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(let [cli-opts [[&quot;-m&quot; &quot;--mode MODE&quot; &quot;Application mode&quot;]]]
  (cli/parse-opts [&quot;-m&quot; &quot;hub&quot;] cli-opts)) 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Evaluates as expected to:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{:options {:mode &quot;hub&quot;} ... }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;However, when I try to replace the long option with nil per the docs:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(let [cli-opts [[&quot;-m&quot; nil &quot;Application mode&quot; :id :mode]]]
  (cli/parse-opts [&quot;-m&quot; &quot;hub&quot;] cli-opts))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I get:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{:options {:mode true} :arguments [&quot;hub&quot;] ... }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I get the same behaviour with long option = &quot;&quot;, &quot;--mode&quot;, and &quot;MODE&quot;; the only way it seems to work is with the full &quot;--mode MODE&quot;. Setting the short option to nil works as I'd expect.&lt;/p&gt;
&lt;p&gt;Tested in Clojure 1.12.0, tools.cli 1.1.230, Java 23; same behaviour on Windows 11 and MacOS 15.&lt;/p&gt;
&lt;p&gt;Am I doing something wrong, or is tools.cli? :)&lt;/p&gt;
</description>
<category>tools.cli</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/14260/providing-nil-for-long-option-tools-cli-does-seem-work-readme?show=14260#q14260</guid>
<pubDate>Fri, 06 Mar 2026 01:01:11 +0000</pubDate>
</item>
<item>
<title>Closed: Incorrect docstring for parse-opts</title>
<link>https://ask.clojure.org/index.php/14275/incorrect-docstring-for-parse-opts?show=14275#q14275</link>
<description>&lt;p&gt;In the docstring for &lt;code&gt;clojure.tools.cli/parse-opts&lt;/code&gt; (seen &lt;a rel=&quot;nofollow&quot; href=&quot;https://clojure.github.io/tools.cli/#clojure.tools.cli/parse-opts&quot;&gt;here&lt;/a&gt;), it says,&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:id           The key for this option in the resulting option map. This
              is normally set to the keywordized name of the long option
              without the leading dashes.

              Multiple option entries can share the same :id in order to
              transform a value in different ways, but only one of these
              option entries may contain a :default(-fn) entry.

              This option is mandatory.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The final line says &quot;This option is mandatory.&quot; which is technically true for parse-opts' internals, but it's not true for users because (as the first paragraph says) &lt;code&gt;:id&lt;/code&gt; is also generated by keywordizing the long option.&lt;/p&gt;
&lt;p&gt;May I recommend changing it to be more explicit? Something like &quot;If a long option is not provided, this option is mandatory.&quot;&lt;/p&gt;
</description>
<category>tools.cli</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/14275/incorrect-docstring-for-parse-opts?show=14275#q14275</guid>
<pubDate>Fri, 06 Mar 2026 01:00:43 +0000</pubDate>
</item>
<item>
<title>Answer selected: It's difficult to figure out options I can pass to slurp function.</title>
<link>https://ask.clojure.org/index.php/14975/its-difficult-to-figure-out-options-can-pass-slurp-function?show=14976#a14976</link>
<description>&lt;p&gt;This is fair. I created &lt;a rel=&quot;nofollow&quot; href=&quot;https://clojure.atlassian.net/browse/CLJ-2944&quot;&gt;https://clojure.atlassian.net/browse/CLJ-2944&lt;/a&gt; to track this.&lt;/p&gt;
</description>
<category>Docs</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/14975/its-difficult-to-figure-out-options-can-pass-slurp-function?show=14976#a14976</guid>
<pubDate>Sat, 28 Feb 2026 06:27:25 +0000</pubDate>
</item>
<item>
<title>Closed: Could some calls to clojure.core/= be replaced by clojure.core/identical?</title>
<link>https://ask.clojure.org/index.php/12721/could-some-calls-clojure-core-replaced-clojure-core-identical?show=12721#q12721</link>
<description>&lt;p&gt;I'm using &lt;code&gt;core.cache&lt;/code&gt; in combination with &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/raxod502/lazy-map&quot;&gt;&lt;code&gt;LazyMap&lt;/code&gt;&lt;/a&gt;. Lazy maps are map-like objects (new data type encapsulating maps and adding some logic to auto-force delayed values associated with keys).&lt;/p&gt;
&lt;p&gt;When I started putting lazy maps as values of FIFO Cache I observed that all values are being realized just after the map lands in cache. After some digging I've found that it is caused by expression &lt;code&gt;(= ::expired v)&lt;/code&gt; in &lt;code&gt;clojure.core.cache.wrapped/lookup-or-miss&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;What happens is that &lt;code&gt;=&lt;/code&gt; internally calls &lt;code&gt;clojure.lang.Util/equiv&lt;/code&gt; (since &lt;code&gt;LazyMap&lt;/code&gt; implements &lt;code&gt;IPersistentCollection&lt;/code&gt;) and then, after some dispatching, &lt;code&gt;equiv&lt;/code&gt; is called to check whether the contents of a lazy map equals to other object (implicitly other map). This is the desired behavior and lazy map realizes all values to make comparison possible.&lt;/p&gt;
&lt;p&gt;However, when comparing a map-like object to something which is not a map (nor a collection), short-circuit would be welcome as soon as we know that it will for sure return &lt;code&gt;false&lt;/code&gt;. But changing that is probably more related to Clojure itself and things like &lt;a rel=&quot;nofollow&quot; href=&quot;https://clojure.atlassian.net/browse/CLJ-1375&quot;&gt;CLJ-1375&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;What could be done on &lt;code&gt;core.cache&lt;/code&gt;'s side, if that's not too problematic, would be a replacement of&lt;/p&gt;
&lt;p&gt; &lt;code&gt;(= ::expired v)&lt;/code&gt; with &lt;code&gt;(identical? ::expired v)&lt;/code&gt;   &lt;/p&gt;
&lt;p&gt;in &lt;code&gt;clojure.core.cache.wrapped&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;It would not only fix corner cases like mine but also speed things up a bit (explicit referential equality rocks when it comes to Clojure keywords).&lt;/p&gt;
&lt;p&gt;Other expressions where that could be changed (just in case) are:&lt;br&gt;
 &lt;code&gt;(= ::nope ret)&lt;/code&gt; and &lt;code&gt;(= ::nil v)&lt;/code&gt; from &lt;code&gt;clojure.core.cache&lt;/code&gt;.&lt;/p&gt;
</description>
<category>core.cache</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/12721/could-some-calls-clojure-core-replaced-clojure-core-identical?show=12721#q12721</guid>
<pubDate>Thu, 26 Feb 2026 17:09:09 +0000</pubDate>
</item>
<item>
<title>Answer selected: Is it legal for a namespace to start with a number?</title>
<link>https://ask.clojure.org/index.php/14962/is-it-legal-for-a-namespace-to-start-with-a-number?show=14963#a14963</link>
<description>&lt;p&gt;As far as I can tell, there is no reason a namespace segment other than the first can't start with a number.&lt;/p&gt;
</description>
<category>Clojure</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/14962/is-it-legal-for-a-namespace-to-start-with-a-number?show=14963#a14963</guid>
<pubDate>Mon, 23 Feb 2026 19:13:52 +0000</pubDate>
</item>
<item>
<title>Closed: from-java does not convert Boolean to clojure keyword</title>
<link>https://ask.clojure.org/index.php/7182/from-java-does-not-convert-boolean-to-clojure-keyword?show=7182#q7182</link>
<description>Given a class:&lt;br /&gt;
&lt;br /&gt;
public class BoolTest {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private Boolean aBoolean;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private String aString;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public Boolean isABoolean() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return aBoolean;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public void setABoolean(Boolean value) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.aBoolean = value;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public String getAString() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return aString;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public void setAString(String aString) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.aString = aString;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Test:&lt;br /&gt;
&lt;br /&gt;
(def example (BoolTest.))&lt;br /&gt;
&lt;br /&gt;
(defn run-test []&lt;br /&gt;
&amp;nbsp;&amp;nbsp;(do&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(-&amp;gt; example&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(.setABoolean true))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(-&amp;gt; example&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(.setAString &amp;quot;something&amp;quot;))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(from-java example)))&lt;br /&gt;
&lt;br /&gt;
***** Actual:&lt;br /&gt;
(test/run-test) =&amp;gt; {:AString &amp;quot;something&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
**** Expected:&lt;br /&gt;
(test/run-test) =&amp;gt; {:AString &amp;quot;something&amp;quot; :ABoolean true}</description>
<category>java.data</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/7182/from-java-does-not-convert-boolean-to-clojure-keyword?show=7182#q7182</guid>
<pubDate>Mon, 23 Feb 2026 16:47:20 +0000</pubDate>
</item>
<item>
<title>Closed: java.util.Date should not be converted</title>
<link>https://ask.clojure.org/index.php/7183/java-util-date-should-not-be-converted?show=7183#q7183</link>
<description>(from-java (java.util.Date.)) returns&lt;br /&gt;
&lt;br /&gt;
{:day 2, :date 22, :time 1548156165905, :month 0, :seconds 45, :year 119, :timezoneOffset 0, :hours 11, :minutes 22}&lt;br /&gt;
&lt;br /&gt;
but it makes more sense not to convert date objects as they are effectively primitives within Clojure. &amp;nbsp;Can submit PR for this if approved.</description>
<category>java.data</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/7183/java-util-date-should-not-be-converted?show=7183#q7183</guid>
<pubDate>Mon, 23 Feb 2026 16:46:47 +0000</pubDate>
</item>
<item>
<title>Closed: incorrect org.clojure/java.data convert java.util.Date use getter and setter</title>
<link>https://ask.clojure.org/index.php/7181/incorrect-clojure-java-data-convert-java-util-getter-setter?show=7181#q7181</link>
<description>&lt;p&gt;in package org.clojure/java.data&lt;/p&gt;
&lt;p&gt;(cjd/from-java (java.util.Date.)) will use setter and getter method of java.util.Date, which produce incorrect clojure object,&lt;/p&gt;
&lt;p&gt;because java.util.Date is a basic class of java language, it's better keep &quot;::do-not-convert&quot;.&lt;/p&gt;
&lt;p&gt;so i add this class to ::do-not-convert classify.&lt;/p&gt;
</description>
<category>java.data</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/7181/incorrect-clojure-java-data-convert-java-util-getter-setter?show=7181#q7181</guid>
<pubDate>Mon, 23 Feb 2026 16:46:17 +0000</pubDate>
</item>
<item>
<title>Closed: Translate - into camel casing in to-java</title>
<link>https://ask.clojure.org/index.php/7185/translate-into-camel-casing-in-to-java?show=7185#q7185</link>
<description>&lt;p&gt;Currently, if a class has a setter like {{setMyThing}}, the hash must contain {{:myThing}} for {{to-java}} to call it.&lt;/p&gt;
&lt;p&gt;It would be great is {{:my-thing}} could be used instead as it would look less Java-ish.&lt;/p&gt;
</description>
<category>java.data</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/7185/translate-into-camel-casing-in-to-java?show=7185#q7185</guid>
<pubDate>Mon, 23 Feb 2026 16:44:54 +0000</pubDate>
</item>
<item>
<title>Closed: Pass JDBC connection properties when creating connection via connection-uri</title>
<link>https://ask.clojure.org/index.php/8633/pass-connection-properties-creating-connection-connection?show=8633#q8633</link>
<description>&lt;p&gt;Hi there&lt;/p&gt;
&lt;p&gt;In java.jdbc, when using a raw connection uri, properties cannot be passed in and have to be part of the uri, except for username and password which can be taken from the db-spec, as there is a DriverManager constructor that takes username and password specifically. DriverManager does, however, provide another constructor in which any properties can be provided, including username and password. Would it be possible to use that constructor instead? Here is what the change would look like: &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/dmcgillen/java.jdbc/commit/95edd36997320d8dc6882ea371d88c901e49f465#diff-3a9a3475f16407a50d922fad53957b01L293&quot;&gt;https://github.com/dmcgillen/java.jdbc/commit/95edd36997320d8dc6882ea371d88c901e49f465#diff-3a9a3475f16407a50d922fad53957b01L293&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For context, this has come up for me since I've been using an AWS Secrets Manager JDBC wrapper, which takes the secret id as a connection uri. I'd still like to provide other JDBC properties, but they are expected to be provided as in the change above, and it seems like a good idea to support properties being passed in this way.&lt;/p&gt;
&lt;p&gt;Let me know if I should have created a JIRA rather than posting here and I can do so (if this change is a good idea, of course).&lt;/p&gt;
&lt;p&gt;Thanks&lt;/p&gt;
</description>
<category>java.jdbc</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/8633/pass-connection-properties-creating-connection-connection?show=8633#q8633</guid>
<pubDate>Mon, 23 Feb 2026 16:44:25 +0000</pubDate>
</item>
<item>
<title>Closed: Make it easier to test java.jdbc in other environments</title>
<link>https://ask.clojure.org/index.php/7205/make-it-easier-to-test-java-jdbc-in-other-environments?show=7205#q7205</link>
<description>&lt;p&gt;Make the versions properties in {{pom.xml}} and/or {{project.clj}}, make the database names, usernames, and passwords configurable via environment variables.&lt;/p&gt;
&lt;p&gt;This came up via a suggestion from the PostgreSQL community -- see this pull request for guidance on what we could open up: &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/clojure/java.jdbc/pull/44/files&quot;&gt;https://github.com/clojure/java.jdbc/pull/44/files&lt;/a&gt;&lt;/p&gt;
</description>
<category>java.jdbc</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/7205/make-it-easier-to-test-java-jdbc-in-other-environments?show=7205#q7205</guid>
<pubDate>Mon, 23 Feb 2026 16:43:32 +0000</pubDate>
</item>
<item>
<title>Closed: to-java not working when setter takes Map as parameter</title>
<link>https://ask.clojure.org/index.php/7180/to-java-not-working-when-setter-takes-map-as-parameter?show=7180#q7180</link>
<description>&lt;p&gt;If I have the following class:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;`&lt;/code&gt;&lt;br&gt;
public class ClojureTestBean {&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;private java.util.Map foo;

public void setFoo(Map foo) {
    this.foo = foo;
}

public Map getFoo() {
    return foo;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;}&lt;br&gt;
&lt;code&gt;`&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;And I run the following clojure:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;`&lt;/code&gt;&lt;br&gt;
(def bean-instance (ClojureTestBean.))&lt;br&gt;
(. bean-instance setFoo {&quot;bar&quot; &quot;baz&quot;})&lt;/p&gt;
&lt;p&gt;(def bean-instance-as-map (from-java bean-instance))&lt;/p&gt;
&lt;p&gt;(def new-bean-instance (to-java ClojureTestBean bean-instance-as-map))&lt;br&gt;
&lt;code&gt;`&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The final line throws a {{java.lang.InstantiationException: java.util.Map}} exception (full stack trace found below).  It looks like there's a {{to-java}} method that, when it gets a {{APersistentMap}}, tries to create an instance of the type of the parameter which in this case is a {{Map}} interface, which of course cannot be instantiated.&lt;/p&gt;
&lt;p&gt;I'm wondering why the {{APersistentMap}} wouldn't be passed in directly, as it implements the {{Map}} interface?&lt;/p&gt;
&lt;p&gt;&lt;code&gt;`&lt;/code&gt;&lt;br&gt;
CompilerException java.lang.InstantiationException: java.util.Map, compiling:(scratchpad.clj:13:24) &lt;br&gt;
java.lang.InstantiationException: java.util.Map, compiling:(scratchpad.clj:13:24)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;at clojure.lang.Compiler$InvokeExpr.eval(Compiler.java:3628)
at clojure.lang.Compiler$DefExpr.eval(Compiler.java:439)
at clojure.lang.Compiler.eval(Compiler.java:6787)
at clojure.lang.Compiler.load(Compiler.java:7227)
at user$eval1676.invoke(form-init2280240325964091253.clj:1)
at clojure.lang.Compiler.eval(Compiler.java:6782)
at clojure.lang.Compiler.eval(Compiler.java:6745)
at clojure.core$eval.invoke(core.clj:3081)
at clojure.main$repl$read_eval_print__7099$fn__7102.invoke(main.clj:240)
at clojure.main$repl$read_eval_print__7099.invoke(main.clj:240)
at clojure.main$repl$fn__7108.invoke(main.clj:258)
at clojure.main$repl.doInvoke(main.clj:258)
at clojure.lang.RestFn.invoke(RestFn.java:1523)
at clojure.tools.nrepl.middleware.interruptible_eval$evaluate$fn__609.invoke(interruptible_eval.clj:53)
at clojure.lang.AFn.applyToHelper(AFn.java:152)
at clojure.lang.AFn.applyTo(AFn.java:144)
at clojure.core$apply.invoke(core.clj:630)
at clojure.core$with_bindings_STAR_.doInvoke(core.clj:1868)
at clojure.lang.RestFn.invoke(RestFn.java:425)
at clojure.tools.nrepl.middleware.interruptible_eval$evaluate.invoke(interruptible_eval.clj:51)
at clojure.tools.nrepl.middleware.interruptible_eval$interruptible_eval$fn__651$fn__654.invoke(interruptible_eval.clj:183)
at clojure.tools.nrepl.middleware.interruptible_eval$run_next$fn__644.invoke(interruptible_eval.clj:152)
at clojure.lang.AFn.run(AFn.java:22)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Caused by: java.lang.InstantiationException: java.util.Map&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;at java.lang.Class.newInstance(Class.java:359)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at clojure.lang.Reflector.invokeMatchingMethod(Reflector.java:93)
at clojure.lang.Reflector.invokeNoArgInstanceMember(Reflector.java:313)
at clojure.java.data$fn__247.invoke(data.clj:95)
at clojure.lang.MultiFn.invoke(MultiFn.java:233)
at clojure.java.data$make_setter_fn$fn__232.invoke(data.clj:55)
at clojure.lang.AFn.applyToHelper(AFn.java:156)
at clojure.lang.AFn.applyTo(AFn.java:144)
at clojure.core$apply.invoke(core.clj:630)
at clojure.java.data$fn__247.invoke(data.clj:101)
at clojure.lang.MultiFn.invoke(MultiFn.java:233)
at clojure.lang.AFn.applyToHelper(AFn.java:156)
at clojure.lang.AFn.applyTo(AFn.java:144)
at clojure.lang.Compiler$InvokeExpr.eval(Compiler.java:3623)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;`&lt;/code&gt;&lt;/p&gt;
</description>
<category>java.data</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/7180/to-java-not-working-when-setter-takes-map-as-parameter?show=7180#q7180</guid>
<pubDate>Mon, 23 Feb 2026 15:28:05 +0000</pubDate>
</item>
<item>
<title>Closed: Handle primitive types and arrays</title>
<link>https://ask.clojure.org/index.php/7177/handle-primitive-types-and-arrays?show=7177#q7177</link>
<description>&lt;p&gt;Right now, there is no special handling for methods with primitive or array parameters.&lt;br&gt;
This results in errors, when trying to use bean classes, that have such methods, with to-java and from-java.&lt;/p&gt;
&lt;p&gt;The attached patch implements handling of primitives and arrays in the following manner:&lt;br&gt;
- When the :default methods of from-java and to-java see an array type, they extend the multimethods for that array type.&lt;br&gt;
  Issue: Is Iterable the right interface to extend the multimethod to? Sequential also came to mind, but Iterable was used elsewhere.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Values that hit a numeric primitive slot (in to-java) are manually boxed, so they aren't passed as longs.&lt;/li&gt;
&lt;/ul&gt;
</description>
<category>java.data</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/7177/handle-primitive-types-and-arrays?show=7177#q7177</guid>
<pubDate>Mon, 23 Feb 2026 15:26:36 +0000</pubDate>
</item>
<item>
<title>Closed: to-java not working on some setters</title>
<link>https://ask.clojure.org/index.php/7179/to-java-not-working-on-some-setters?show=7179#q7179</link>
<description>&lt;p&gt;In this example the last test fails.&lt;/p&gt;
&lt;p&gt;I have used org.codehause.mojo.rpm.Mapping(link: 1) as the example as this is where I discovered the bug.&lt;/p&gt;
&lt;p&gt;(link: 1) &lt;a rel=&quot;nofollow&quot; href=&quot;http://mojo.codehaus.org/rpm-maven-plugin/apidocs/org/codehaus/mojo/rpm/Mapping.html&quot;&gt;http://mojo.codehaus.org/rpm-maven-plugin/apidocs/org/codehaus/mojo/rpm/Mapping.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Tests:&lt;/p&gt;
&lt;p&gt;(do&lt;br&gt;
  (use 'clojure.java.data&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;       'clojure.test)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;  (import '(link: org.codehaus.mojo.rpm Mapping))&lt;/p&gt;
&lt;p&gt;  (testing &quot;setting normally&quot;&lt;/p&gt;
&lt;p&gt;  	(let (link: mapping (Mapping.))&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;	(.setConfiguration mapping &quot;a value&quot;)
	(.setDirectory mapping &quot;/tmp&quot;)

	(is (= (.getDirectory mapping) &quot;/tmp&quot;))
	(is (= (.getConfiguration mapping) &quot;a value&quot;))))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;  (testing &quot;setting via java-data&quot;                                                                                 &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(let (link: mapping (to-java Mapping {:configuration &quot;a value&quot; :directory &quot;/tmp&quot;}))
  (is (= (.getDirectory mapping) &quot;/tmp&quot;))
  (is (= (.getConfiguration mapping) &quot;a value&quot;)))))
&lt;/code&gt;&lt;/pre&gt;
</description>
<category>java.data</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/7179/to-java-not-working-on-some-setters?show=7179#q7179</guid>
<pubDate>Mon, 23 Feb 2026 15:25:47 +0000</pubDate>
</item>
<item>
<title>Closed: from-java on an object with Boolean attribute = false returns &quot;bad&quot; Booleans</title>
<link>https://ask.clojure.org/index.php/7184/from-java-object-boolean-attribute-false-returns-booleans?show=7184#q7184</link>
<description>&lt;p&gt;Calling from-java on an object that as a Boolean attribute that is false can return boxed Booleans that are not Boolean/FALSE.&lt;br&gt;
This results in a boolean that is equal to false, but results in the true path of if.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;`&lt;/code&gt;&lt;br&gt;
(def bool (:absolute (from-java (URI. &quot;&quot;))))&lt;/p&gt;
&lt;p&gt;bool &lt;br&gt;
=&amp;gt; false&lt;br&gt;
(= bool false)&lt;br&gt;
=&amp;gt; true&lt;br&gt;
(if bool true false)&lt;br&gt;
=&amp;gt; false&lt;br&gt;
&lt;code&gt;`&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This leads to really confusing behavior.&lt;br&gt;
As clojure won't change the behavior of if (&lt;a rel=&quot;nofollow&quot; href=&quot;https://dev.clojure.org/jira/browse/CLJ-1718&quot;&gt;https://dev.clojure.org/jira/browse/CLJ-1718&lt;/a&gt;) and we don't control the construction of the boolean, I think from-java should be aware of this problem and fix it.&lt;/p&gt;
&lt;p&gt;This could be fixed by adding an extra method for Boolean that reconstructs the Boolean in the right way, though I'm not sure what the best way would look like.&lt;/p&gt;
</description>
<category>java.data</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/7184/from-java-object-boolean-attribute-false-returns-booleans?show=7184#q7184</guid>
<pubDate>Mon, 23 Feb 2026 15:25:09 +0000</pubDate>
</item>
<item>
<title>Feature Request:Make anonymous fn/reify class name IDs per namespace instead of one global counter</title>
<link>https://ask.clojure.org/index.php/14935/feature-request-anonymous-namespace-instead-global-counter</link>
<description>&lt;p&gt;  Compiled anonymous functions and reify classes get names like ns$fn__4532, where the numeric suffix comes from a global AtomicInteger counter&lt;br&gt;
  (RT.nextID()).&lt;/p&gt;
&lt;p&gt; This counter is shared across the entire runtime and is consumed by fn classes, reify classes, constants tables, gensyms, etc.&lt;/p&gt;
&lt;p&gt;  The problem is that because the counter is global, any code change shifts the IDs for everything compiled after it. This makes profiling across builds&lt;br&gt;
  really painful, you can't meaningfully compare flame graphs because all the class names change even in code you didn't touch.&lt;/p&gt;
&lt;p&gt;  I'd like to propose scoping the ID counter per-namespace instead. Since the namespace is already part of the class name prefix, uniqueness is still&lt;br&gt;
  guaranteed. This would eliminate the cascading effect across unchanged namespaces and make profiling diffs actually useful.&lt;/p&gt;
&lt;p&gt;I'm not sure what's the downsides of this, but from what I saw of AtomicInteger, it isn't used a lot to break things.&lt;/p&gt;
&lt;p&gt;Thank you!&lt;/p&gt;
</description>
<category>Compiler</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/14935/feature-request-anonymous-namespace-instead-global-counter</guid>
<pubDate>Wed, 18 Feb 2026 15:34:38 +0000</pubDate>
</item>
<item>
<title>Answered: Is it valid for metadata to have metadata?</title>
<link>https://ask.clojure.org/index.php/14927/is-it-valid-for-metadata-to-have-metadata?show=14933#a14933</link>
<description>&lt;p&gt;Thanks for the additional info! I do think this is bug, which I've filed at &lt;a rel=&quot;nofollow&quot; href=&quot;https://clojure.atlassian.net/browse/CLJ-2941&quot;&gt;https://clojure.atlassian.net/browse/CLJ-2941&lt;/a&gt; and patch is welcome. &lt;/p&gt;
&lt;p&gt;If you need to sign the contributor agreement or get access to jira, please follow process at &lt;a rel=&quot;nofollow&quot; href=&quot;https://clojure.org/dev/dev#_becoming_a_contributor&quot;&gt;https://clojure.org/dev/dev#_becoming_a_contributor&lt;/a&gt;&lt;/p&gt;
</description>
<category>Metadata</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/14927/is-it-valid-for-metadata-to-have-metadata?show=14933#a14933</guid>
<pubDate>Tue, 17 Feb 2026 15:10:58 +0000</pubDate>
</item>
<item>
<title>Answered: clojure.java.doc.api/javadoc-data-fn does not include constructor info</title>
<link>https://ask.clojure.org/index.php/14920/clojure-java-doc-javadoc-data-does-include-constructor-info?show=14932#a14932</link>
<description>&lt;p&gt;That functionality is now present in the &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/clojure/java.doc/releases/tag/v0.1.4&quot;&gt;v0.1.4&lt;/a&gt; release.  &lt;/p&gt;
</description>
<category>java.doc</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/14920/clojure-java-doc-javadoc-data-does-include-constructor-info?show=14932#a14932</guid>
<pubDate>Fri, 13 Feb 2026 18:33:40 +0000</pubDate>
</item>
<item>
<title>Answered: javadoc-data-fn does not find selected method for inherited methods</title>
<link>https://ask.clojure.org/index.php/14921/javadoc-data-does-not-find-selected-method-inherited-methods?show=14931#a14931</link>
<description>&lt;p&gt;Great feedback. &lt;/p&gt;
&lt;p&gt;We were indeed not looking for inherited methods. That functionality is now present in the &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/clojure/java.doc/releases/tag/v0.1.4&quot;&gt;v0.1.4&lt;/a&gt; release.  &lt;/p&gt;
</description>
<category>java.doc</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/14921/javadoc-data-does-not-find-selected-method-inherited-methods?show=14931#a14931</guid>
<pubDate>Fri, 13 Feb 2026 18:33:01 +0000</pubDate>
</item>
<item>
<title>Answered: does deps.edd support &quot;exclusion&quot; with wild cards ?</title>
<link>https://ask.clojure.org/index.php/14922/does-deps-edd-support-exclusion-with-wild-cards?show=14925#a14925</link>
<description>&lt;p&gt;There is an existing enhancement jira for this at &lt;a rel=&quot;nofollow&quot; href=&quot;https://clojure.atlassian.net/browse/TDEPS-141&quot;&gt;https://clojure.atlassian.net/browse/TDEPS-141&lt;/a&gt;&lt;/p&gt;
</description>
<category>Clojure CLI</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/14922/does-deps-edd-support-exclusion-with-wild-cards?show=14925#a14925</guid>
<pubDate>Sun, 08 Feb 2026 17:14:18 +0000</pubDate>
</item>
</channel>
</rss>