在 Clojure 中循环 / return。 'tail' 位置是多少?
loop / return in Clojure. What is 'tail' position?
我只是在 REPL 中构建一个函数,然后 运行 加入其中。
我定义一个符号S并给它赋值:
(def S '(FRUIT COLORS (YELLOW GREEN) SKIN (EDIBLE INEDIBLE)))
我最终想要一个函数,它接受参数列表中的第一个条目以及任何和所有后续参数对,并将它们应用于第一个条目。我的编码从来没有走那么远。我想使用循环/递归结构( 应该 吗?),这是我在 REPL 中取得的进展:
(loop [KV# (rest S)]
(if (empty? KV#)
nil
(
(pprint S, (first KV#), (second KV#))
(recur (rest (rest KV#)))
)
)
)
我收到“can only recur from tail position”编译器错误。
在 Stack Overflow 上到处找了 7 或 8 篇文章后,我只能问:Huh?!
我是新来的。如果 recur 不在尾部位置,有人可以向我解释为什么吗?
与 'if' 语句语法有关?啊! Clojure 不适合弱者!谢谢。
您在 Clojure 中犯了我最常犯的错误之一 - 您试图使用括号对代码进行分组。您需要使用 (do ...)
表格将表格组合在一起,如:
(loop [KV# (rest S)]
(if (empty? KV#)
nil ; then
(do ; else
(pprint S, (first KV#), (second KV#))
(recur (rest (rest KV#)))
)
)
)
这消除了“不在尾部位置重复出现”的问题,但是 仍然 失败了 - pprint
上的一个异常 - 但我会把它留给你来解决。
我是怎么发现这个的?我的规则是,每当我发现两个左括号在一起时,我会立即假设我犯了一个错误,我需要弄清楚我做错了什么。在这种情况下,它有点难以发现,因为左括号被中间的白色 space 分开了——但是,从词法扫描仪的角度来看,它们仍然是相邻的。所以你只需要学会像词汇扫描仪一样思考。 :-)
我只是在 REPL 中构建一个函数,然后 运行 加入其中。
我定义一个符号S并给它赋值:
(def S '(FRUIT COLORS (YELLOW GREEN) SKIN (EDIBLE INEDIBLE)))
我最终想要一个函数,它接受参数列表中的第一个条目以及任何和所有后续参数对,并将它们应用于第一个条目。我的编码从来没有走那么远。我想使用循环/递归结构( 应该 吗?),这是我在 REPL 中取得的进展:
(loop [KV# (rest S)]
(if (empty? KV#)
nil
(
(pprint S, (first KV#), (second KV#))
(recur (rest (rest KV#)))
)
)
)
我收到“can only recur from tail position”编译器错误。
在 Stack Overflow 上到处找了 7 或 8 篇文章后,我只能问:Huh?!
我是新来的。如果 recur 不在尾部位置,有人可以向我解释为什么吗?
与 'if' 语句语法有关?啊! Clojure 不适合弱者!谢谢。
您在 Clojure 中犯了我最常犯的错误之一 - 您试图使用括号对代码进行分组。您需要使用 (do ...)
表格将表格组合在一起,如:
(loop [KV# (rest S)]
(if (empty? KV#)
nil ; then
(do ; else
(pprint S, (first KV#), (second KV#))
(recur (rest (rest KV#)))
)
)
)
这消除了“不在尾部位置重复出现”的问题,但是 仍然 失败了 - pprint
上的一个异常 - 但我会把它留给你来解决。
我是怎么发现这个的?我的规则是,每当我发现两个左括号在一起时,我会立即假设我犯了一个错误,我需要弄清楚我做错了什么。在这种情况下,它有点难以发现,因为左括号被中间的白色 space 分开了——但是,从词法扫描仪的角度来看,它们仍然是相邻的。所以你只需要学会像词汇扫描仪一样思考。 :-)