動かせなければ、nilが帰ってきます。次に、回転の処理も書き加えてみましょう。color))))))現在の回転をrという関数で表しています。(get)するときに、baseへ当てる関数にrもcomposeするようにしました。する関数をcomposeしています。ステージを作るさて、できましたが、肝心のstageがありません。new-positions)このようなことができるstageを作ってみましょう。it))))))))できました。コマンドとして受け取る関数ができます。フィールドはテーブルで表してみました。その位置に、重ならずにブロックをおけるか確かめます。一つブロックが落ちていくようにして、一番下に行ったらブロックをフィールドに転写し、新しいブロックを追加します。これを一定時間ごとに呼び出して、動かそうと思います。新しいブロックを追加します。現在のブロックと積み上がったフィールドを描写しています。メインの関数も作ってみましょう。OVER"))継続を作って、ゲームオーバー時に戻ってくる場所をグローバル環境に保存しています。0.8秒ごとに呼ばれます。内部で継続が呼ばれて、処理が戻ってきます。ご覧の通り、arcではcccで継続を作ります。入力を受け付けるようになっていませんが、これで、一度動かしてみましょう。5.htmlキーボードで動かせるようにするさて、ブロックは落ちてくるようになったものの、今のままでは、ただブロックが落ちるだけで何もできません。キーボードイベントをとってブロックを操作できるようにしてみましょう。HTMLに以下のコードを追記します。code))このような式実行すると、consoleに押したキーコードがプリントされるようになります。6.htmlということで、stage関数をちょっと改造してキーコードを受け取れるようにします。'draw))))))このようにしてみました。keydown関数は以下のようにします。c))これで、keyを使ってブロックが動かせるようになりました。一度動かしてみましょう。7.htmlこれでブロックが自由に動かせるようになりました。ブロックを消す処理さて、最後に、ブロックを消す処理です。先ほども書いたように、フィールドにブロックを転写した直後にフィールド内の各行をチェックして、全て埋まっている行があれば、削除していけばよいでしょう。一つ上の行をくり下げていく。10))))))できました!これで基本的なゲームはできましたが、最後に速度とスコアも追加してみましょう。score)))できました!全体はこんな感じです。score)))全体で80行程度で簡単なテトリスができました。8.htmlまとめいかがでしたでしょうか。今回はテトリスの作成を題材にArcJSを使って見ることをしました。こんな感じに、ブラウザでちょっとLispを使いたい時のBiwaSchemeとは違うもう一つの選択肢になるかもしれません。今回はわかりやすくするために、ゲームっぽいものを作りましたが、仕事では、弊社システム管理のためのDSLを作るために、ArcJSを使っていたりします。DSLはS式の形であわらされ、リアルタイムにコードチェックされ、Fixすると実コードにコンパイルされ、弊社システムにコンフィギュレートされます。実際、JavaScriptで書くよりLispで書いたほうがアドバンテージがあるのは、今回のゲームのような処理よりむしろ、DSL実装などの処理なのかなぁとテトリス作ってて思いました。