2012-07-19 57 views
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) 
    ) 

調用函數,我得到了下面aset和aget無法正常工作?和其他功能

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-d陣列上下文不正確,但這是我經過幾個小時的搜索後得到的。

編輯::

(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 ..)放在哪裏,那麼也會拋出異常呢?

回答

2

的是懶惰的,所以你需要將它包裝在一個(dorun)

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

否則asets實際上不會發生

aset可以直接在二維數組工作:

(aset-int array x y 42) 

該類拋出異常是由

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

它試圖調用定義var的結果,就像它是一個函數一樣。


編輯後:

(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) 
+0

dorun這裏是如此......你可以就如何一般性指導在clojure中是懶惰的作品,我應該什麼時候尋求熱切的評價? – 2012-07-19 21:43:14

+0

另外,(aset array x y 42)給出IllegalArgumentException參數類型不匹配java.lang.reflect.Array.set(:-2) – 2012-07-19 21:43:36

+0

但是我希望存儲保持在其他函數可以對其進行操作的狀態。我猜我的代碼沒有顯示我的意圖 – 2012-07-19 21:46:44