Существует ограничение в 64 КБ на размер метода в Java.Кажется, что в вашем случае метод, который создает большой векторный литерал, превышает этот предел.
На самом деле, вы можете проверить это самостоятельно, используя необычную библиотеку под названием clj-java-decompiler
.Вот краткий пример использования boot
:
(set-env!
:dependencies '[[com.clojure-goes-fast/clj-java-decompiler "0.1.0"]])
(require '[clj-java-decompiler.core :as d])
(d/decompile-form
{}
[[1 :qwre :asdf]
[2 :zxcv :fafa]
[3 :zxcv :fafa]])
;; ==> prints:
;;
;; // Decompiling class: cjd__init
;; import clojure.lang.*;
;;
;; public class cjd__init
;; {
;; public static final AFn const__10;
;;
;; public static void load() {
;; const__10;
;; }
;;
;; public static void __init0() {
;; const__10 = (AFn)Tuple.create((Object)Tuple.create((Object)1L, (Object)RT.keyword((String)null, "qwre"), (Object)RT.keyword((String)null, "asdf")), (Object)Tuple.create((Object)2L, (Object)RT.keyword((String)null, "zxcv"), (Object)RT.keyword((String)null, "fafa")), (Object)Tuple.create((Object)3L, (Object)RT.keyword((String)null, "zxcv"), (Object)RT.keyword((String)null, "fafa")));
;; }
;;
;; static {
;; __init0();
;; Compiler.pushNSandLoader(RT.classForName("cjd__init").getClassLoader());
;; try {
;; load();
;; Var.popThreadBindings();
;; }
;; finally {
;; Var.popThreadBindings();
;; }
;; }
;; }
;;
Как видите, есть метод __init0
, который создает фактический объект Java для векторного литерала.Учитывая достаточное количество элементов в векторе, размер метода может легко превысить предел в 64 КБ.
Я думаю, что в вашем случае самое простое решение этой проблемы - поместить ваш вектор в файл, а затем slurp
+ прочитайте этот файл.Примерно так:
файл vector.edn
:
[[1 :qwre :asdf]
[2 :zxcv :fafa]
...
]
и затем в вашем коде:
(def x (clojure.edn/read-string (slurp "vector.edn"))