2002-02-14
λ. 薔薇を贈る。とりあえず。
λ. スレッドの実装
Ruby Hacking Guide の「スレッド」の項を読んだ。スタックを拡張する部分がちょっと不思議に思っていたのだけど、疑問は氷解。それにしても、どのインタプリタでも大抵こんな実装なのでしょうか?
λ. compile party
いっちーさん主催(?)のコンパイル・パーティ。1.3.3と1.2.3がリリースされたとこだし、これは参加する鹿。
λ. Ruby/DLとGimp-Ruby
rb_dlptr_newという関数があるようなので、Gimp-RubyでGimp::Tile#dataをDL::PtrDataを返すように実装。
rb_dlptr_newにはメモリの解放用の関数を指定できるんだけど、そのコールバック関数にはラップされたメモリへのポインタしかわたされないので、こいつを使ってタイルのリファレンスカウンタを減らしてやる事は出来ない。
一瞬悩んだのだが、PtrDataにTileへの参照を持たせてしまうことにした。こうすれば、PtrDataよりも先にTileが解放される事はなくて、リファレンスカウンタの増減はGimp::Tileの側だけで済ますことが出来る。
λ. 小泉首相: 貸し渋り対策に重点置く考え 財政出動より金融政策
貸し渋り対策ねぇ。
ところで、小泉首相のいうデフレ対策に不良債権の早期処理が含まれているのはどういうことよ? 国民を馬鹿にしてるとしか思えない。
λ. SF-ADJUSTMENT
SF-ADJUSTMENTがGIMP_PDB_STRINGとして扱われている理由だけど、なんとなくわかった気がする。いっちーさんのツッコミにあるように以前はSF-VALUEで扱っていて、SF-VALUEはGIMP_PDB_STRINGとして扱われていた。それでSF-ADJUSTMENTを導入した際に、それまでとの互換性を保つために当面はSF-ADJUSTMENTもGIMP_PDB_STRINGとして扱うことにしたんじゃないのかな。
2003-02-14
λ. この一週間色々あったけど、ボチボチ復活していきます。
λ. nanzen
酒井君がnanzenにたまにログインしているようなので,
generic-haskellとGHCをインストールしてみた.
う、バレてしまった(←そりゃバレるって)。実は、GNOME2を入れたと聞いて、Ruby-GNOME2で遊んでいたのでした。GNOME2が入っている研究室マシンって今nanzenだけですよね?
λ. 読書
2004-02-14
λ. 借りた本
- 『灰色のアイリス 4』
- 『灰色のアイリス 5』
- 岩田 洋季 [著] 佐藤 利幸 [イラスト]
- 『イリヤの空、UFOの夏 その3』
- 秋山 瑞人 [著] 駒都 えーじ[イラスト]
- 『過ぎ去ろうとしない過去—ナチズムとドイツ歴史家論争』
-
ユルゲン・ハーバーマス(Jürgen Habermas),
エルンスト・ノルテ(Ernst Nolte),
ミヒャエル・シュテュルマー(Michael Stürmer),
ミヒャ・ブルームリク(Micha Brumlik),
クラウス・ヒルデブラント(Klaus Hildebrand),
ヨアヒム・フェスト(Joachim Fest),
エーバーハルト・イェッケル(Eberhard Jäckel),
ユルゲン・コッカ(Jürgen Kocka),
ハンス・モムゼン(Hans Mommsen),
マルティン・ブロシャート(Martin Broszat),
ルドルフ・アウグシュタイン(Rudolf Augstein),
アンドレアス・ヒルグルーバー (Andreas Hillgruber),
クルト・ゾントハイマー(Kurt Sontheimer)
[著]
徳永 恂, 三島 憲一, 清水 多吉, 小野島 康雄, 辰巳 伸知, 細見 和之 [訳] - 小説すばる 2003年7月号
- AERA No.6 '04.2.9
2005-02-14
λ. g の逆関数が存在するときに Anamorphic Fusion が成功するか
gに逆関数が存在するなら、ψ' = F(g-1) ∘ ψ ∘ g とおけば、Fusionできるのは自明。なーんて簡単な話では無いのだとは思うけれど……
λ. レコード型+不動点演算子で late binding を表現
http://www15.ocn.ne.jp/~rodinia/Blog/MyJournal.html
不動点演算子を作用させた時点でthis.methodが決まってしまうのはその通りですが、不動点演算子を使うのはどうせ具体的な値を定義する段階でなので、一般的なOO言語の late binding を表現するにはそれで十分です。
具体的には、AのコンストラクタをA->Aの形で表現しておく約束にしておいて、それにfixを適用することでAのインスタンスを定義することにすればOK。簡単な例をHaskellで書くと以下のような感じ。Aを継承して一部のメソッドをオーバーライドしたBを定義するのを模倣している。
fix :: (a -> a) -> a fix f = let x = f x in x data A = A { op :: Int -> Int , twice :: Int -> Int } -- Aのコンストラクタ ctorA :: A -> A ctorA this = A { op = \x -> x+1 , twice = \x -> this `op` (this `op` x) } -- Aのインスタンス objA :: A objA = fix ctorA -- Haskellには残念ながらサブタイピングが無いので (T_T) type B = A -- Bのコンストラクタ。opをオーバーライド。 ctorB :: B -> B ctorB this = super{ op = \x -> (super `op` x) * 2 } where super = ctorA this -- Bのインスタンス objB :: B objB = fix ctorB
試してみると、objB `twice` 10
= 46
= (((10+1)*2)+1)*2
となって、AのopではなくBのopが呼ばれていることが分かる。
なお、この方法だと <mi : Bi>i∈I は μX.[mi:X -> Bi]i∈I ではなく、[mi: Bi]i∈I で表現されるので、サブタイピングに関しても何の問題も無い。
2007-02-14
λ. 関数論理型言語Curryを試してみる
Haskellでパーサを書く時に面倒な点 で書いたようなこともあり、最近、関数論理型言語に興味がわいている。色々な人が試しているので、私も試してみる事に。処理系は他の人が試しているZincではなく、Münster Curry Compilerを選んでみた。Zincは最新版1.02のリリースが2004-12-07で、あまりメンテナンスされていなそうだったので。
choose
インストールして早速 <URL:http://d.hatena.ne.jp/m-a-o/20070205#p2> に書いてあった chooseを試してみたのだが……
-- Choose.curry choose x y = x choose x y = y
% cyi Choose.curry _____ __ __ / ___/ | / _ Muenster Curry Compiler / / | / | | Version 0.9.10, Copyright (c) 1998-2006 / /___ / / | | \____/ /_/ |_| Type :h for help > let x = choose 0 1 in x - x [Compiling ...] 0 | 0 > choose 0 1 - choose 0 1 [Compiling ...] 0 | -1 | 1 | 0
……これはやっぱりキモイよ。 後者で「-1」や「1」が答えに含まれるということはchooseは関数になっていないということだし、参照透明でもないということじゃん。
が、実行メカニズム的には仕方ないんだろうな。 オーバーラップしたパターンを禁止するならともかく、オーバーラップしたパターンを許す場合に関数的に振る舞うように実装するのは現実的でない(もしくは不可能)だと思う。
パターンマッチで単一化は起らない?
> let x free in if x then x else x [Compiling ...] Suspended > let x free in case x of True -> x; False -> x [Compiling ...] Suspended
「True | False」が結果になるとばかり思っていたので、意外だった。
しかし、以下のように関数を介した形にしたところ、Suspendedにならなくなった。
ifte :: Bool -> a -> a -> a ifte True x _ = x ifte False _ y = y
> let x free in ifte x x x [Compiling ...] {x = True} True | {x = False} False
関数引数におけるパターンマッチとcase式でのパターンマッチとでは振る舞いが違うのね……。これは何故こうなっているのだろう?
非決定性
上では「実行メカニズム的に仕方ないんだろうな」と書いたが、標準ライブラリに Success.choose :: [a] -> a
やら Combinatorial.permute :: [a] -> [a]
みたいなのがあるのを見ると、非決定的・非関数的な振る舞いを積極的に利用するのがCurryのスタイルのようだ。やっぱり関数型言語よりも論理型言語っぽいな。
パーサー
<URL:http://web.sfc.keio.ac.jp/~mukai/2006-langsem/06-dcg-feature.pl>を真似てみる。
import Parser data Person = First | Second | Third data Number = Singular | Plural s = let person free number free in n person number <*> v person number n :: Person -> Number -> Parser String n First Singular = terminal "I" n First Plural = terminal "we" n Second _ = terminal "you" n Third Singular = terminal "he" n Third Singular = terminal "she" n Third Singular = terminal "it" n Third Plural = terminal "they" v :: Person -> Number -> Parser String v First _ = terminal "run" v Second _ = terminal "run" v Third Singular = terminal "runs" v Third Plural = terminal "run"
> s ["he", "runs"] [Compiling ...] [] > s ["he", "run"] [Compiling ...] No solution
2008-02-14
λ. “Towards open type functions for Haskell” by Tom Schrijvers, Martin Sulzmann, Simon Peyton Jones, and Manuel Chakravarty
を読んだ。
<URL:http://research.microsoft.com/~simonpj/papers/assoc-types/>
λ. プログラムが⊥を返す意味 / プログラムに⊥を渡す意味
萩野先生の情報アーキテクチャ 第4回「領域理論入門」のp.19「最小元の正体」に以下のようにあったのだけど、萩野先生がこれを喋っているのが目に浮かんで……
- プログラムが⊥を返す意味
- 答がでない.無理.
- いくら計算しても止まらない
- 未定義
- プログラムに⊥を渡す意味
- なにも情報がありませんが,計算して!
- これを使ってはいけませんよ
ψ いっちー [カットアンドペーストのミスって、アナタ...]