JOYをsqueakで実装してみました。
すでに山宮さんが実装&公開済みですが、私自身の学習と研究上の興味のために1から作りました。
実装時に参考にしたのはminiscmです。オリジナルのJOYで頻繁に使われる再帰的な関数呼び出しをやめるようにしました。
大島さん他のOMetaを使ってパーサを記述しました。ごく小規模なものですがOMetaのサンプルになるかもしれません。
せっかくなのでGUIも付けてみました。要するにスタックやプリミティブをMorphにしてみただけのものでごく簡単なものです。このGUIの目的としては、「Joyを手軽に試す」「マウスだけでプログラムを作る」ところにあるので、実用性はかなり低いと思います。
まだプリミティブの実装が少ないものの、ある程度のプログラムは書けると思いますので興味のある方はどうぞ。
実行環境
Squeak VM070309J(MaxOSX)
Squeak 3.9-7067.image
OMeta(1-1.0)
試していませんが他のプラットフォームでも動くだろうと思います。
インストール
file listからJoy-Baseをインストールしてください。
テキストだけで利用する場合には、SqueakMapからOMetaをインストールした後で、Joy-UIをインストールしてください。
GUI環境を利用する場合にはJoy-GUIをインストールしてください。なお、Joy-UIをインストールしなくてもJoy-GUIはインストールできます。
使い方(テキスト)
Workspaceで以下のような式を評価(式を表示)すれば結果を得ることができます。
j := Joy new. j run: 'DEFINE fact == [dup null] [pop 1] [dup pred fact *] ifte.'. j run: '10 fact'. ^ j stack
使い方(GUI環境)
Workspaceから、以下の式を評価してください。
ViJoyMorph morph openInHand
画面にJoyと書かれたモーフが現れます。
stackボタンを押すとJoyのスタックを表すモーフが別途現れます。
後はJoyモーフから適当なボタンを押して出てくるタイルをスタックにドロップすると、タイルがスタックに積まれていきます。
primitiveやmoduleのタイルをスタックに積むと何らかの結果がスタックに残ります。
プログラム(関数)を作りたいときは、moduleのnewを押してその中にタイルを加えていきます。
タイルに適当な名前を付ければmoduleのselectボタンで関数が選べるので、それを元の関数に入れて再帰的な定義を作ることもできます。
後は適当に遊んでください。