Почему я получаю ошибку приведения в LazySeq? - PullRequest
2 голосов
/ 03 ноября 2011

Я написал следующую функцию

(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] для [xy] и [[0 0 0] [0 1 0] [1 11]] для блока.Поле воспроизведения слишком велико для вставки, но это вектор из 26 векторов, содержащих целые числа, длиной 14.

EDIT2: Вот вектор игрового поля.

[[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: Я сузил это дальше - следующий код работает.Кажется, что проблема связана с доступом к элементам в векторах блоков и игровых полей, но я до сих пор не знаю, почему.

(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 Ответ

7 голосов
/ 04 ноября 2011

Я почти уверен, что вы не передаете векторы своей функции.Он работает с указанными векторами, используя clojure 1.3.

Более безопасный способ получения n-го значения из коллекции в clojure - это функция nth .Эта функция будет работать с любым типом коллекции, которую вы передаете, списками, векторами, последовательностями и т. Д.

Как прокомментировал Joost, ваша функция возвращает ленивую последовательность, которая может не соответствовать вашим ожиданиям.Если вам абсолютно необходим вектор назад, вы можете передать результат карты в vec .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...