私はスキームの最初のプログラムを書いています。私は基本的にはネストされた手続き呼び出しを持つことができる単純なロボットのためのプログラムを解釈するので、再帰にかなり深く入る。スキームの再帰を中断する標準的な方法
違反が見つかった場合は、プログラムの解釈を停止し、最後の有効な状態を返す必要があります。
グローバル変数(define illegalMoveFlag 0)
を宣言してからset!
で設定して解決しました。私が考えた
それは正常に動作しますが、私は(それは私が推測する機能的なアプローチではないので)私の家庭教師がそれを好きではないだろうと思い
他のアプローチは、私は再帰的に呼び出すすべての関数にエラーパラメータを追加することですプログラムで。私はそれが私のコードをはるかに読みにくくするので、それは本当に好きではありませんが、私はそれがより機能的だと思います。
私は考えなかった可能性がありますか?そして私のアプローチはこのパラダイムで正当化できるのでしょうか、それとも基本的にコードのにおいですか?
これまでのところ最高の答えです。しかし、私は簡単に最初の方法を使用することはできません。より具体的には、私は次のようなものを使用します(let(a(call-that-can-fail))(b(other-call-that-can-fail a)))...)) bを実行するのを止めてください(私はそれを条件で行うことができますが、私の現在の解決策よりも醜いでしょう)。私は継続を使用すると思います、それはグローバル変数を持つ私の解決策ではない私の関数を再入可能にするでしょう。 –
'cond'に' => '句を使用できますか?上記の例を参照してください。 – soegaard