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

编辑::

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

否则资产实际上不会发生

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)
于 2012-07-19T21:33:57.233 回答