10日分まとめて。
4月 29th, 2008気が付けば前の日記から10日もたっていました。
なんてこったい。
最近の動向
- このブログのタイトル「リリカル☆Lisp 開発日記」だけど、変えた方がいい?
- 「リリカルLispで勉強する」って都市伝説じゃなかったの!?
- 情報処理学会とか入った方がいい?
- この大学と、学務課に幸あれ
- 私の英語力はTOEIC400点相当らしい
- Prologはギャルゲー
10日分まとめてお送りします。
気が付けば前の日記から10日もたっていました。
なんてこったい。
最近の動向
10日分まとめてお送りします。
lyrical.bugyo.tkのリファラを見てみたら、
WikipediaのLISPの項目からのアクセスが何件かありました。
で、WikipediaのLISPの項目を見に行ったらリリカルLispなんて言葉はどこにもない。
更新履歴を見てみたら、誰かがリリカルLispの紹介を書いて、
それからすぐに別の人が消した模様。
面白いことに、全く同じことが今年の1月にも起こってるんですよね。
誰かが紹介を書いて、それからすぐに別の人に消されるという出来事。
今回掲載されていた文章が、以前掲載されていたものと全く同じだということを考えると、
同じ人が書き込んだんでしょうか。謎です。
とりあえず、
「中の人宣伝乙wwww」
とか思われたらいやなので、
WikipediaのLISPの項目の編集には一切関わっていないことを宣言しておきますね。
—
というか、
NScLisperは文法的には純粋なLispではなく、Schemeの影響が見られる独自仕様の簡易版Lispである。
この説明ってどうなんでしょうか。
純粋なLispって一体何でしょうか。
pure lispのことではないのは確かだと思いますが(笑)
ここしばらくSWI-Prologで遊んでます。
multi-threadとsocketを使ってechoサーバを作ってみたり。
ソケットに関しては、
tcp_socket
tcp_listen
tcp_bind
tcp_accept
といったそのまんまな名前の述語が用意されています。
マルチスレッドに関しては、
thread_create
という述語でスレッドを作るようです。
今回は使いませんでしたが、
thread_send_message
thread_get_message
という述語を使うことにより、
スレッド間通信ができるようです。
やっぱしErlangと感覚が似ている気がします。
ただ、こういったプログラムではバックトラックも使いませんし、
正直Erlangで書く方が大幅に楽だと思いました。
(まあ、これは私がPrologより先にErlangを触ったからかもしれませんが。)
詳細な情報はこのあたりに載ってます。
SWI-PrologにはXPCEなるものがあり、
GUIを使用したプログラミングができるらしいです。
ということで、やってみました。
ソース:progame.swi
XPCEはオブジェクト指向であるため、もはやPrologとは別の言語のように感じますし、
おまけにゲームを作るために平気で再代入的なことをやってます。
ソースにPrologらしさが一切感じられず、悲しさがこみ上げてきます。
何かのソースに似てるような……とおもったらErlangのソースでした。
見た目はそんなに似てないんですが、感覚がものすごく似てるんです。
Erlangは元々Prologの方言として作られたと聞いたことがありますが、
なんだか物凄く納得してしまいました。
つい最近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表示的意味論
はてなようせい欲しさにやった。はてなようせいなら何でも良かった。反省はしていない。
実家の隣町の商店街に行ってきました。
そしたら色々と面白いものを見つけてしまいました。
びんちょうタン TBSにて放送
(商店街の一角にて発見)
「クヌギたん」のふる里は北摂
(商店街の一角にて発見)
びんちょうタン
(商店街の一角にて発見)
レジ袋いらんで~!
(薬局にて発見)
クヌギたんカードとは一体何なのか非常に気になったので、
200円分の買い物をすることにしました。
レジで「袋は結構です」と宣言するものの、カードをくれる気配は無し。
仕方がないので「あの、レジ袋をもらわなかったらもらえるカードとやらはないんですか」と聞くと、
素敵なクヌギたんカードをもらえました。
クヌギたんカード
(5枚(1000円分)集めると100円キャッシュバック。結構お得)
もらってから気づいたんですが、この企画をしているのは市なんですよね。
つまり、クヌギたんは市公認のキャラクターなんでしょうか。謎です。
調べてみたら素敵なWebサイトも見つけました。
R5RSの形式的意味論ですが、ほとんど分かりました。
とりあえず概略を書いておきます。
プログラムは次の形で評価される。
E[[E]]ρκσ
Eは式、環境、次に評価する式、ストアを受け取り式の意味を返す意味関数
Eは式の集合の要素(つまり式)、
ρは環境(識別子(変数)を受け取りロケーション(アドレス)を返す関数)
σはストア(ロケーションを受け取り評価済みの値を返す関数)
κは次に評価する式(継続)
(κの初期値はλε*ρ.ε*)
式が複数の部分式に分けられるときは一箇所のみを評価し、
残りの箇所を評価するために継続渡し形式(CPS)が用いられる(κに適当なものを入れる)。
注意すべき点は同じ文字をフォントだけ変えて全く別のものとして扱っているということです。
はっきりいって慣れるまでかなり紛らわしいです。
あと、ほとんどの式はρとκを受け取ることによって評価され、直接σを受け取りません。
(例えば、 E[[K]] = λρκ.send(K[[K]])κ のような形をしています。)
変数の参照、書き換えなど一部の操作はσを受け取ってから評価が始まり、
以降の式には(変数を書き換えた場合は)新しいσを渡します。
それから、どうでもいいこととしては、継続渡し形式を使ってるため、call/cc自体はすごく簡単だとか。
とまあ、自分では分かったつもりなんですが、
言葉にして説明するって難しいですね。
最近ニコニコ動画がニコニコ動画(SP1)となりましたが、
それに伴いニコスクリプトの処理が色々変わったみたいです。
以前作ったシューティングゲームですが、
今までは非常にロード時間が長かったです。
恐らく、ニコスクリプトを動画読み込み時点で全て内部表現に変換してから実行していたため、
その変換処理に時間がかかっていたと私は考えています。
それが、SP1になったらロード時間がほぼなくなりました!
これは凄いとおもったら、逆に実行時にやたらと重くなりました。
どうやら、内部表現に変換する作業を動的にやるような仕組みに変更したみたいです。
そもそも、動画投稿者がスクリプトを入力し終えた時点で内部表現に変換しておいて
動画再生時にはそれを使うようにすればいいとおもうんですけど、どうなんですかね。
まあ、シューティングゲームという時点で色々想定外なのかもしれませんが。
R5RSの7.2節 Formal semanticsを読み始めました。
以前読んだときはさっぱり分からなかったのですが、
今回は気合を入れて読んでみたところある程度分かってきました。
R5RSの形式的意味論の基本は
「式の一箇所を評価して、その値を残りの計算に渡す」
というもののようです。
“残りの計算”というものは関数になっており、
渡すというのは、関数適用することです。
全部理解するにはまだ時間がかかりそうです。
あと、実装する場合はPrologのような論理型言語ではなく、
関数型言語を使った方が簡単そうです。