無限ループのような長時間機能:
> (define appendInf
(lambda (lst)
(appendInf (cons 1 lst)))
Chez スキームでは、make-engine はティック後に停止することができます。
> (define eng
(make-engine
(lambda ()
(appendInf '()))))
もちろん、 lst のスコープでは、次の場合にエラーが発生します。
> (eng 50
list
(lambda (new-eng)
(set! eng new-eng)
(length lst)))
Exception: variable lst is not bound
制限時間に達したときに appendInf で値 'lst' を取得したい場合は、set! を使用します。
> (define lst '())
> (define appendInf
(lambda (ls)
(set! lst (cons 1 ls))
(appendInf lst)))
今私は得ることができます:
> (eng 50
list
(lambda (new-eng)
(set! eng new-eng)
(length lst)))
8
したがって、トレースしたい関数内のすべての変数に対して、グローバル変数を追加する必要があり、さらに (set!…) を追加して変換する必要があります。
- これは、囲まれた変数を処理する正しい方法ですか?
- はいの場合、スキームでこれを達成するためのより良い方法はありますか?
- この種のデバッグをより簡単に実装できるプログラミング言語はありますか?