Archive for the ‘プログラミング’ Category

Erlangでゲーム作り

木曜日, 11月 8th, 2007

zickです。
11月2日の日記で書いたとおり、ESDLを入れたのですが、
せっかくなんで簡単なゲームを作ってみました。

昔からよくあるエアホッケーみたいなゲームですが、
LAN上の二台のマシンで対戦ができます。
(ただし、上の画像では一つのマシンで二つ立ち上げています)
ネットワークプログラミングなんてろくにやったことのない私ですが、
思いつくままに書いたら何故かうまく動きました。Erlang万歳!
しかし、ESDLって文字表示できないんですね。
数字を表示するため画像を準備するはめになりました。
本格的にゲームを作るのはちょっと面倒かもしれません。

ESDL(Erlang SDL)導入メモ

金曜日, 11月 2nd, 2007

こんにちは。zickです。
昨日、ErlangでSDLを使うためのライブラリ『ESDL』を使ってみようとしたんですが、
使えるようにするまでかなり苦労しました。検索してもあまり資料が見つからなかったので、
荒い文章ではありますが、ESDLの導入方法を書き残しておきます。
ちなみに、Windows環境での話ですよ。

▲このリリカルっぽいものはErlang上で動いています
———-
ESDL導入メモ
———-
1)ErlangのWindows用バイナリをダウンロード
2)SDLのDevelopment Librariesをダウンロード
3)ESDLをダウンロード
4)cygwinをダウンロード
5)mingwをダウンロード
ダウンロードしたものは適当に配置してください。
ただし、cygwinにはmakeを入れといてください。
6)cygwinの/etc/profileを編集し、Erlang、SDL、mingwへのパスを通す。
(すべてbinへのパスを通してください。)
7)ESDLのConfigure-cygwin-mingw.shの以下の箇所を変更
– SDLROOTにSDLのパスを直接指定
– libSDL.aをlibSDL.dll.aに変更
SDLROOTには自動的に探したパスを入れてくれるみたいなんですが、
見事に間違えてくれるので自分で上書きします。
8)cygwinから以下のコマンドを入力
$ cd (ESDLのパス)
$ ./Configure-cygwin-mingw.sh
$ ./mingw-build.sh
$ make install
make installは必須ではなく、Erlang側でESDLの下の/ebinへパスを通せば使えるようですが
(むしろ、ESDLのREADMEにはそういう使い方が書いてありました)
せっかくmakeファイルに親切なことが書いてあるのでやっておきます。
(Erlangのlibの下に色々コピーされるだけです)
9)テスト
Erlangを立ち上げて、ESDLの下のtestに移動(もしくはそこから起動)
> testgl:go().
これでウィンドウが立ち上がり、歓喜のあまり踊り狂いそうになったら成功です。
———-
これで多分大丈夫です。
この文章を書くに当たって別のPCで今日やり直してみたんですが、
すぐにできました。昨日物凄く苦労したのがバカらしいです(泣)
少しでもこの文章が人のためになったら幸いです。

地獄Schemeでの継続

月曜日, 6月 18th, 2007

zickです。
このサイトも、もうあまり新しい人が来ることはなくなってきたかなー……
なんて思っていたら、はてなブックマークとかを見るとごく稀に件数が増えていて、
時々だけれど新しい人が来てくれているようで何よりです。
と、はてなブックマークを眺めていると、地獄Lispを紹介してくれた人がいるようです。
つれづれなるままに
誠にありがとうございます。
せっかくなんで地獄Lispのパワーアップ版である地獄Schemeで、
一体どんなことが出来るかを、ここに少し載せてみようかと思います。宣伝もかねて(笑)

(define cont #f)
(+ 1 (call/cc (lambda (k) (set! cont k) 0)))

(1行が1回の入力->評価と対応しています)
簡単に解説。
最初の式は単に変数に値を入れているだけです。
で、2つの式ですが、これは、
「『1』と『現在の継続を引数としてある関数を呼んだ時の値』との和」を求めます。
“ある関数”とはもちろん「(lambda (k) (set! cont k) 0)」のことですが、
“現在の継続”とは、これからする処理のことで、
この時点において”現在の継続”とは
(1)これから何かを評価して値を求め、
(2)それに1を加えた値を求め、
(3)その値をトップレベルに返す
というものです。
この式を評価したときは単に(+ 1 0)の値である1がトップレベルに返るだけですが、

(cont 7)

を評価してやると、トップレベルに8が返ります。これは、
(1)これから何かを評価して値を求め、
の『何か』が7になり、残りの
(2)それに1を加えた値を求め、
(3)その値をトップレベルに返す
が行われるため、(+ 1 7)の値である8がトップレベルに返るわけです。
継続は勝手に破壊されるようなことはないので、何度でも呼び出すことができ、

(cont 127) => 128
(cont 255 => 256

このような結果となります。
“現在の継続”とは一体何かを平たく言うと、”そのときのスタックの状態”ですね。
もう少し面白いのが、ここで

(cons 'a (cont 15))

としたときです。この式の値は16となります。つまり、consが無視されるんです。
これは、(cont 15)が評価された時点で、これからする処理が
「consを呼び出しトップレベルに戻る」ではなく、
「何かに1を加えてトップレベルに戻る」に書き換わるためです。
要するにスタックの状態を丸ごと書き換えるようなものです。

地獄Scheme

金曜日, 5月 25th, 2007

zickです。
以前、公開した地獄Lispにcall/ccをつけてみました。
地獄Scheme
多値は扱えないので、継続オブジェクトにapplyを適用したりすることは出来ませんが、
それなりにちゃんと動作するはずです。多分。
大学の講義の中に突然思いついたアイディアを、あまり検討もせずに適当に書いてみただけなので、
ひょっとしたら、大きなバグとかがあるかも知れませんが、お気になさらずに(笑)
追記:
どうやらFirefoxでしか動かないようです。
Firefox, IE6.0, Operaで動作確認を取りました。