gpt4 book ai didi

casting - 为什么我会收到 LazySeq 转换错误?

转载 作者:行者123 更新时间:2023-12-02 07:44:28 25 4
gpt4 key购买 nike

我写了下面的函数

(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)))

Block 和 playfield 都是向量的向量。出于某种原因,每次调用此函数时,都会出现以下错误:

#<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]] 测试 block 。 Playfield 太大而无法粘贴到此处,但它是一个包含 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]]

EDIT3:我进一步缩小了范围 - 以下代码有效。似乎访问 block 和运动场向量中的元素是导致问题的原因,但我仍然不知道为什么。

(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)))

谢谢

最佳答案

我很确定您并没有真正将向量传递给您的函数。它适用于您提供的向量,使用 clojure 1.3。

在 Clojure 中从集合中检索第 n 个值的更安全的方法是 nth功能。此函数适用于您传入的任何类型的集合,列表、向量、序列等。

正如 Joost 评论的那样,您的函数返回一个惰性序列,这可能不是您想要的。如果你绝对需要一个向量,你可以将 map 的结果传递给 vec .

关于casting - 为什么我会收到 LazySeq 转换错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7995112/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com