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))))
これを修正するために考えることができる1つの方法は、条件付きバインディングです 。countがゼロ未満の場合は、count-operatorを「inc」に設定します。それ以外の場合は「dec」に設定し、最後に繰り返します。
その後、これは私の問題を修正します。しかし、clojureでこれを行う方法がわかりません。または、それが可能である場合でも、when-letおよびif-letがこれを行わないようです。1回の繰り返しのみを使用するようにコードを修正する最良の方法は何ですか?
編集:私がここで学んだいくつかのこと:
1)ループステートメントがない場合、「recur」はdefnに戻ります。私が読んだ本では、recurの例はすべてloop / recurを使用しているので、ループが必要だと思いました。そうではありません、私のループステートメントは不要です。
2)括弧を間違えると、紛らわしいエラーが発生しました。両方のcondステートメントが相互に排他的であるため、末尾にあるとは見なされないのは奇妙なことでした。私のパレン完了チェッカーにもう少し注意を払うべきでした。
3)条件付きバインディングを実行したい場合は、標準の「let」ステートメントを使用して、そこに条件付きロジックを含めることができます。Javaのバックグラウンドから来ているので、clojureがこの領域で許可する柔軟性を忘れることがあります。