Clojure seq到vec转换-键必须为整数

Clojure seq到vec转换-键必须为整数,clojure,Clojure,我想得到向量eg中nil元素的指数。 [1 nil 3 nil 4 nil]=>[1 3 4 7] (定义零索引[vec] (vec(删除零)(映射) #(如果(=(第二%)无(第一%) (所有2个分区(交错(范围(计数向量))向量‘‘‘‘‘‘) ) 运行此代码会导致 java.lang.IllegalArgumentException:键必须是整数 (无源文件:0) 如果我忽略了围绕所有内容的(vec)调用,它似乎可以工作,但返回的是序列而不是向量 谢谢大家! 试试这个: (定义零索引[v]

我想得到向量eg中nil元素的指数。 [1 nil 3 nil 4 nil]=>[1 3 4 7]

(定义零索引[vec]
(vec(删除零)(映射)
#(如果(=(第二%)无(第一%)
(所有2个分区(交错(范围(计数向量))向量‘‘‘‘‘‘)
)
运行此代码会导致

java.lang.IllegalArgumentException:键必须是整数 (无源文件:0)

如果我忽略了围绕所有内容的(vec)调用,它似乎可以工作,但返回的是序列而不是向量

谢谢大家!

试试这个:

(定义零索引[v]
(vec(删除零)(映射)
#(如果(=(第二%)无(第一%)
(所有2个分区(交错(范围(计数v))v()()())))
Clojure是一个LISP-1:它对函数和数据都有一个名称空间,因此当您调用
(vec…
)时,您试图将结果序列作为参数传递给数据,而不是传递给标准库vec函数。

请尝试以下操作:

(定义零索引[v]
(vec(删除零)(映射)
#(如果(=(第二%)无(第一%)
(所有2个分区(交错(范围(计数v))v()()())))

Clojure是一个LISP-1:它对函数和数据都有一个名称空间,因此当您调用
(vec…
)时,您试图将结果序列作为参数传递给数据,而不是传递给标准库vec函数。

请参阅问题的其他答案(您正在跟踪
vec
),但是考虑使用更简单的方法。

map
可以接受多个参数,在这种情况下,它们作为附加参数传递给map函数,例如
(map f c1 c2…
调用
(f(first c1)(first c2)…)
等,直到其中一个序列参数用尽

这意味着您的
(分区全部2(交错…)
是一种非常详细的说法
(映射列表(范围)v)
。还有一个函数
映射索引
,它做同样的事情。但是,它只接受一个序列参数,因此
(映射索引为f c1 c2)
是不合法的

以下是使用
映射索引
、线程和
nil?
为清晰起见重写的函数:

(定义零索引[v]
;注:地图fn称为like(f范围项目v-项目)
;与代码中的(f(范围项v-item))不同。
(>>(映射索引的#)(当(nil?%2)%1)v);像(映射#)(当…(范围)v)
(删除零?)
vec)
但是,您可以使用reduce和
reduce kv
功能来代替。此函数类似于
reduce
,只是reduce函数接收三个参数,而不是两个:累加器、集合中项的键(向量索引、映射键)和项本身。使用
reduce kv
可以更清楚地重写此函数(并且它可能会运行得更快,尤其是在瞬态情况下):

(定义零索引[v]
(减少千伏#(如果(零?%3)(联合%1%2)%1)[v))

<>代码> 查看您的问题的其他答案(您正在跟踪<代码> VEC<代码>),但请考虑使用更简单的方法。

map
可以接受多个参数,在这种情况下,它们作为附加参数传递给map函数,例如
(map f c1 c2…
调用
(f(first c1)(first c2)…)
等,直到其中一个序列参数用尽

这意味着您的
(分区全部2(交错…)
是一种非常详细的说法
(映射列表(范围)v)
。还有一个函数
映射索引
,它做同样的事情。但是,它只接受一个序列参数,因此
(映射索引为f c1 c2)
是不合法的

以下是使用
映射索引
、线程和
nil?
为清晰起见重写的函数:

(定义零索引[v]
;注:地图fn称为like(f范围项目v-项目)
;与代码中的(f(范围项v-item))不同。
(>>(映射索引的#)(当(nil?%2)%1)v);像(映射#)(当…(范围)v)
(删除零?)
vec)
但是,您可以使用reduce和
reduce kv
功能来代替。此函数类似于
reduce
,只是reduce函数接收三个参数,而不是两个:累加器、集合中项的键(向量索引、映射键)和项本身。使用
reduce kv
可以更清楚地重写此函数(并且它可能会运行得更快,尤其是在瞬态情况下):

(定义零索引[v]
(减少千伏#(如果(零?%3)(联合%1%2)%1)[v))

该死,我怎么会错过这个:我以为你来自LISP-2的背景;这是一个相当有争议的分歧该死,我怎么会错过这个:我以为你来自LISP-2的背景;这是一个相当有争议的分歧在第一个示例中,您可以使用
映射索引
来省略
(范围)
(映射索引#)(当(nil?%2)%1)v)
一些建议:1。如果函数值得定义,则将筛选谓词-here
nil?
-作为参数。2.在第一个解决方案中,将最后一个
vec
留给调用者,为潜在的大、甚至无限的序列参数保留惰性。3.在
->
主题下,索引的
地图可能更整洁。因此:
(defn index filter[pred coll](>>coll(map indexed#)(when(pred%2)%1))(remove nil?)
例如,
(index filter nil?[nil 1 2 nil 4 nil nil])=>(0 3 5 6)
您可以在第一个示例中使用
map indexed
来省略
(范围)
(map indexed#(when(nil?%2)%1)v)
一些建议:1。如果函数值得定义,则将筛选谓词-here
nil?
-作为参数。2.在第一个解决方案中,将最后的
vec
留给调用者,为潜在的用户保留惰性