我已经写了下面的函数为什么我得到一个LazySeq转换错误?
(defn insert-block
"Given a block, coordinate and playfield, returns the altered playfield.
Does not check for collisions."
[[x y] block playfield]
(let [blocksize (count block)
insertion (fn [a b] (vector (block a) (playfield b)))
block-indicies (range 0 blocksize)
field-indicies (range y (+ y blocksize))]
(map insertion block-indicies field-indicies)))
块和操场是向量的两个向量。出于某种原因,我每次调用这个函数的时候,我得到以下错误:
#<ClassCastException java.lang.ClassCastException: clojure.lang.LazySeq cannot be cast to clojure.lang.IFn>
的功能已经被简化从什么在我的代码位 - “插入”是在原有的更复杂,但我得到无论同样的错误。这让我疯狂 - 有没有人有任何想法?
编辑:我一直在测试它[2 3]的[x y]和[[0 0 0] [0 1 0] [1 1 1]]。 Playfield太大而不能粘贴在这里,但它是一个包含整数长度为14的矢量向量。
编辑2:这里是游戏区矢量。
[[1 1 1 1 1 1 1 1 1 1 1 1 1 1]
[1 1 1 1 1 1 1 1 1 1 1 1 1 1]
[1 1 0 0 0 0 0 0 0 0 0 0 1 1]
[1 1 0 0 0 0 0 0 0 0 0 0 1 1]
[1 1 0 0 0 0 0 0 0 0 0 0 1 1]
[1 1 0 0 0 0 0 0 0 0 0 0 1 1]
[1 1 0 0 0 0 0 0 0 0 0 0 1 1]
[1 1 0 0 0 0 0 0 0 0 0 0 1 1]
[1 1 0 0 0 0 0 0 0 0 0 0 1 1]
[1 1 0 0 0 0 0 0 0 0 0 0 1 1]
[1 1 0 0 0 0 0 0 0 0 0 0 1 1]
[1 1 0 0 0 0 0 0 0 0 0 0 1 1]
[1 1 0 0 0 0 0 0 0 0 0 0 1 1]
[1 1 0 0 0 0 0 0 0 0 0 0 1 1]
[1 1 0 0 0 0 0 0 0 0 0 0 1 1]
[1 1 0 0 0 0 0 0 0 0 0 0 1 1]
[1 1 0 0 0 0 0 0 0 0 0 0 1 1]
[1 1 0 0 0 0 0 0 0 0 0 0 1 1]
[1 1 0 0 0 0 0 0 0 0 0 0 1 1]
[1 1 0 0 0 0 0 0 0 0 0 0 1 1]
[1 1 0 0 0 0 0 0 0 0 0 0 1 1]
[1 1 0 0 0 0 0 0 0 0 0 0 1 1]
[1 1 0 0 0 0 0 0 0 0 0 0 1 1]
[1 1 0 0 0 0 0 0 0 0 0 0 1 1]
[1 1 1 1 1 1 1 1 1 1 1 1 1 1]
[1 1 1 1 1 1 1 1 1 1 1 1 1 1]]
编辑3:我进一步缩小了范围 - 下面的代码工作。看起来访问块和playfield矢量中的元素是导致问题的原因,但我仍然不知道为什么。
(defn insert-block
"Given a block, coordinate and playfield, returns the altered playfield.
Does not check for collisions."
[[x y] block playfield]
(let [blocksize (count block)
insertion (fn [a b] (vector a b))
block-indicies (range 0 blocksize)
field-indicies (range y (+ y blocksize))]
(map insertion block-indicies field-indicies)))
感谢
还请显示您提供的参数以获取该错误。 '(insert-block [1 1] [[1 2] [1 2]] [[1 2 3] [4 5 6] [6 8 9]])'例如不会抛出异常,但我不知道如果这是预期的或没有。我希望你提供了seq而不是vector作为'block'和or'playfield'的参数。还要注意你的函数返回一个seq而不是一个向量,如果你假设游戏场总是向量,这看起来是错误的。 –
你说得对,我应该包括那个。我编辑了这篇文章。 你对地图也是正确的 - 这可能会导致未来的问题,虽然这似乎与这个问题无关。 – Joel
对我来说,它为某些输入提供了索引超出界限的异常,而不是指出的错误。 –