ScratchでLisp作った

突然ですが問題です。この画像は何でしょうか。

答え: Lispインタプリタのソースコード

「なんちゅうソースコードだ」と思った方はぜひこちらからお試しください。

「中を見る (See inside)」を押すことでソースコードが読め、その場で書き換えることも出来ます。

というわけでScratchでLispインタプリタを作りました。ScratchとはSmalltalkを元に作られたSqueak、を元に作られた教育用のプログラミング言語/開発環境だそうです。キーボートで文字を打ち込むのではなく、マウスでブロックを並べることによってプログラムを作ります。子供でも簡単にプログラムを作成することができるらしいので、つまり子供でも簡単にLispインタプリタが作成できるということですね。

一見、非常に低機能な言語のように見えますが、一通りの機能は揃っているので、足らない部分は努力で補えます。

  • ビット演算がない -> 四則演算で代用
  • ユーザ定義ブロック(手続き)に戻り値の概念がない -> 戻り値を入れる変数を自分で作る
  • ユーザ定義ブロックの引数はimmutableでmutableなローカル変数が作れない -> 自分でスタックを作る

どれもNScripterで使ったテクニックなのでさほど苦労しませんでした。

一番の問題は、プログラムを書きにくい/修正しにくいということです。マウス操作を少し失敗すると、簡単にプログラムを破壊してしまいますし、redo, undoといった機能も存在しません。一つ一つの操作を集中して行わなければなりません。この苦労は言葉では言い表しにくいので、是非みなさんも体験してください。

意外と良かったと思ったのは、ユーザ定義ブロックにearly returnの機能がないということです。途中に条件分岐があっても必ず合流します。このせいで書きにくかったところも多数ありましたが、スタックを自分で作って管理するという観点では、必ず合流する方がミス(popし忘れ、popしすぎ)を犯しにくいという利点がありました。

作り終えて一番ショックだったのは、完成したプログラムが想像以上に小さかったということです。頑張ってごみ集めまで書いたのにこの小ささはなんだ、と思ってしまいました。悔しくて色々と無駄な機能を付けました。

  • りこさんをクリックするとなにかしゃべります。
  • クリックし過ぎると踊ります。
  • しばらく放置するとりこさんが寝ます。
  • 評価に時間がかかりすぎてもりこさんが寝ます。
  • ごみ集めが起こるとりこさんが着替えます。
  • それでもメモリが足りないとブルースクリーンっぽい画面が出ます。
  • といってもメモリの上限は kCellLimit という変数で設定してるので書き換えたらもっとメモリが使えます。

是非お試しください。

Leave a Reply