大的defrecord导致“方法代码太大”

时间:2016-03-01 21:09:24

标签: clojure

有没有办法建立一个有很多字段的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])

删除任何字段时都可以创建记录。

1 个答案:

答案 0 :(得分:2)

Java的方法具有最大大小(有关详细信息,请参阅this question的答案)。 defrecord创建方法,其大小取决于记录将包含的值的数量。

为了解决这个问题,我看到两个选择:

  1. macroexpand-1您对defrecord的调用,复制结果,并找到重新编写生成的方法的方法。
  2. 采用不同的方法来存储您的数据,例如使用Clojure的vector类。
  3. 修改

    现在我知道你想做什么,我更确信你应该使用矢量。既然你想使用像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,并使用生成的索引对您的数据执行矢量操作。