aset和aget工作不正常?并从其他函数调用函数

时间:2012-07-19 20:41:53

标签: exception clojure

  (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的二维数组上下文中的用法是不正确的,但这是我经过几个小时的搜索后得到的。

编辑::

(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 ..)放在哪里,因为它也会引发异常?

1 个答案:

答案 0 :(得分:2)

for是懒惰所以你需要将它包装在(dorun)

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

否则asets实际上不会发生

aset可以直接在2d数组上运行:

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