2011-11-03 26 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

相關問題