山宮さんとの対話(4)

SmartSyntaxInterpreterPluginを使わずに、スタックから値を取り出したりするやつも自分で書くようにすると、InterpreterPlugin>>doPrimitive:によって、Slangの中もSqueakのデバッガでデバッグできます(梅澤さん前書いたことに一部うそがあってすみません)。

support codeの方は、面倒ながらVCでそれらのプリミティブを呼ぶアプリケーションを書いて、VCのデバッガでデバッグするときもありますね。

山宮さんとの対話(2)

コールバックに関しては、id:io_oiさんも詳しいと思いますが、Semaphoreを渡して(Semaphoreのindexを渡して)、なにかあったらそれをsignalしてもらい、Squeak側でそのSemaphoreを待っているやつが動き出す、というスタイルが判りやすいです。

wxWindowへのインターフェイスを作っている人はもう少しがんばってSqueakへのコールバックをやろうとしているみたいですが、その路線はとってもとっても大変です。

山宮さんとの対話

http://d.hatena.ne.jp/propella/20040627#p1の質問に。

storePointer:ofObject:withValue:は、固定長オブジェクトのスロットにアクセスするのが主な用途ですね。
stObject:at:put:のほうは、配列のようなオブジェクトで、byteオブジェクトであっても動いたりするのですが、プリミティブを書いているときは普通は自分が扱っているのがwordオブジェクトであるか、pointerオブジェクトであるかあるいはbyteオブジェクトであるのか判っているはずですし、格納するために渡す値にも気を使いたいものなので、あまり自分では使わないものだと思います。

某Uさんに昔書いたメールから抜粋すると、

 * 配列のアクセスに関しては、

array := interpreterProxy firstIndexableField: oop

で最初の要素への参照を取り出した後、

0 to: (interpreterProxy stSizeOf: oop) - 1 do: [:i |
array at: i
]

のように書くと、Squeak内でもCに変換した後でも同じコードで動くものができます。WordArray、FloatArrayなどの正しい配列クラスを使うようにしていれば、fetch、store系はあまり使わなくてもすむはずではあります。

 * primitive内でオブジェクトを生成するのはとってもあぶなっかしいので、最初はそれには触れずに、必要となるデータはすべてSqueak側から渡す、という作法にする、というのが良いと思います。reverseも、結果をしまうための配列もprimitiveに渡し、そこに格納するというのがよいです。

ということになります。

毛玉

外部へのリンクを張ると何が起こるかのテスト。

これは見た目だけの例ですが、turtleCountを800とか1000とかにして、絵の中の上2つのスクリプトを50/secくらいtickして、3番目のやつを気分に応じて実行するとこんな感じになります。

あと、upHillの良い例はなんと言っても蟻です。蟻が食べ物を巣まで運ぶ例のやつも毛玉で書けますので、いろいろ試してみてください。

毛玉

木村さんからのフィードバックで、プリミティブがフェイルしたときの扱いがいまいちだったことに気が付く。-fullでやってくれと書いていたのでcCode:inSmalltalk:メソッドはあるものだと思っていたが、SqueakNihongo6.1に入れた場合はそのようなメソッドは存在しないわけだな。

実際cCode:inSmalltalk:は呼ばなくても良いわけなので、取り除いたバージョンをアップロード。しかし、メーリングリストにアナウンスするタイミングというのは微妙だよな。

というわけで、テストしてくださってありがとうございます。木村さん、山本さん。