Twitter: @kinaba

シェルを作る課題、システムコールだけで、 という話題を見てていつも思い出されるのが、シェルの対話ループを for 文でも while 文でも関数の再帰呼び出しですらなく、 execve(自分) で実現してた 某友人のコードなのであった。あれを見てはじめて末尾再帰≒ループ、の意味が理解できたよ。

16:51 08/01/12

memo: POPL 3

POPL 2008 の 面白かった発表めも最終日。たぶん論文名でググればPDFが見つかるものが多いと思います。

"Clowns to the Left of Me, Jokers to the Right"。昔から勝手に大ファンの Conor McBright 氏の発表なのです。Zipper はコンテナの中を行ったり来たりしながら １個１個順番に操作を加えるデータ構造だけど、コンテナの要素の型は変えない。この論文では、 コンテナの要素を別の型に置き換えていく操作に一般化したZipperみたいなものを与えています。 …ってわかりにくいな。map をステップバイステップでできるようにしたのが Zipper だとすれば、 今度のは fold をステップバイステップでできるようにしたもの、というか。 そしてあるコンテナのZipperは、そのコンテナの型を微分！すれば 自動的に得られるのに対し、今度のは型に対するDissectionという操作で自動的に得られる。

"Extensible Encoding of Type Hierarchies"。 多重継承対応かつインクリメンタルな、クラスの継承関係を効率的に判定する方法 "ESE"。 既存手法も色々おもしろい（→前まとめた記事）けどこれも面白い。 方法としては、クラスの集合をできるだけ少ない個数の "Straight Slice" の集合に適当に分割する、 というもの。Straight Slice とはクラスのリストで「リスト内で ..., classA, ..., classB, ..., classC, ... の順にクラスが並んでたらclassAの派生クラスかつclassCの派生クラスなクラスは全てclassBの派生クラスでもある」 ようなもの。こうすると、任意のクラス c について、「cの先祖」は必ず各Straight Slice内で連続して並ぶ ようになる。なるので、その範囲を覚えておけば先祖判定が少ない手間でできるようになる。 新しいクラスを追加するときには、可能な限り親と同じスライスの親の隣に置くようにする、という感じで PQ Encodingとかより局所的な手間で追加もできる。 （※追記：比較対象の DSTの論文 (リンク先PDF) 読んでみたら、もうこっから Straight Slice に基づく手法なのか。なるほど。 このスライスの格納の仕方が違うと言うことかな）

"The Design and the Implementation of Typed Scheme"。PLT Scheme に #lang typed-scheme を実装。 元々PLT Schemeにcontractのシステムがあるので、untyped scheme からは typed scheme で書かれた モジュールの型は contract として見えるようにしてあるというのが、へーと思った。 "型" は例えば (define-type-alias Complex (∪ Number (cons Number Number))) こんなんで、Number か NumberとNumberのペア、だけが入ることを期待することを表現したりできる。 データを表現するS式の構造を型とする感じだろうか。 あと厄介なのが同じ変数に、場所によって違う型をつけなきゃいけないパターン (lambda (x : (∪ Number Boolean)) (if (number? x) (+ x 1) (not x))) で、これをやる既存の型システムはなかなかないと。number? のような述語の判定がどうなるかtrue/falseまで 型判定に含めておいてif式で分岐するところで別の環境を使えるようにするシステムになってるみたい？

他に、知識不足で全然わからなかったのだけど "Foundations for Structured Programming with GADT"。 GADT も何かのファンクタの始代数になってることのconstructiveな証明、という理解でいいのかな。 酒井さん辺りが詳しそうだ。 この発表のあと昼食やコーヒー休憩のときに周りで Kan extension について語ってる人が急増してた感じが。 あと他には、招待講演の "Caml Trading" で「他の言語機能はまだともかく、Algebraic Data Type がない言語はそれだけで死ねる」って趣旨のことをおっしゃってて、256% 同意 なのであった。いわゆる"関数型言語"の機能のうち最強のものだけが主流の言語の 機能にならずに残ってる、というのはほんと不思議。closure入れるより先にやることが あるだろう…って全然講演関係ないぞ俺。

とまあ、そんな感じでした。 正確で網羅的なまとめは 住井さんのメモ をどうぞ！