循环/返回在克洛朱尔。'tail'职位是什么?



我只是在REPL上建立一个函数,然后遇到了这个。
我定义了一个符号S并给它一个值:

(def S '(FRUIT COLORS (YELLOW GREEN) SKIN (EDIBLE INEDIBLE)))

我最终想要一个函数,它接受参数列表中的第一个条目和任何和所有后续参数对,并将它们应用于第一个条目。我的编程从来没有走到那一步。我想使用循环/递归结构(shouldI?),下面是我在REPL中得到的:

(loop [KV# (rest S)]
(if (empty? KV#)
nil
(
(pprint S, (first KV#), (second KV#))
(recur (rest (rest KV#)))
)
)
)

我得到一个">只能从尾部位置重复出现"编译器错误。
在查阅了包括Stack Overflow上的7或8篇文章之后,我只能问:啊?!我是新手。如果返航不在机尾位置,有人能解释一下为什么吗?
与'if'语句语法有关?GAHH !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上的一个奇偶异常-但我将把它留给您解决。

我是怎么发现的?我的原则是,只要我发现两个左父母在一起,我就会立刻认为我犯了一个错误,我需要弄清楚我做错了什么。在这种情况下,要发现它有点困难,因为左双亲被中间的空白分隔开了——但从词汇扫描仪的角度来看,它们仍然是彼此相邻的。所以你只需要学会像词汇扫描器一样思考。: -)

最新更新