我有一些代码目前给我一个错误,因为 recur 只能在尾部位置。这是功能:
(defmethod transposer
Long [scale degree]
(loop [new-scale scale count degree]
(cond
(zero? count) new-scale
(< count 0) (recur (step (reverse new-scale)) (inc count)))
:else (recur (step new-scale) (dec count))))
我认为解决此问题的一种方法是条件绑定,如果我可以说: 当计数小于零时,将计数运算符设置为“inc”,否则设置为“dec”,然后在最后重复。
那么这将解决我的问题。但我不确定如何在 clojure 中执行此操作,或者是否可能,when-let 和 if-let 似乎没有执行此操作。将我的代码修复为仅使用一次重复的最佳方法是什么?
编辑:我在这里学到了几件事:
1) 如果没有循环语句,“recur”将返回到 defn。在我看的书中,所有recur的例子都使用了loop/recur,所以我认为有一个循环是很有必要的。不是,我的循环语句是多余的。
2)括号错误给了我一个令人困惑的错误,令我感到奇怪的是,两个 cond 语句都不会被认为是在尾部,因为它们是互斥的。我应该更多地关注我的paren完成检查器。
3)如果我确实想做条件绑定,我可以使用标准的“let”语句并在其中包含条件逻辑。来自 java 背景,我有时会忘记 clojure 在这方面所允许的灵活性。