未定義

C/C++ の規格を見ると、未定義としている項目が多い。 いわゆる「鼻から悪魔」というやつだ。実行効率を優先する言語であるので、実行環境に都合のよい挙動をしてかまわないということを保証するためであろう。 アプリケーションソフトのプログラミングではそういった未定義な挙動を使わずに済む迂回方法が存在する場合には迂回しておくのが作法と考えられている。

一方、 Scheme の規格にも未定義とされている部分がある。 その中で今回話題にしたいのは返却値が未定義とされている関数についてだ。 現在検討中の次期規格 R6RS に於いてはこれは返却値が何であっても構わないということを意味しない。 「未定義を表すオブジェクトを返す」ということにする案を採用する見通しである。 (注:最終的には未定義を表すオブジェクトは見送られ、何が返ってくるかは未規定となりました。) Schemeの文法からして C/C++ のような何も返さない関数というものは出来そうもないし、意味のないでたらめな値を返すのも不恰好ではある。 専用のオブジェクトを用意するのはいかにもScheme的だと思う。 だが、これが他と整合性のとれるようにするには考慮すべきことが多い。

Gaucheの実装では無限同士の比較がイコールになってしまう。 (将来は変更される可能性もある。) これは Scheme 的な一貫性を求めた結果だが、数学的にはもちろん正しくない。 未定義オブジェクトについても、同じような問題に直面する。 Scheme の規格策定が異様なほどに慎重であることは知られているのでいいようにしてくれると信じてはいるが気になるところ。

私の浅はかな考えだが、未定義オブジェクトを返す関数は常に未定義オブジェクトを返すべきではないだろうか。 少くとも標準関数ではそのようにした上で、ユーザーにもそれを推奨すべきと思う。 なぜなら、例えば「ある関数が返す値は未定義か整数のどちらかである」などというのは感覚的にいかにもおかしい。 未定義オブジェクトは未定義であることを抽象化した存在として扱うのが自然だと思う次第。

Document ID: 5d68600691032dcd174199c0b66945bb