Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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
Arrays 如何在Clojure中实现For循环_Arrays_Loops_Clojure_For Loop - Fatal编程技术网

Arrays 如何在Clojure中实现For循环

Arrays 如何在Clojure中实现For循环,arrays,loops,clojure,for-loop,Arrays,Loops,Clojure,For Loop,我想在Clojure中实现这段小代码,但我正在努力: struct mystruct{ int-id; 国际价格; }; mystruct mydata[10]; for(int i=0;i将命令for循环转换为Clojure的一种方法是使用for宏 (for [i (range 10)] (inc i)) 上面的函数将返回从0到9的所有数字,递增1。但是,您似乎只想在顺序集合上迭代并使用每个项。如果您只需要这些,那么您不需要引用索引值,而是可以直接引用每个项 (for [d my-vec-o

我想在Clojure中实现这段小代码,但我正在努力:

struct mystruct{
int-id;
国际价格;
};
mystruct mydata[10];

for(int i=0;i将命令for循环转换为Clojure的一种方法是使用
for

(for [i (range 10)] (inc i))
上面的函数将返回从0到9的所有数字,递增1。但是,您似乎只想在顺序集合上迭代并使用每个项。如果您只需要这些,那么您不需要引用索引值,而是可以直接引用每个项

(for [d my-vec-of-data] (my-function d))
但是,对于这种简单的情况,
map
函数可能是一个更好的选择,因为它被设计为使用集合中的参数调用函数。下面的示例相当于上面对
使用的

(map my-function my-vec-of-data)

map
for
都返回由
my function
返回的值组成的值集合。这是因为Clojure的数据结构是不可变的,因此有必要返回一个新集合。如果这不是您需要的,或者如果您的函数有副作用,您可以在中使用
doseq
Jeremy的答案对于如何在惯用Clojure中执行for循环非常有用,而不是返回nil的for

如果确实需要Clojure中循环的命令式样式,可以使用以下宏创建一个命令式样式:

(defmacro for-loop [[sym init check change :as params] & steps]
 `(loop [~sym ~init value# nil]
    (if ~check
      (let [new-value# (do ~@steps)]
        (recur ~change new-value#))
      value#)))
用法如下:

(for-loop [i 0 (< i 10) (inc i)] 
  (println i))
(用于循环[i0(
doseq
执行类似于
for循环的操作
用法:

该绑定类似于Clojure中的
for
。但是,它不会通过计算
doseq
中的表达式来返回列表。它为序列中的每个值执行表达式,并返回
nil

要循环遍历seq,只需使用:

(doseq [value list]
    (println "Your expression here" value)

“i”是否自动递增?@nuvio:
i
将是序列中的实际项,而不是索引。是的,
for
宏将为您处理迭代序列的操作。“doseq”对于不需要返回val的函数来说是非常好的,因为它只返回一个nil而不是1-per-element@Chuck既然我是实际项目,你怎么能得到实际数量呢?我喜欢在Clojure中如果你缺少一个语言功能,而不是等待它被添加到未来的版本中,你可以自己编写。通常在函数中最好坚持映射、应用和减少。映射有一个隐含的for循环^^
(doseq [value list]
    (println "Your expression here" value)