有没有办法建立一个包含许多字段的defrecord?似乎有大约122个字段的限制,因为这会导致“方法代码太大!”错误:
(defrecord WideCsvFile
[a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19
a20 a21 a22 a23 a24 a25 a26 a27 a28 a29 a30 a31 a32 a33 a34 a35 a36 a37 a38 a39
a40 a41 a42 a43 a44 a45 a46 a47 a48 a49 a50 a51 a52 a53 a54 a55 a56 a57 a58 a59
a60 a61 a62 a63 a64 a65 a66 a67 a68 a69 a70 a71 a72 a73 a74 a75 a76 a77 a78 a79
a80 a81 a82 a83 a84 a85 a86 a87 a88 a89 a90 a91 a92 a93 a94 a95 a96 a97 a98 a99
a100 a101 a102 a103 a104 a105 a106 a107 a108 a109 a110 a111 a112 a113 a114 a115 a116 a117 a118 a119
a120 a121 a122])
而删除任何字段都可以创建记录。
最佳答案
Java的方法具有最大大小(有关详细信息,请参见this question的答案)。 defrecord
创建方法,其大小取决于记录将包含的值的数量。
为了解决此问题,我看到两个选择:
macroexpand-1
您对defrecord
的调用,复制结果,并找到一种方法来将生成的方法重写为较小的方法。 vector
类。 编辑:
现在,我知道您想做什么,我更加确信您应该使用向量。由于您要使用像
a101
这样的索引,因此我为您编写了一个宏来生成它们:(defmacro auto-index-vector [v prefix]
(let [indices (range (count (eval v)))
definitions (map (fn [ind]
`(def ~(symbol (str prefix ind)) ~ind)) indices)]
`(do ~@definitions)))
让我们尝试一下!
stack-prj.bigrecord> (def v1 (into [] (range 122)))
#'stack-prj.bigrecord/v1
stack-prj.bigrecord> (auto-index-vector v1 "a")
#'stack-prj.bigrecord/a121
stack-prj.bigrecord> (v1 a101)
101
stack-prj.bigrecord> (assoc v1 a101 "hi!")
[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
95 96 97 98 99 100 "hi!" 102 103 104 105 106 107 108 109 110 111 112
113 114 115 116 117 118 119 120 121]
要使用此功能,您需要将CSV数据读入向量,并使用选择的前缀在其上调用
auto-index-vector
,然后使用生成的索引对数据执行向量操作。关于clojure - 较大的defrecord导致 "Method code too large",我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35733558/