Evalブロック(?)がちょっとだけ良さげに感じたお話
#!/usr/bin/env gst "クラス定義と同じくらいの特別扱いで構文まで作って わざわざ用意されたのが、 GNU Smalltalk の Eval ブロック(と読んでよいのかなぁ)ですが、 別にこれを使わなくてもスクリプトは実行できるのに、 なぜこんなものをつくったのかよく分からないと思っていました。 ところが、最近「ちょっと便利かも」と思ったことがありまして、 たとえば、 " Eval[ | hoge | hoge := [:x | x + 1]. hoge value: 42 asString printNl. "=> あっ、括弧忘れた!" ] Eval[ | piyo | piyo := [:x | x + 1]. (piyo value: 42) asString printNl. "=> こっちが正しい" ] "みたいにすると、うっかり一つ目のブロックで転けてしまっても、 二番目のブロックはちゃんと評価されるのですよね。初めて気がつきました。 最近何かを勉強しながらコードを書くとき、 こんな感じに コメントとコードを入交ながら まるで文章のように書くスタイルがマイブームでしたので、 この Eval ブロックの挙動に気がついたときは 「おー、実はイかしてるじゃん!」と見直してしまいました。 もっとも、Eval ブロックの中では GSTスタイルのクラス定義や メソッド定義はできないので、そこはいまいちのなのです。 (えっと、 " Eval [ | obj | (Object subclass: #Foo) compile: 'bar [^1974]'; compile: 'buz [self bar asString printNl]'. obj := Foo new. obj buz ] "みたいににすればできるじゃん・・というツッコミは却下です) うーん、惜しい。 まー、試行錯誤プログラミングするなら WorkSpace や Browser をつかって 動いているオブジェクト相手にプログラミングしたほうが 全然楽なので、そもそも GNU Smalltalk じゃない Smalltalk を つかったほうが良いのです。 文章中のコードの実行も選択して do it すればいいだけですしね。 とはいえ、テキストエディタで、Linux環境のままシームレスに実行できる GNU Smalltalk はそれはそれで嬉しいものなので、 ここは Emacs で頑張って、バッファ一個を WorkSpace 相当に、 コードを選択して M-x doit とか出きるようにしちゃえば いいのかな? そんなこんなで「だからどうした」な話でした。お目汚し失礼。 "
実行結果
$ ./main.st '42' Object: '42' error: did not understand #+ MessageNotUnderstood(Exception)>>signal (ExcHandling.st:254) String(Object)>>doesNotUnderstand: #+ (SysExcept.st:1436) optimized [] in UndefinedObject>>executeStatements (main.st:16) UndefinedObject>>executeStatements (main.st:17) '43' '1974'