R6RS:翻訳:Rationale:11.9 Control features

R6RS:翻訳:Rationale:11.9 Control features

11.9 制御機能

11.9.1 call-with-current-continuation

call-with-current-continuation の一般的な用法はループや手続きからの構造化された大域脱出であるが、実際には、 call-with-current-continuation は様々な高度な制御構造を実装するのに有効なものである。

ほとんどのプログラミング言語は exit や return、さらには goto といったような名前の目的特化の脱出構文をひとつ以上組み込んでいる。しかしながら、 1965 年、 Peter Landing [23] が J 演算子と呼ばれる汎用の脱出演算子を発明した。1972 年、 John Reynolds [28] は、 より単純で、同様に強力な構文について述べた。 1975 年に Scheme についての報告書で Sussman と Steele によって説明された catch 特殊形式は、名前こそ MacLisp のより一般性のない構文に由来したものであったが、 Reynolds の述べた構文とまったく同じであった。複数の Scheme 実装者は、 catch 構文の能力のすべては特別な構文構造ではなく手続きとして提供できることを指摘し、 1982 年に call-with-current-continuation という名前が作られた。この名前は説明的ではあるが、このように長い名前の利点については意見が分かれてい、代わりに call/cc という名前を使う人々もいる。

11.9.2 dynamic-wind

dynamic-wind 手続きはより最近、 R5RS になって追加された。これにより、一般的な動的環境の実装や、ある動的存続期間が失効したときに確実に終了コードを実行させるといったような、継続に関連した数々の抽象化を実装できるようになった。より一般的には dynamic-wind 手続き

(dynamic-wind before thunk after)

は before を呼び出さずに thunk を呼び出すことができず、 after を呼び出さずに thunk の動的存続期間を抜け出すことのできないことを保証する。この保証が call-with-current-continuation と dynamic-wind の用法の多くを可能にしているため、これらは両方連帯して規定されているのである。

11.9.3 多値

多くの計算は概念的に複数の値を返す。そのような計算を実装する Scheme の式は values 手続きを使って複数の値を返すことができる。もちろん、そのような計算は代わりに結果として、リストやベクタや構造体のような単一の合成値を返すこともできる。しかし、プログラム中の値はたいてい概念的に全体を表しているのである。多くの場合、計算によって算出された複数の結果はこのような一貫性を欠いている。さらに、これは多くの実装系で効率が悪く、翻訳系は複数の結果をひとつの値に包み込む boxing/unboxing を取り除く大幅な最適化を行なう必要があるであろう。もっとも重要なのは、 Scheme の多値の仕組みは複数の結果を式から返す際の標準的な方針を確立し、インタフェースを構築し、使用を簡便にすることである。

R6RS は多値の意味論を完全には規定していない。特に、複数の(もしくは 0 個の)値を、暗黙裏にただひとつだけの値を受けつける継続に返した場合に何が起こるかを規定していない。特に、次のようなものである。

((lambda (x) x) (values 1 2)) 
                ⇒ unspecified

このような式を評価した場合、実装系は例外を発生させなければならないのか、他の何らかの、例外的ではない振る舞いをするべきなのかは議論の余地がある。この問題については、ふたつの、基本的に相容れない立場があり、それぞれに利点がある。

  1. 誤った個数の値を継続に渡すのは一般に違反であり、理想的には実装系が検知し、報告するものである。
  2. 継続に誤った個数の値を返すというようなことはない。特に、 call-with-values によって作成されたのでない継続は、最初の値以外を無視し、 0 個の値はひとつの未規定値として扱うべきである。

R6RS は実装系がどちらの方法を取ることも認めている。さらに、実装系に set! や vector-set! や他の副作用だけを目的とした操作に 0 個の値をその継続に渡させるようにして、プログラムが戻り値を曖昧な使い方をすることを防ぐことを認めている。これにより、 R5RS との潜在的な互換性の問題が起こる。 R5RS ではそのような式は単一の未規定値を返すことを規定していたが、そのような変更を行うことの利益はそのコストよりも利益があるものと考えられた。

More ...