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'