【发布时间】:2018-06-28 03:24:06
【问题描述】:
我一直无法找到任何关于我试图理解的内容的教义 Clojure 示例,并希望对此有所了解。
传统上,当我在命令式语言中使用递归时,我经常将一个空列表传递给递归函数,以便通过堆栈收集一些计算的结果。
作为 Java 中的一个小例子:
public List<Integer> results = new ArrayList<>();
private List<Integer> add(List<Integer> list, int count){
if(count > 10){
return list;
}
count = count + 1;
list.add(count);
return add(list, count);
}
如果运行:
add(results, 0)
将产生一个从 0 到 10 的值列表。
这是 Clojure 中的惯用语吗?
(defn t [list i]
(conj list i)
(if (<= i 10)
(recur list (inc i))))
(t '() 0)
其次,为什么在我评价的时候:
(t '() 0)
我是否收到此错误:
clojure.lang.Compiler$CompilerException: java.lang.ClassCastException: java.lang.Long (in module: java.base) cannot be cast to clojure.lang.IFn
【问题讨论】:
-
conj 不会发生变异,因此您需要显式传递其返回值。即
(defn t [list i] (if (<= i 10) (recur (conj list i) (inc i)) list))...至于惯用语,我不是一个clojurist。这种风格在我看来更像方案。
标签: clojure