Arrays 如何在Clojure中实现For循环
我想在Clojure中实现这段小代码,但我正在努力: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
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)