2011-11-03 54 views
2

我已经写了下面的函数为什么我得到一个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))) 

感谢

+1

还请显示您提供的参数以获取该错误。 '(insert-block [1 1] [[1 2] [1 2]] [[1 2 3] [4 5 6] [6 8 9]])'例如不会抛出异常,但我不知道如果这是预期的或没有。我希望你提供了seq而不是vector作为'block'和or'playfield'的参数。还要注意你的函数返回一个seq而不是一个向量,如果你假设游戏场总是向量,这看起来是错误的。 –

+0

你说得对,我应该包括那个。我编辑了这篇文章。 你对地图也是正确的 - 这可能会导致未来的问题,虽然这似乎与这个问题无关。 – Joel

+0

对我来说,它为某些输入提供了索引超出界限的异常,而不是指出的错误。 –

回答

7

我敢肯定你没有真正传递载体,以你的函数。它适用于你提供的载体,使用clojure 1.3。

从clojure中的集合中检索第n个值的更安全的方法是nth函数。这个函数适用于你传入的任何类型的集合,列表,向量,序列等等。

由于Joost评论说,你的函数返回一个懒惰的序列,这可能不是你想要的。如果你绝对需要一个向量,你可以将地图的结果传递给vec

+0

刚刚注意到OP在我完成我的回答时通过Joost的评论发现了它。我应该删除这个答案,还是仍然有用? – Daan

+0

我会留下答案,比在没有答案的列表上留下答案 –

+0

对于将来阅读此内容的任何人而言,这一点更为明显 - 我会放弃它。 – Joel