1

ユーザー入力を受け入れ、計算し、出力を与えるSchemeアプリケーションがあります。ある種のエラー処理とスムーズな終了方法を有効にすることで、より堅牢にしたいと考えています。Call with current continuation は、ここでこのギャップを埋めるものと思われますが、それを実装する方法がよくわかりません。

現時点では、ユーザーが無効な入力を入力すると、プログラムがクラッシュして終了します。ユーザーをアプリケーションに保持し、代わりにエラーメッセージを表示したいだけです。これが私の方法の概要ですが、通常はシステムをクラッシュさせるエラーが発生した場合にエラーを出してプログラムに保持するように実装する場所がわかりません。

  (define (handle_err)
    (call/cc
     (lambda (a)
    (display "exception handled: a"))))

また、プログラムをきれいに終了したいと思います。つまり、クラッシュ出口でもブレークでもありません。ユーザーに「leave」と入力してもらい、プログラムを閉じてインタープリターに戻してもらいたいと思います。私のアウトラインは上記のように見えますが、ユーザーがプログラムを離れることはなく、入力プロンプトに戻るだけです。

どんなアイデアでも大歓迎です。

4

2 に答える 2

1

はい、call/cc はこの種の制御の移行を処理できます。ここでの問題の 1 つは、この例では call/cc が「throw」ではなく「try/catch」に対応していることです。

ただし、より大きな問題は、エラーが発生したときに制御を取得するための適切な方法が r5rs にないことです。

これは実際には、さらに大きな問題の兆候にすぎません。つまり、さまざまな異なる Scheme 実装がこの問題をさまざまな方法で解決したということです。

個人的には、Racket をご覧になることを強くお勧めします。Linux の多くのバージョンでサポートされており、多くの標準ディストリビューションに存在し、これを非常にうまく処理します。

#lang racket

(with-handlers ([exn:fail?
                 (lambda (exn)
                   (display "oh noes! An exception occurred!"))])
  (try-something-dangerous))

(define (try-something-dangerous)
  (/ 1 0))

実際、r5rs プログラムを書きたい場合でも、Racket をお勧めします。あなたはあなたのプログラムを始めることができます

#lang r5rs

... r5rs に完全に準拠するため。

于 2012-11-11T23:51:34.477 に答える
0

さて、あなたはこのアプローチを見てください

(define-syntax try
  (syntax-rules ()
        ((_ handler throw chunk)
         (call/cc (lambda (catch)
                (let ((throw (lambda (exc) (catch (handler exc)))))
                  chunk))))))
(define (div p q)
  (try 
    ;; Error processing
    (lambda (error) (printf "Error: ~s~n" error) error)

    ;; Error my be thrown with keyword "throw"
    throw

    ;;Actual code to run
     (if (= q 0)
    ;; Oh noes, error!
        (throw "Division by zero")
    ;; All ok, do the work
     (/ p q))))

(printf "1/0: ~s~n" (div 1 0))
(printf "1/2: ~s~n" (div 1 2))

「throw」は、throw 関数の名前を取得するために使用されます (これは衛生上の理由から必要です)。

于 2012-11-17T13:11:08.837 に答える