1
  (declare storage)
    (defn initialize-storage []) ((def storage 
       (make-array Integer/TYPE 3  3))
      (for [ i (range 1 3 )
             j (range 1 3 )]
               (aset (aget storage i) j 100)
         )
      (use 'clojure.pprint)
      (pprint storage)
      )

私は以下を取得します

ClassCastException [[I cannot be cast to clojure.lang.IFn  clojure.lang.Var.fn (Var.java:378)
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]

アイデアは、すべての値を100に設定することです

aset の 2 次元配列コンテキストでの使用法が正しくないと思われますが、かなりの数時間の検索の後に得られたものです。

編集::

(use 'clojure.pprint)
 (defn initialize-storage []) ((def storage 
           (make-array Integer/TYPE 3  3))
          (for [ i (range 1 3 )
                 j (range 1 3 )]
                   (aset-int storage i j 100))          
          (pprint storage))

これで、ストレージが設定されました。この関数を呼び出してから、他のタスクを実行する別の関数が必要です。しかし、見つからない例外が発生しますinitialise-storage

名前空間を持つことは、この点でどのように役立ちますか? 関数は互いの存在を認識していますか、それとも公開して公開する必要がありますか? これらはすべて名前空間内にある必要がありますか? 次に、(def ..) をどこに配置すれば、例外もスローされるのでしょうか?

4

1 に答える 1

2

for は怠惰なので、(dorun) でラップする必要があります

(dorun (for [ i (range 1 3 )
              j (range 1 3 )]
          (aset (aget storage i) j 100)))

そうしないと、資産は実際には発生しません

aset2次元配列を直接操作できます:

 (aset-int array x y 42)

クラスキャスト例外が原因で発生しています

((def storage 
   (make-array Integer/TYPE 3  3))

これは、変数を関数であるかのように定義した結果を呼び出そうとしています。


編集後:

(use 'clojure.pprint)
(defn initialize-storage []) ; empty function deffinition here

( (def storage ;extra paren here
    (make-array Integer/TYPE 3  3))

  (for [ i (range 1 3 ) ; leaves the first row unmodified
       j (range 1 3 )] ; leaves the first columb unmodified
   (aset-int storage i j 100)) ;unevaluated for loop here
 (pprint storage) ) ; extra parens here

おそらく、これはあなたが探しているものに近いでしょう:

(use 'clojure.pprint)
(def storage (make-array Integer/TYPE 3  3))
(defn initialize-storage []
  (doall (for [ i (range 0 3 )
               j (range 0 3 )]
           (aset-int storage i j 100))))          
(pprint storage)
于 2012-07-19T21:33:57.233 に答える