停止問題の詳細については、停止性問題 - Wikipedia辺りを参照。
(use eval-cu-lite) (define-values (eval/cu env) (make-eval/cu)) (import/cu env 'eval/cu eval/cu) (import/cu env 'guard guard)
(eval/cu '(define (halt? thunk) ;; 実行ステップ数がthresholdに達したら#fを返す ;; 尚、その他のエラー例外が投げられる事は ;; 今は考えない(面倒なので) (guard (e (else #f)) (eval/cu `(,thunk)) #t))) ; 普通に停止したら#tを返す
(eval/cu `(define (antinomy) (if (halt? antinomy) ; 自分自身が停止するなら (let loop () (loop)) ; 無限ループさせる 'stop))) ; そうでなければ、停止させる(ここにズルがある)
(eval/cu `(,antinomy)) → (halt? antinomy) → (eval/cu `(,antinomy)) → ... (A) → (B) → (C) → ...
(eval/cu '(halt? antinomy)) => *** EVAL-CU-EXCEEDED: proc limit exceeded (eval/cu '(antinomy)) => *** EVAL-CU-EXCEEDED: proc limit exceeded
(eval/cu '(halt? antinomy) 10000) => #f (「すぐには停止しない」の意味) (eval/cu '(antinomy) 10000) => stop (停止した)