Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在clojure中使用嵌套for_Clojure - Fatal编程技术网

如何在clojure中使用嵌套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和+的

我有一个列表列表,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和+的示例:

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