作者: Yukihiro Matsumoto
日時: 2002/5/22(01:13)
まつもと ゆきひろです

In message "[TSruby:88] ブロックの表現 (Re: 横取り☆)"
    on 02/05/21, "Naomasa Numajiri" <naonuma@...> writes:

|実装する前に色々比較検討なされたと思うのですが、ブロックの表現で
|* 「begin,(rescure),end」で表現する方法(Pascal流?)
|* 「{}」による方法(C言語由来?)
|* インデントによる方法(Pythonだけ?)
|* その他
|の中から今の実装を選んだ理由はなんですか?
|(その辺のこだわりに好奇心っす)

Python的な(Occamもか)インデントによるブロック表現には難点が
二つあります。

ひとつはタブ幅によって意味が変わってくることです。タブと空白
とが区別つかないってのは歴史的間違いですよねえ。もちろん、
tabnanny.pyのような対応はあるわけですが。

もうひとつは文と式の明確な区別を導入してしまう点です。たとえ
ば、Pythonでlambdaの本体が式しか書けなくて悲しいとか、Rubyで
いう

   a = if cond than b else c end

のような書き方はできなくて

   if cond:
     a = b
   else:
     a = c

のように「強制(矯正)」されちゃうのは嬉しくないです。

あと、以前はオートインデントができないって思ってたんですが、
最近のpython-modeではできるそうですね。侮れない。

これらをどの程度評価するかという問題ですが、私には受け入れら
れませんでした。

C言語的なブレースには(Pascalのbegin,endにも)「単文・複文問題」
があります。つまり

   if (a)
     sentence;

の短文を複文にするためにわざわざブレースで囲む必要があるわけ
です。

   if (a) {
     sentence1;
     sentence2;
   }

これはあんまり嬉しくないです。「ぶらぶらelse」問題も発生しま
すし。これはPerlのように「ブレース必須」とすることで解決する
んですが、なんとなく(Rubyでいう)caseとかrescueとかが美しくな
いような。

  begin {
    ...
  }
  rescue (TypeError, ArgumentError) {
    ...
  }

  case (obj) {
     when (1,2,3) {
       ...
     }
     else {
       ...
     }
  }

ということで、消去法で残ったのがEiffelやModulaのようなスタイ
ルになるわけです。ruby-mode.elを作ってみたらオートインデント
ができたというのも大きな理由ですが。

というような判断理由です。

                                まつもと ゆきひろ /:|)