「数値、文字、文字列リテラルを使わずに Hello World」を GNU Smalltalk で


こちらのお題でした。


挑戦受付開始後に Smalltalk も指定言語に追加されたので挑戦したのですが、処理系が明記されておらず困るも、おそらくは GNU Smalltalk なんじゃないかなぁとあたりを付けて書いてみました。


(挑戦受付は終了していますが念のため、以下、ネタバレ注意)

GNU Smalltalk では こちらの Squeak Smalltalk のシンプルな解 のように簡単にはいかないので、こんな方法を考えてみました。

#!/usr/bin/gst

(Hello := World := thisContext method literals copyFrom: 3 to: 4)
   do: [:each | Transcript show: each key] separatedBy: [Transcript space]


が、よく見たら(いやよく見なくても…)禁じられている数値リテラルを使ってしまっているではあ〜りませんか!

ダメダメですね… orz

ということで、改めて考えてみたのがこちら。

#!/usr/bin/gst

Object subclass: Hello [
   World [
      Transcript
         show: self class name; space;
         show: thisContext method selector; cr
   ]
]

Hello new World


#Worldメソッドをクラスメソッドとして定義し、最後の式を Hello World にするのも洒落が効いていてよろしかろうかと当初は考えたのですが、この Hello new World というのも、なかなかいいじゃないか!と妙に気に入ったのでそのままにしました。(出力はもちろん Hello World のままです。為念)


ふつうの言語にはない thisContext(実行中のコンテキストにアクセスするための擬変数)を使っている以外は、シンプルなコードなので特に説明すべきことは何もないと思いますが、しいてあげるなら、テンポラリ変数(Squeak Smalltalk の解答)もメソッド名(この解答)も原則こそ小文字スタートですが、使いたかったら大文字スタートもじつはOKというトリビアくらいでしょうか。