言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

Tweak のとくちょう

まだまだ謎が一杯の Tweak ですが、これまでで分かった事を書きます。

イベント処理

Morphic と同じく、イベント処理を書く方法には宣言的な方法(メソッドを上書き)と、動的な方法(イベントリスナを追加)の二通りがあります。特に宣言的な方法の書き方がガラリと変わっていて、

onMouseDown
	
	"ここに処理を書く

のようにカッコでイベントの種類を書きます。するとインスタンス生成時にこのメソッドが自動的にイベントリスナとして追加されます。つまり、Morphic と違うのはメソッド名は何でも良いという事です。カッコで囲む記法を annotation と呼びます。他に、 等の annotation があるのですが、イマイチ分かっていません。Tools - AnnotationBrowser で現在使われている annotation を一覧で見る事も出来ます。

クラスではなく、各オブジェクトごとにイベントを追加する方法は昨日書いたように

fahrenheit
	startScript: [fahrenheit value := centigrade value * 1.8 + 32]
	when: {centigrade. #accept}.

とします。when の部分にイベント発生源とオブジェクトの種類を書きます。

プロセス

Squeak には OS に頼らない独自のスレッド機構が最初からついてましたが、Tweak では、さらに粒度の細かい ScriptProcess が実装されています。特徴は同期的(同時には一つだけメソッドが実行される)という事で、要するに Morph の step と同じく競合の問題をあまり考えなくても良いです。。あらゆるイベント処理や、ワークスペース上の do it 等は全て別の ScriptProcess で実行される為、

button := CPushButton new.
button label: 'Button'.
button open.
button waitUntil: #click.
Smalltalk beep.

のような事が可能です。これを do it するとすぐに処理が戻ってきますが、ボタンをクリックしてからポンと音が鳴ります。

変数

これはどうかと思いますが、Tweak ではインスタンス変数の種類が増えたので、上に書いたとおり定義に XML が混ざっています。ブラウザ上ではこれは色分けして表示され、コンテキストメニューで切り替えます。変数の種類は以下のとおり、何のためにあるのか本当によく分からない。。。

  • Regular Field - 実際は myProperty という辞書に入る。インスペクタに表示される。
  • Virtual Field - 実際は myProperty という辞書に入る。インスペクタに表示されない。
  • Instance Variable - 昔ながらのインスタンス変数