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
Recursion 为什么';这种情况不会在mapcat中再次发生吗?_Recursion_Clojure_Compiler Errors_Sequence - Fatal编程技术网

Recursion 为什么';这种情况不会在mapcat中再次发生吗?

Recursion 为什么';这种情况不会在mapcat中再次发生吗?,recursion,clojure,compiler-errors,sequence,Recursion,Clojure,Compiler Errors,Sequence,为什么在mapcat中此不会重复终止,而命名的fn调用版本等效项会终止 (def tree [1 [2 [3 5]] [6 [[1 2] [8 [9 10]]]]]) (defn leaves [node] (mapcat #(if (vector? %) (leaves %) [%]) node)) (leaves tree) ;; => (1 2 3 5 6 1 2 8 9 10) (defn leaves-with-recur [node] (mapcat #(

为什么在
mapcat
中此
不会重复
终止,而命名的
fn
调用版本等效项会终止

(def tree [1 [2 [3 5]] [6 [[1 2] [8 [9 10]]]]])

(defn leaves
  [node]
  (mapcat #(if (vector? %) (leaves %) [%]) node))

(leaves tree)
;; => (1 2 3 5 6 1 2 8 9 10)

(defn leaves-with-recur
  [node]
  (mapcat #(if (vector? %) (recur %) [%]) node))

(leaves-with-recur tree)
;; Never terminates
如果这样使用
recur
是直接的否定,那么Clojure编译器有什么理由不捕捉这个场景并警告程序员,或者甚至拒绝编译它?例如,
recur
的非尾部位置调用也是如此

#(if (vector? %) (recur %) [%])
是英语的简写

(fn [%]
  (if (vector? %)
    (recur %)
    [%]))
recur
将递归到此匿名函数,而不是任何外部函数,并且由于它不会更改任何内容,因此这是一个无止境的循环


至于警告,暂停问题是无法解决的,在编译时有陷入无休止循环的风险,即使只是尝试使用一些启发式方法。

您的
recur
是跳转到匿名函数,而不是
离开recur
。不回答直接问题,但是
tree-seq
很适合枚举结构的叶子。Ack:我刚刚在REPL中玩了一下,偶然发现了这个,在Clojure中显然有更好的方法来遍历树的叶子。谢谢你的评论。速记扩展使发生的事情非常清楚-谢谢!