GNU Smalltalk 3.0

ここのところ微妙に忙しくって、気づいたときには完全に出遅れてしまいました。GNU Smalltalk がなにげにメジャーバーションアップしています。ぜんぜんメンテナンスされていない印象があったので、ちょっとびっくり。

3.0 での大きな違いは、クラス定義の新しい文法が導入されたことです。GNU SmalltalkPythonPerl のようなスクリプト言語を目指す!・・・と目標を掲げながら、その一方で チャンクファイルを手で書けというスタンスでした。

Smalltalk はブラウザという専用のツールでコーディングします。テキストエディタでファイルにコードを書いてそれをコンパイルなり実行なりをしません。クラス定義の文法もブラウザを使うことを前提に作られていて、普通にテキストファイルにクラス定義を書こうとしても、その文法がありません。(と、Smalltalk をしらないプログラマに言うと、とても変なものを見る目で見られてしまう...それがカイカンですw)

テキストファイルにSmalltalkコードを書く方法(フォーマット)が本当に全くないかというとそうではなくて、チャンクファイルに使われるチャンクフォーマットがあります。これは(基本は)コードを評価する塊ごとに ! で区切ったのフォーマットです。

ただ、チャンクファイルはSmalltalkコードをイメージからエクスポート/インポートするときに使うのものなので、チャンクフォーマットは正直人間にとって いまいち読みにくいし書きにくい。普通のスクリプト言語を目指す GNU Smalltalk でそれを手書きさせるって作戦はどうよと(個人的に強く)思っていたので、今回の変更は正常進化です。

さて、この新しい3.0、今職場なので残念ながら動かしてはみれないのですが(Windowsなのだ)、いそいそとダウンロードしてきて、含まれている.stファイルをつらつらと眺めています。注目のクラス定義の新しい文法はこんな感じみたい。(もちろん、まだ動かしてみてないので、嘘かもしれない)例がへっぽこすぎるのはご容赦です。

Object subclass: MyPoint [
    | xValue yValue |

    <category: 'MySandBox'>
    <comment: 'ここがクラスのコメントになります。
普通の文字列なので、改行後に空行を挟むと
それがそのまま持って行かれてしまいます。
だからインデント無視で書く。これはちょっと見づらいかな'>

    MyPoint class >> x: xVal y: yVal [
    "これはクラスメソッドです。
    メソッドカテゴリは↓な感じでメソッド毎に書きます"

    <category: 'instance-creation'>
    ^ MyPoint new setX: xVal;
                  setY: yVal;
                  yourself
    ]

    getX [
    "これはインスタンスメソッドです"

    <category: 'accessing'>
    ^ xValue
    ]

    setX: newValue [
    "引数付きの書き方もごく普通"

    <category: 'accessing'>
    xValue := newValue
    ]

    getY [
    "クラスのコメントと違い、メソッドのコメントは改行の後に
    ←のように、インデントして書かれています。
    これは、パーザが特別扱いしてる・・のではなくて、
    単に[]の間がそのままクラスブラウザ上の
    テキストエリアで見えるので。"

    <category: 'accessing'>
    ^ yValue
    ]

    setY: newValue [
    "メソッドボディはもう一段インデントしたいです.
    でもそれをすると、クラスブラウザ上では何の脈絡もなく
    2段インデントしてるように見えちゃう。むぅ..."

    <category: 'accessing'>
    yValue := newValue
    ]
]

な文法は、まだ目がなれていないからか、かなりギョッとしますが、他は自然な読み応えです。

一つ気になるのが、テキストエディタでもクラスブラウザでも見るので、両方でインデントのつじつまが合うようにするため、テキストでのコーディングスタイルが、一貫性がないというか少々見づらいというか、ちょっと変わったものになっている点。でも単なるコーディングスタイルだから、最悪テキスト優先でクラスブラウザでの見栄えは無視しちゃってもいいかも。

全体的には無難な落としどころに落ち着いているように感じます。しばらく使ってみようと思います(家に帰ったら早速インストールしなくっちゃ)。


余談ですが、GNU Smalltalk って、Squeak みたいに { 'foo' . $b . 42 } な カーリーブレイスで配列定義できるのですね。始めて知りました。(どっかに Smalltalk の方言比較一覧とかないかしらん)