2008-01-25
■ [event][scheme] gauche.night#2のチケットを入手した
今日から発売.ローソンで買える.15時ごろに行ったので,もう売り切れてたらどうしようかと一瞬どきどきした (大げさ?w)
ともあれ,行きたい人は早めに購入した方が良いかも.
■ [biwascheme] mapの実装とか,dynamic-windのこと
先輩にこの前実装したmapの話をしたら,「tut-schemeも同じような実装だよ」と言われた. ちょっと嬉しい.
ただTUSは「関数のリターン時に実行するコード」が指定できるようになっていて, mapなどを呼び出すときにもうこの情報をスタックに置いてしまうとか.
これがdynamic-windのときにも使われているらしい,というつながりでdynamic-windの話を聞いた. dynamic-windは3つのクロージャを引数にとる関数で,ただbefore→thunk→afterの順に実行するだけ,というもの.
ただし,thunkの実行途中で継続オブジェクトを実行して飛び出すときは,その前にafterを実行しなければいけないし, 逆にthunkの中に飛び込むときは,その前にbeforeを実行しなければならない. (try〜catchみたいなものだとイメージすると良いかも)
さらにdymanic-windがネストしている場合もあって,何がなんだか(笑). とりあえずホワイトボードの図をデジカメで撮ったので,実装するときに参考にしよう(という俺メモ).
■ [biwascheme] sortの実装とか
んで,ついでに「sortも同じような感じでできませんかね?」と聞いたら「無理でしょ」と即答(笑). JavaScriptのsortが使えれば(最終的にCのqsortあたりに落ちると思うので,速度的に)いいなぁと思ったのだが, qsortのループとインタプリタのループを同時に回すことはできないので無理,と.
もちろん,qsortの比較関数のところで毎回新しいインタプリタを作ってクロージャを実行することは可能なのだが, これだとクロージャ内で継続を生成したり実行したときにうまくいかない.(^^; というのもBiwaSchemeでは スタックを自前で持っているからだ.GaucheはCのスタックをそのままコピーして継続を作るので,この方式で問題ない (らしい)んだけど.
ということで,考えられる実装は
- Schemeでクイックソートを書く
- 多分一番ありがち?
- JavaScriptでクイックソートを書く
- CPS形式で書かないといけないのでちょっと面倒
- JavaScriptのsortを利用し,継続との絡みは諦める
の3択.
さて,そろそろ修論の締め切りだが,1日8ページ書けば間に合う感じらしい.8ページ…8ページ…(思考停止) 日記のエントリを書くくらい適当に書ければいいんだけど.
■ [biwascheme] 多値を実装した…?
Valuesというクラスを新しく作り,valuesとcall-with-valuesを実装した.
本当は,
わざわざ多値を持ち込む「実用上の」理由は、性能だ。 valuesで返される多値はそれ自体はfirst classじゃない。 (各値はfirst classだけど、多値全体としてはそうじゃない)。多値は、それがvaluesで作られてからcontinutationに渡されるまでしか総体として存在しないのだ (立場によっては、全く存在しないと言っても良いだろう)。
[Scheme:多値より引用]
とのことなので,もっと効率の良い実装を考えるべきなのだろうけど….とりあえずはこれで.なんで多値が欲しかったかというと,partitionを実装するためで,これで Chapter 3 List utilitiesの関数が 全て実装できた.わあい.