ハローワールドはどう書くべきか


もとはD言語で、d.y.d. - こんにちは世界 発の、import 不要な(しかしC言語の)printf 版、std.stdio.writefln 版、std.cstream.writeLine 版と、% を特別扱いしない writefln の提案。これを受けて他のユーザーから、プラグマを使った版Smalltalk でいうところの #printOn: を再定義する(おそらく…)版とか、writefln を引数の数と型で多態させる版とかの反応があって、面白かったりするわけです。

あと、shinichiro_h さんのエントリーについてはコメント欄 でのやりとりも Smalltalk が登場したりで興味津々(対立点はよく分からなかったのですが…(^_^;))。



で、本題。 Smalltalk で“ハローワールド”というと、こういうのがメジャー(?)です。

Transcript show: 'Hello world!'.


ただ、これですと、Squeak の場合、トランスクリプトのウインドウがデフォルトでは表示されていないため、何が起こっているか分からなかったりするのがイヤ〜ンな感じです。あと、ピリオドは式の終末を示すのではなく複数式の区切りなので一式のときは要らない(ただ、これについては、式を英文に見せたい…という気持ちとのせめぎ合いもありますw)とか、出力時に改行はちゃんと入れたいよね…とか、まあ、そんな細かいことまで含めると、こう書いたものにして欲しくなります。

Transcript open; cr; show: 'Hello world!'


メッセージカスケード(;)は悪…という向きに配慮すればこうなります。

Transcript open.
Transcript cr.
Transcript show: 'Hello world!'

それと、よく、式の評価の方法が分からない…という声を多く耳にするので、

  1. 文字をタイプして入力できる場所にタイプするかコピペ
  2. この式だけならそのまま、既存の文中に挿入した場合は当該部分を選択
  3. do it (alt/cmd + d) で評価

という情報が添えられていればモアベターですね。




ここで“文字が入力できれば場所ならどこでも”というのはある意味、ミソで、ワークスペースはもちろん、エディタ、入力欄、果てはドロー系テキストオブジェクトまで該当します。たとえば、Squeak の Morphic という現行の GUI フレームワークでは、メニュー項目を shift クリックするとテキストとして選択できる(余談ですが、この状態でコピーして持ち出せるので、チュートリアルを書くときなどには重宝する機能です…)ので、ここにペーストしての評価も可能です。


http://squab.no-ip.com:8080/collab/uploads/61/helloworldmenu.png


これは極端すぎる例ですが、この“式をどこでも評価可能である”という側面が、グラフィカルな UI に軸足を据えながらも、GUI さえあれば、プログラミングなぞエンドユーザーには無用…として切り離してしまったジョブズMac と、プログラマの期待するそれとはスタイルは違えどいずれ必要である…とするケイの暫定ダイナブック環境が目指すところの大きな違いですね。このことは“計算機”というソフトの存在がクールか否(無用)か、という話とも無関係ではないでしょう。



トランスクリプト出力で、改行を最後に置きたい…というときは、文字列に改行記号を追加する

Transcript open; show: 'Hello world!', String cr
Transcript open; show: 'Hello world!\' withCRs


…か、メッセージ「cr」送信後、改めて #endEntry を起動することで、トランスクリプトの出力バッファをフラッシュしないといけません。

Transcript open; show: 'Hello world!'; cr; endEntry

Transcript open は、そのものズバリで非常に分かりやすい式なので、その点では好感が持てるのですが、評価するたびにトランスクリプトウインドウが増殖するのには閉口させられます。そこで、トランスクリプトウインドウがすでにあればそれを前面に、無ければ新しく…という機能に着目します。GUI 操作でなら、デスクトップメニューをポップアップ(デスクトップのクリック、もしくは、shift + esc)してから、alt/cmd + t …なのですが、この操作により起動されるメソッドは #findATranscript: なので、こうも書けます。

World #findATranscript: nil.
Transcript cr; show: 'Hello world!'

ところで、トランスクリプトへの出力にこだわらなくてもよいのであれば、個人的には(Smalltalk 的…というよりは暫定ダイナブック環境的観点で…)好きなのはコレ。

'Hello world!' displayAt: Display center


ちなみに、aString displayAt: aPoint という式は、GUI (あるいはループやマルチスレッド)がらみの機構の動作確認やデバッグのとき、#halt したり、#inpect するととんでもないことになりがちなのを回避するときに重宝します(もちろん表示場所は選びましょう。w 0 asPoint とかがベターです(^_^;))。

ちなみに「とんでもないこと」とは、繰り返し起動されるメソッドで、ヘンなところの記述をいじって壊したり、オブジェクトへの halt の送信を挿入してしまうと、その変更を accept したとたん、ノーティファイア(エラーのとき表示されるピンクのウインドウ)の洪水に遭う…ことを指します。イタズラ好きの Squeak 使いならだれでもたびたび経験することなわけですが、これをなんとか食い止めはしたけれど、デスクトップに無数に残されたノーティファイアをちまちま消すのが面倒…というときに重宝するのが、デスクトップメニュー → do... → Utilities closeAllDebuggers(式として評価する場合もそのまんま)です。



コメント欄で squeaker さんより。これもハローワールドに期待することの斜め上を行っていて、すばらしいですね。

'Hello world!' asMorph openInHand

以上、“こんにちは世界”に絡めて、とりとめのないことを書いてみました。