<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>Clojure Q&amp;A - Recent questions tagged 1.12</title>
<link>https://ask.clojure.org/index.php/tag/1.12</link>
<description></description>
<item>
<title>Clojure 1.12 breaks Serialization for records implementing IFn</title>
<link>https://ask.clojure.org/index.php/14410/clojure-breaks-serialization-for-records-implementing-ifn</link>
<description>&lt;p&gt;If you have a class/record that implements a functional interface AND &lt;code&gt;IFn&lt;/code&gt;, serializing it will throw the same error as CLJ-2880. Here's a repro&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(let [^java.util.function.Function my-f
      (reify
        Serializable
        java.util.function.Function
        clojure.lang.IFn
        )]
  (with-open [os (java.io.ObjectOutputStream. (java.io.ByteArrayOutputStream.))]
    (.writeObject os my-f)))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Will throw &lt;code&gt;java.io.NotSerializableException&lt;/code&gt;. If you comment out &lt;code&gt;clojure.lang.IFn&lt;/code&gt;, this code works.&lt;/p&gt;
&lt;p&gt;This is a regression from 1.11.&lt;/p&gt;
</description>
<category>Clojure</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/14410/clojure-breaks-serialization-for-records-implementing-ifn</guid>
<pubDate>Fri, 21 Feb 2025 20:51:39 +0000</pubDate>
</item>
<item>
<title>Java interop issue</title>
<link>https://ask.clojure.org/index.php/14240/java-interop-issue</link>
<description>&lt;p&gt;Hi everyone,&lt;/p&gt;
&lt;p&gt;Failing to make clojure work with our commercial java library. I can run the following Java code on my machine and it works fine: &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import com.numerix.pro.Application;
import com.numerix.pro.ApplicationCall;
import com.numerix.pro.ApplicationData;
import com.numerix.pro.ApplicationObjectFactory;
import com.numerix.pro.ApplicationWarning;

public final class FxAmericanOption {

    public static void main(final String argv[]) 
    {
        int rVal = 0;      // exit value
        try {
            System.out.println(&quot;Running: &quot; + new Throwable().getStackTrace()[0].getClassName() + &quot;\n&quot;);

            final Application app = new Application();
            {
                final ApplicationCall call = new ApplicationCall();
                call.addValue(&quot;ID&quot;,       &quot;USD_Curve&quot;);
                call.addValue(&quot;OBJECT&quot;,   &quot;Curve&quot;);
                call.addValue(&quot;TYPE&quot;,     &quot;Yield&quot;);
                call.addValue(&quot;Now Date&quot;, ApplicationObjectFactory.parseDate(&quot;26-Oct-2003&quot;));
                call.addValue(&quot;CURRENCY&quot;, &quot;USD&quot;);
                call.addValue(&quot;RATE&quot;,     0.04);

                final String[] outHeaders =
                    new String[] {&quot;Updated&quot;, &quot;Timer&quot;, &quot;ID&quot;};

                final ApplicationWarning warning = new ApplicationWarning();

                app.call(call, outHeaders, warning);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I tried porting it to clojure 1.12 like this &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(ns hello
  (:import (com.numerix.pro Application ApplicationCall
                            ApplicationWarning 
                            ApplicationObjectFactory)))
           
(def myapp (new Application))
(def appcall (new ApplicationCall))
(def warning (new ApplicationWarning))

(.addValue ^ApplicationCall appcall &quot;NAME&quot; &quot;Yield Curve&quot;)
(.addValue ^ApplicationCall appcall &quot;ID&quot; &quot;MyCurve&quot;)
(.addValue ^ApplicationCall appcall &quot;OBJECT&quot; &quot;Curve&quot;)
(.addValue ^ApplicationCall appcall &quot;TYPE&quot; &quot;Yield&quot;)
(.addValue ^ApplicationCall appcall &quot;Now Date&quot; (ApplicationObjectFactory/parseDate &quot;26-Oct-2023&quot;))
(.addValue ^ApplicationCall appcall &quot;CURRENCY&quot; &quot;USD&quot;)
(.addValue ^ApplicationCall appcall &quot;RATE&quot; 0.04)

(def outHeaders (into-array String [&quot;timer&quot; &quot;id&quot;]))

(^[ApplicationCall String/1 ApplicationWarning] Application/.call ^Application myapp
                                                                  ^ApplicationCall appcall
                                                                  ^String/1 outHeaders
                                                                  ^ApplicationWarning warning)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I can inspect appcall object and it looks totally fine - all the .addValue register correctly with it. But when I evaluate the last form with Application/.call I get an error which I don't understand how to address.. &lt;/p&gt;
&lt;pre&gt;&lt;code&gt; Execution error (IllegalAccessError) at hello/eval10370 (REPL:25).
; failed to access class com.numerix.pro.ApplicationCommon from class hello$eval10370 (com.numerix.pro.ApplicationCommon is in unnamed module of loader 'app'; hello$eval10370 is in unnamed module of loader clojure.lang.DynamicClassLoader @cc01572)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Any help much appreciated! &lt;/p&gt;
</description>
<category>Java Interop</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/14240/java-interop-issue</guid>
<pubDate>Tue, 12 Nov 2024 19:25:31 +0000</pubDate>
</item>
<item>
<title>New add-lib in Clojure 1.12 doesn't load data readers brought by the lib</title>
<link>https://ask.clojure.org/index.php/14068/new-add-lib-clojure-doesnt-load-data-readers-brought-the-lib</link>
<description>&lt;p&gt;I see that the new &lt;code&gt;add-lib&lt;/code&gt; in Clojure 1.12 doesn't call &lt;code&gt;clojure.core/load-data-readers&lt;/code&gt; (like clojure.core does on loading) so if you bring libraries that have data-readers you can't use them.&lt;/p&gt;
&lt;p&gt;Calling &lt;code&gt;clojure.core/load-data-readers&lt;/code&gt; from the repl doesn't solve the issue since it changes &lt;code&gt;*data-readers*&lt;/code&gt; root value which is already being shadowed by clojure.main/repl.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ clj -Sdeps '{:deps {org.clojure/clojure {:mvn/version &quot;1.12.0-rc1&quot;} com.github.flow-storm/flow-storm-dbg {:mvn/version &quot;3.17.2&quot;}}}'
Clojure 1.12.0-rc1
user=&amp;gt; *data-readers*
{trace #'flow-storm.api/read-trace-tag, ctrace #'flow-storm.api/read-ctrace-tag, rtrace #'flow-storm.api/read-rtrace-tag, tap #'flow-storm.api/read-tap-tag, tap-stack-trace #'flow-storm.api/read-tap-stack-trace-tag, flow-storm.types/value-ref #'flow-storm.types/make-value-ref, amalloy/ring-buffer #'amalloy.ring-buffer/read-method}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;now with add-lib :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ clj -Sdeps '{:deps {org.clojure/clojure {:mvn/version &quot;1.12.0-rc1&quot;}}}'                                                             
Clojure 1.12.0-rc1
user=&amp;gt; (add-lib 'com.github.flow-storm/flow-storm-dbg {:mvn/version &quot;3.17.2&quot;})
[...]
user=&amp;gt; *data-readers*
{}
user=&amp;gt; (#'clojure.core/load-data-readers)
{trace #'flow-storm.api/read-trace-tag, ctrace #'flow-storm.api/read-ctrace-tag, rtrace #'flow-storm.api/read-rtrace-tag, tap #'flow-storm.api/read-tap-tag, tap-stack-trace #'flow-storm.api/read-tap-stack-trace-tag, flow-storm.types/value-ref #'flow-storm.types/make-value-ref, amalloy/ring-buffer #'amalloy.ring-buffer/read-method}
user=&amp;gt; *data-readers*
{}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The only way I see to bring in data-readers with add-lib is by starting a sub-repl :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;clj -Sdeps '{:deps {org.clojure/clojure {:mvn/version &quot;1.12.0-rc1&quot;}}}'
Clojure 1.12.0-rc1
user=&amp;gt; (add-lib 'com.github.flow-storm/flow-storm-dbg {:mvn/version &quot;3.17.2&quot;})
[...]
user=&amp;gt; (binding [*data-readers* (#'clojure.core/load-data-readers)] (clojure.main/repl))
user=&amp;gt; *data-readers*
{trace #'flow-storm.api/read-trace-tag, ctrace #'flow-storm.api/read-ctrace-tag, rtrace #'flow-storm.api/read-rtrace-tag, tap #'flow-storm.api/read-tap-tag, tap-stack-trace #'flow-storm.api/read-tap-stack-trace-tag, flow-storm.types/value-ref #'flow-storm.types/make-value-ref, amalloy/ring-buffer #'amalloy.ring-buffer/read-method}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;which won't work with nrepl tooling.&lt;/p&gt;
</description>
<category>Clojure</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/14068/new-add-lib-clojure-doesnt-load-data-readers-brought-the-lib</guid>
<pubDate>Tue, 20 Aug 2024 20:42:06 +0000</pubDate>
</item>
<item>
<title>Make partitionv faster</title>
<link>https://ask.clojure.org/index.php/13232/make-partitionv-faster</link>
<description>&lt;p&gt;If we use the &lt;code&gt;cat&lt;/code&gt; transducer instead of calling &lt;code&gt;(concat p pad)&lt;/code&gt;, the code is much faster:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(defn partitionv [n step pad coll]
  (lazy-seq
    (when-let [s (seq coll)]
      (let [p (into [] (take n) s)]
        (if (= n (count p))
          (cons p (partitionv n step pad (nthrest s step)))
          (list (into [] (take n) (concat p pad))))))))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;can be changed to&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(defn partitionv2 [n step pad coll]
  (lazy-seq
    (when-let [s (seq coll)]
      (let [p (into [] (take n) s)]
        (if (= n (count p))
          (cons p (partitionv n step pad (nthrest s step)))
          (list (into [] (comp cat (take n)) [p pad])))))))
&lt;/code&gt;&lt;/pre&gt;
</description>
<category>Clojure</category>
<guid isPermaLink="true">https://ask.clojure.org/index.php/13232/make-partitionv-faster</guid>
<pubDate>Wed, 30 Aug 2023 16:34:12 +0000</pubDate>
</item>
</channel>
</rss>