如何在clojure中使用嵌套for
我有一个列表列表,1,2,3,42,3,4,53,4,5,6,我想在clojure中实现for循环。我想首先得到第一个列表,即1,2,3,4,然后在这里再次实现for循环来得到每个元素如何在clojure中使用嵌套for,clojure,Clojure,我有一个列表列表,1,2,3,42,3,4,53,4,5,6,我想在clojure中实现for循环。我想首先得到第一个列表,即1,2,3,4,然后在这里再次实现for循环来得到每个元素 谢谢你如果你想循环浏览所有数字,就像它们在一个列表中一样,你可以将列表展平: > (flatten `((1,2,3,4)(2,3,4,5)(3,4,5,6))) (1 2 3 4 2 3 4 5 3 4 5 6) 之后,要对所有数字执行操作,可以使用数字列表中的任何函数。下面是一个使用reduce和+的
谢谢你如果你想循环浏览所有数字,就像它们在一个列表中一样,你可以将列表展平:
> (flatten `((1,2,3,4)(2,3,4,5)(3,4,5,6)))
(1 2 3 4 2 3 4 5 3 4 5 6)
之后,要对所有数字执行操作,可以使用数字列表中的任何函数。下面是一个使用reduce和+的示例:
for表达式用于将一个集合转换为另一个集合,即返回值。doseq表达式意味着有副作用,并且总是返回nil
下面是一些示例代码和结果。请注意,我通常更喜欢forv而不是for,因为forv并不懒惰,并且总是以向量形式返回结果
(ns xyz
(:require [tupelo.core :as t] ))
(t/refer-tupelo)
(def data
'[ (1,2,3,4)
(2,3,4,5)
(3,4,5,6) ] )
(newline)
(println "forv demo")
(spyx (forv [i [1 2 3]]
(spyx i )))
(newline)
(println "doseq demo")
(spyx (doseq [i [1 2 3]]
(spyx i )))
(println "-----------------------------------------------------------------------------")
(newline)
(println "for 1d")
(println "final result ="
(forv [sub-list data]
(spyx sub-list )))
(newline)
(println "for 2d")
(println "final result ="
(forv [sub-list data
int-val sub-list]
(spyx int-val )))
(newline)
(newline)
(println "for 2d-2")
(println "final result ="
(forv [sub-list data]
(forv [int-val sub-list]
(spyx int-val ))))
(newline)
(println "-----------------------------------------------------------------------------")
(newline)
(println "doseq 1d")
(doseq [sub-list data]
(println "sub-list =" sub-list ))
(newline)
(println "doseq 2d")
(doseq [sub-list data]
(doseq [int-val sub-list]
(spyx int-val )))
(newline)
(println "doseq 2d-2")
(doseq [sub-list data
int-val sub-list]
(spyx int-val ))
第一个显示了两个循环覆盖数据,但是for/forv返回一个新集合,而doseq返回nil,并且仅用于副作用
forv demo
i => 1
i => 2
i => 3
(forv [i [1 2 3]] (spyx i)) => [1 2 3]
doseq demo
i => 1
i => 2
i => 3
(doseq [i [1 2 3]] (spyx i)) => nil
第二部分说明如何将for用于一维或二维循环。此外,单个forv语句可以用于二维循环,也可以嵌套forv语句。请注意这3种情况的最终结果中嵌套的差异
-----------------------------------------------------------------------------
for 1d
sub-list => (1 2 3 4)
sub-list => (2 3 4 5)
sub-list => (3 4 5 6)
final result = [(1 2 3 4) (2 3 4 5) (3 4 5 6)]
for 2d
int-val => 1
int-val => 2
int-val => 3
int-val => 4
int-val => 2
int-val => 3
int-val => 4
int-val => 5
int-val => 3
int-val => 4
int-val => 5
int-val => 6
final result = [1 2 3 4 2 3 4 5 3 4 5 6]
for 2d-2
int-val => 1
int-val => 2
int-val => 3
int-val => 4
int-val => 2
int-val => 3
int-val => 4
int-val => 5
int-val => 3
int-val => 4
int-val => 5
int-val => 6
final result = [[1 2 3 4] [2 3 4 5] [3 4 5 6]]
-----------------------------------------------------------------------------
doseq语法类似于for,但只有像print这样的副作用对外部可见。doseq总是返回nil。这也意味着返回值与forv没有嵌套差异
请注意,您的project.clj需要包括以下内容才能使spyx正常工作
:依赖项[
[图佩洛0.9.10]
Clojure的for不是循环结构。
它是一个宏,生成所需嵌套
映射、筛选和take while调用。这些调用对序列进行操作。
它总是产生一个惰性序列。
从你的问题中,我推断你理解1,但不理解2或3。如果你想有效地使用Clojure,请理解它们的术语,你的问题就会自动回答。我不清楚你在问什么。Clojure for宏的语义与其他语言所要求的语义不相同,因此不知道如何使用它你将要使用结果,不可能说任何给定的解决方案是否真的实现了你想要的。也不太了解需求你可能需要最终嵌套的“reduce”或最终嵌套的“loop recurr”来完成特定的工作
-----------------------------------------------------------------------------
for 1d
sub-list => (1 2 3 4)
sub-list => (2 3 4 5)
sub-list => (3 4 5 6)
final result = [(1 2 3 4) (2 3 4 5) (3 4 5 6)]
for 2d
int-val => 1
int-val => 2
int-val => 3
int-val => 4
int-val => 2
int-val => 3
int-val => 4
int-val => 5
int-val => 3
int-val => 4
int-val => 5
int-val => 6
final result = [1 2 3 4 2 3 4 5 3 4 5 6]
for 2d-2
int-val => 1
int-val => 2
int-val => 3
int-val => 4
int-val => 2
int-val => 3
int-val => 4
int-val => 5
int-val => 3
int-val => 4
int-val => 5
int-val => 6
final result = [[1 2 3 4] [2 3 4 5] [3 4 5 6]]
-----------------------------------------------------------------------------
doseq 1d
sub-list = (1 2 3 4)
sub-list = (2 3 4 5)
sub-list = (3 4 5 6)
doseq 2d
int-val => 1
int-val => 2
int-val => 3
int-val => 4
int-val => 2
int-val => 3
int-val => 4
int-val => 5
int-val => 3
int-val => 4
int-val => 5
int-val => 6
doseq 2d-2
int-val => 1
int-val => 2
int-val => 3
int-val => 4
int-val => 2
int-val => 3
int-val => 4
int-val => 5
int-val => 3
int-val => 4
int-val => 5
int-val => 6