end について

でっていう雑文。

Ruby の、

def foo
  while bar
    if baz
    end
  end
end

なんてのを見て、end end end が見た目的になんだかなー、という人がいる。自分はこれを大変すっきりしている、美しいなあ、と感じるのだが、この手の審美的評価ばかりは、評価者の……

そんなことはどうでもいい。いきなり話が脱線した。

このどうでもいい雑文において自分が書きたかったことは、Ruby って自分と相性いいかも、と思わせた要素のひとつが、この end だったってことだ。そうそう、そのことを書きたかった。自分が最初に覚えたプログラミング言語C/C++Java あるいはその系統の構文を継承した言語のどれか、であったなら、自分も end に違和感を覚えたかも知れない、という話。

自分が最初に覚えたプログラミング言語HyperTalk といって*1Mac OS X 以前の古い*2 Mac にバンドルされ、「偉大なるプログラミングの砂場」を提供していた HyperCard という、オーサリングツールだか RADツールだかデータベースだかよくわからないソフト*3の組込みスクリプト言語だった。

HyperTalk - Wikipedia


HyperTalk(はいぱーとーく)はHyperCardに用いられるプログラミング言語インタプリタ方式を採用するスクリプト言語で、その文法は英語に近く、初心者にもなじみやすい。HyperCard開発チームのダン・ウィンクラーがデザインした。拡張性を考え、XCMD(外部コマンド)とXFCN(外部関数)という機構も用意され、プラグイン的に機能を追加可能である。


HyperCardオブジェクト指向環境の為、それぞれのスクリプトは、HyperCardのスタック上のオブジェクトであるカードやボタン、フィールドなどのパーツ(オブジェクト)に付随する。

この HyperTalk の文法*4がまさに制御構造を end で終わらせるタイプで、上の Ruby の例を HyperTalk で書くとこんな感じになる↓

on foo
  repeat while bar
    if baz
    end if
  end repeat
end foo

Ruby の end end end を見て、すっきりしてる、美しい、と感じる理由もよくわかるというもの。HyperTalk では end の後に、何の end かまでを明記しなければならないのだ。これはこれで、一体これは何に対する end なのだ? というわかりにくさは発生しにくいものの、正直冗長な感じは否めない。特に、ハンドラの名前(foo のところね)を変えるとそれにあわせて end のところも修正しないといけなかったりして、さすがにそれはどうなんだと疑問に思っていたわけだ。

それで Ruby の end を見たら、そりゃ、すっきりしてると思うだろ。

なので自分の場合、

  1. 初めて覚えたプログラミング言語が制御構造を end で終わらせるタイプだった
  2. しかもそれが Ruby のそれより冗長なものだった

ってのが Ruby の end をすっきりしてる、きれいだ、と感じる最大の理由かなあ。実際、初めて Ruby のコードをみたときの感想って「お、なんかこれ HyperTalk に似てるかも*5」だったし。

なんというか、最初に覚えた言語の呪縛ってものがかなり強烈だったんだろうなあ自分の場合。やることなすこと、いまだに HyperCard に引きずられまくってる。新しい、HyperCard のようなもの、いまだに欲しいし。

*1:マイナーでサーセンw というか、自分のプログラミング言語経歴って HyperTalk → AppleScript → C → Objective-CRuby なんだけど、なんというか、ねえw

*2:といってもそんなに昔の話じゃない。自分が HyperCard にハマったのは 2000年以降の話だし。

*3:よくわからないってのは作ってる本人たちにとってもそうだったようで、開発当初のコードネームは WildCard だったとか。HyperCard のクリエータコードが WILD なのはその名残らしい。

*4:HyperTalk の文法自体がどの言語の流れを汲むものなのかはわからない。end あたりは意外と Ruby と祖先が同じだったりしてw

*5:実際に似てるのは上っ面の雰囲気だけだけどw いや、しかし HyperTalk に組込みの配列とハッシュがあり、クラス定義ができてクロージャも扱えるようになってれば、かなり Ruby に似た言語になるような気も、しないではない。