まつもと ゆきひろです
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を作ってみたらオートインデント
ができたというのも大きな理由ですが。
というような判断理由です。
まつもと ゆきひろ /:|)