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

XPCE/Prolog

木曜日, 4月 10th, 2008

SWI-PrologにはXPCEなるものがあり、
GUIを使用したプログラミングができるらしいです。
ということで、やってみました。
xpce
ソース:progame.swi
XPCEはオブジェクト指向であるため、もはやPrologとは別の言語のように感じますし、
おまけにゲームを作るために平気で再代入的なことをやってます。
ソースにPrologらしさが一切感じられず、悲しさがこみ上げてきます。
何かのソースに似てるような……とおもったらErlangのソースでした。
見た目はそんなに似てないんですが、感覚がものすごく似てるんです。
Erlangは元々Prologの方言として作られたと聞いたことがありますが、
なんだか物凄く納得してしまいました。

うはwwwPrologでGrass実装したwwww

月曜日, 3月 24th, 2008

つい最近Grassという言語を知りました。
登場したのは結構前みたいですね。
見事に時代に乗り遅れました。
しっかりとした操作的意味論が載っていたため、
R6RSの時と同様にPrologで作ってしまいました。
ソース: grass-sem-utf-8.swi
全角文字の入力は受け付けますが、
表示には対応していません。
実行結果

Yes
?- evaluate("うほwWWwwww",R).
w
R = [119, []] ;
No
?- evaluate("wwWWwv
wwwwWWWwwWwwWWWWWWwwwwWwwv
wWWwwwWwwwwWwwwwwwWwwwwwwwww", R).
ww
R = [119, []] ;
No

はてなようせいとまなぶ R5RS表示的意味論

金曜日, 3月 21st, 2008

はてなようせいとまなぶ R5RS表示的意味論
はてなようせい欲しさにやった。はてなようせいなら何でも良かった。反省はしていない。

続・R5RSの形式的意味論

火曜日, 3月 18th, 2008

R5RSの形式的意味論ですが、ほとんど分かりました。
とりあえず概略を書いておきます。
プログラムは次の形で評価される。
E[[E]]ρκσ
Eは式、環境、次に評価する式、ストアを受け取り式の意味を返す意味関数
Eは式の集合の要素(つまり式)、
ρは環境(識別子(変数)を受け取りロケーション(アドレス)を返す関数)
σはストア(ロケーションを受け取り評価済みの値を返す関数)
κは次に評価する式(継続)
(κの初期値はλε*ρ.ε*)
式が複数の部分式に分けられるときは一箇所のみを評価し、
残りの箇所を評価するために継続渡し形式(CPS)が用いられる(κに適当なものを入れる)。
注意すべき点は同じ文字をフォントだけ変えて全く別のものとして扱っているということです。
はっきりいって慣れるまでかなり紛らわしいです。
あと、ほとんどの式はρとκを受け取ることによって評価され、直接σを受け取りません。
(例えば、 E[[K]] = λρκ.send(K[[K]])κ のような形をしています。)
変数の参照、書き換えなど一部の操作はσを受け取ってから評価が始まり、
以降の式には(変数を書き換えた場合は)新しいσを渡します。
それから、どうでもいいこととしては、継続渡し形式を使ってるため、call/cc自体はすごく簡単だとか。
とまあ、自分では分かったつもりなんですが、
言葉にして説明するって難しいですね。

ニコスクリプトのあれこれ

日曜日, 3月 16th, 2008

最近ニコニコ動画がニコニコ動画(SP1)となりましたが、
それに伴いニコスクリプトの処理が色々変わったみたいです。
以前作ったシューティングゲームですが、
今までは非常にロード時間が長かったです。
恐らく、ニコスクリプトを動画読み込み時点で全て内部表現に変換してから実行していたため、
その変換処理に時間がかかっていたと私は考えています。
それが、SP1になったらロード時間がほぼなくなりました!
これは凄いとおもったら、逆に実行時にやたらと重くなりました。
どうやら、内部表現に変換する作業を動的にやるような仕組みに変更したみたいです。
そもそも、動画投稿者がスクリプトを入力し終えた時点で内部表現に変換しておいて
動画再生時にはそれを使うようにすればいいとおもうんですけど、どうなんですかね。
まあ、シューティングゲームという時点で色々想定外なのかもしれませんが。

R5RSの形式的意味論

木曜日, 3月 13th, 2008

R5RSの7.2節 Formal semanticsを読み始めました。
以前読んだときはさっぱり分からなかったのですが、
今回は気合を入れて読んでみたところある程度分かってきました。
R5RSの形式的意味論の基本は
「式の一箇所を評価して、その値を残りの計算に渡す」
というもののようです。
“残りの計算”というものは関数になっており、
渡すというのは、関数適用することです。
全部理解するにはまだ時間がかかりそうです。
あと、実装する場合はPrologのような論理型言語ではなく、
関数型言語を使った方が簡単そうです。

続7・PrologでR6RS(終) ~R6RSらしさを求めて~

水曜日, 3月 5th, 2008

PrologでSchemeインタプリタ作り終わったよー。
R6RS(のAppendixA)にほぼ準拠してます。
ソース
(SWI-Prologで動作を確認しています)
どのあたりがR6RSなのかということで、
R6RSっぽいところを集めてみました。

続6・PrologでR6RS ~letrecのターン~

火曜日, 3月 4th, 2008

letrecを作りました。
多分一番長い簡約規則。

evaluate("(letrec ((fact (lambda (n) (if (eqv? n 0) 1 (* n (fact (- n 1))))))) (fact 3))").
6
Yes

これで再帰呼び出しが書けるようになりました。
あとletrec*を作って、例外を発生させる規則を書けば、
Appendix Aの仕様をほぼ満たすことになります。

ゆとりTシャツ完成予想図

続5・PrologでR6RS ~地味な話~

火曜日, 3月 4th, 2008

Prologで作るSchemeインタプリタですが、
R6RSの形式的意味論の仕様を大体満たすようになってきました。
ただし、入力によっては死ぬほど遅いです(dynamic-windが関わると遅い?)。
とりあえず、最近触ったのは、例外処理、算術演算、リスト操作、
eqv?, apply, call-with-valuesあたりです。どれも地味で悲しくなります。
一番華やかなのは入出力をS式でできるようにしたこと。

evaluate("(car '(a b c))").
a
Yes
evaluate("(cdr '(a b c))").
(b c)
Yes

こうすると、かなりSchemeインタプリタっぽいですね。

R6RSの例外が複雑すぎる

土曜日, 3月 1st, 2008

R6RS Standard Librariesを全部読むのはしんどいので、
とりあえず例外のところ(7章)を読もうと思ったら、
説明で新しい型であるレコード型の機能を使いまくっていました。
レコード型といってもただのレコードだろと思ったら、
親レコードの指定とか色々な機能があるみたいです。
子レコードが親レコードの関数を使ったり、もはやオブジェクト指向みたいでした。
といってもまあ、レコードのところ(6章)は読んでないからあまり分からないんですが。
例外処理のための手続き、構文はそれほどありませんが、
レコードが複雑すぎるせいで、例外の機能も複雑になってます。
むしろ、例外を作るためにレコード型を作った気もしました。
あと10年もすれば「Schemeの仕様は小さい」は都市伝説になってしまうのでしょうか……