with-exception-handler の仕様を正しく理解しよう その1


自信を持って人に説明できるレベルまで持って行こう。

例外について

  • プログラムはその例外についての情報を包んだオブジェクトをカレント例外ハンドラに渡し呼び出すことで例外を上げる
  • 例外ハンドラは 1 引数の手続き
  • システムはプログラムの動的環境(dynamic environment)の一部分としてカレント例外ハンドラを保持する(※)
  • 例外ハンドラはそれ以外の non-&serious コンディションを渡されたときは処理を戻すこと(return すること)が期待される


※ここが分からないので次に調べる。

プログラムの動的環境とは?

For a procedure call, the time between when it is initiated and when it returns is called its dynamic extent.
In Scheme, call-with-current-continuation (section 11.15) allows reentering a dynamic extent after its procedure call has returned.
Thus, the dynamic extent of a call may not be a single, connected time period.

手続き呼び出しについて、それが開始して返るまでの間を動的存続期間と言う。Scheme では call/cc によって手続き呼び出しから返ったあとに動的存続期間に再入することができる

Some operations described in the report acquire information in addition to their explicit arguments from the dynamic environment.

いくつかの操作は、明示的な引数を利用することに加えて、dynamic environment から情報を得ることがある。

For example, call-with-current-continuation accesses an implicit context established by dynamic-wind (section 11.15)


call/cc は dynamic-wind によって作られた暗黙的なコンテクストにアクセスする。
→今のところ理解できていない

and the raise procedure (library section on “Exceptions”) accesses the current exception handler. 

raise 手続きは、カレント例外ハンドラにアクセスする。
→これはよく分かる

The operations that modify the dynamic environment do so dynamically,
for the dynamic extent of a call to a procedure like dynamic-wind or with-exception-handler.

dynamic-wind や with-exception-handler といった手続きの call の動的存続期間の間、動的環境に変更を加える操作は動的に行われる。
→ピンと来ない

When such a call returns, the previous dynamic environment is restored. 

dynamic-wind や with-exception-handler の call から return すると呼び出し前の動的環境がリストアされる。
→ちょっと理解に自信ない。

The dynamic environment can be thought of as part of the dynamic extent of a call.
Consequently, it is captured by call-with-current-continuation, and restored by invoking the escape procedure it creates.

動的環境とは、call の動的存続期間の一部と考えることも出来る。従って動的環境とは call/cc によって捕捉され、call/cc が作るエスケープ手続きを呼び出すことでリストアされる。


ふーむ。結局動的環境の定義がいまいち分からない。R6RSで他に記述があるか調べてみよう。→ない。


Gauche における説明。

current-input-portやcurrent-output-portのように呼ばれたタイミングによって異なる値を返す手続きが、その時点の動的スコープの値を得るために参照する先のこと。with-input-from-fileやwith-output-from-fileを使うと、動的スコープの中に限り別の値を返すように動的な環境を拡張できる。GaucheではSRFI 39のパラメータオブジェクトを使って、ユーザ定義の動的変数を定義できる。

うわ。むっちゃくちゃ分かりやすい。
これを踏まえると。

dynamic-wind や with-exception-handler といった手続きの call の動的存続期間の間、動的環境に変更を加える操作は動的に行われる。

→これらの手続きは current-xxx といった環境を動的に変更しますよと。

dynamic-wind や with-exception-handler の call から return すると呼び出し前の動的環境がリストアされる。

→例えば with-exception-handler の呼び出しから戻ると current-exception-handler は元に戻る。ということだね。

動的環境とは、call の動的存続期間の一部と考えることも出来る。
従って動的環境とは call/cc によって捕捉され、call/cc が作るエスケープ手続きを呼び出すことでリストアされる。

→ふむ。これも自明だね。

動的存続期間 - 実装寄りの話

動的環境は、そのまま current-xxx などの変数(またはレジスタ)にマッピングされるセットである。
動的存続期間は、レジスタ群とスタックにあたる。

今日理解できなかったこと

call/cc は dynamic-wind によって作られた暗黙的なコンテクストにアクセスする。
        /\  /\
      /( ●)  (●)\
     / :::::⌒(__人__)⌒:::::\ 
     |     |r┬-|       | 
     \     ` ー'´     /
     /          \
      | ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ |  トン
   _(,,)次回につづく?    (,,)_
  /  |              .|  \
/    |               .|    \
    .|__________|