まつもと ゆきひろです

In message "[ruby-dev:8435] Re: constant?"
    on 99/11/27, GOTO Kentaro <gotoken / math.sci.hokudai.ac.jp> writes:

|ぼくもあまり深く考えていなかったので改めて考察してみたところ、
|どうやら定数は安全性を提供するが汚染モデルとは異なる機能を提
|供するモノのようです。

まったくその通りです。っていうか、セキュリティレベルと絡めて
考えるという発想そのものがありませんでした。確かにレベル4で
定数の変更を禁止していますが、あれはグローバルな状態の変更禁
止の一環ですから、この件とは分離して考えた方が良いでしょう。

|さて、再代入できない定数というのはインタプリタがある種の安全
|性を保証してくれる名前のことではないでしょうか。この安全性を
|上の(i),(ii)に対応させてみます。
|
|  (1) 名前なのでその有効性はインタプリタが検査する
|  (2) その名前空間が存在する限り値の一意性が保証される

(1)については異論はないのではないでしょうか。現在の定数相当
のスコープと未初期化の場合にエラーとなるスロットの存在は妥当
であるとほとんどの人が同意してくださると思います。

(2)については考えるべき点がいろいろあると思います。

  (a) 定数の再定義を一切禁止する(昔の仕様)

      結果として値の一意性は保証されるが、たとえばJed/Rubyで
      プログラムを修正の上、再実行などが行えないという不自由
      さがあります。

  (b) トップレベルでの再定義を許す(1.4の仕様)

      プログラムのロードレベルでは再定義を許すので、厳密には
      定数ではないのですが、メソッド内では値が変更できないの
      で(抜け道を使わない限り)、実行中に値が移り変わることは
      ありません。普通の変数よりはマシですが、これは「定数」
      じゃないという指摘はもっともです(私は妥協できると思っ
      てるけど)。

  (c) 初期化されたものはメソッド内でも代入可能(1.5.0の仕様)

      試験的に1.5.0で採用している仕様です。これは実行時にも
      値が移り変わりますから、完全に定数ではありません。いま
      まで奇妙な方法で実現していたクラス変数(相当)が実現でき
      るのは嬉しいことですが、かつての仕様でまがりなりに存在
      していた値の定数性は完全に失われています。「定数」じゃ
      ない別の名前を考える必要があるというのが最大の問題のよ
      うに思いますが、「値の一意性」が失われるのもそれはそれ
      で大きなデメリットかもしれません。

  (d) 代入可能だが指定されたものだけは定数

      ごとけん案と言っても良いのかな? 「値の一意性」を外側
      から指定する性質として用意しようという考えだと思います。
      実行のことは置いて考えるとして、気になるのは

        * 全体としては「定数」でないので別の名前を考える必要
          がある(しかも、その名前は「変数」という単語を含ま
          ない方が良い)

        * 「再定義の不自由」の問題をどう回避するか。

        * スコープが同じだとは言え、定数(的性質を持つもの)と
          変数を同じものとして考えて良いのか。単なる性質の違
          いを越えているのではないか。

      などです。

そして、既に触れていますが名前の問題です。名前がすんなり決ま
らないってことは議論(考察)が不足していると考えることができる
かもです。
                                まつもと ゆきひろ /:|)