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