2009-01-01から1年間の記事一覧

OCaml: let recの多相

OCamlで,let recで定義した多相関数は,束縛の右辺では多相にならないことに気がついた. let rec id x = x and y () = id 0 and z () = id true;; ^^^^intでないのでエラーになる

OCaml: 型検査が通らない例

カリー化された関数opとそれに適用する引数をリストで受け取り1つずつ適用するようなexpand_args関数を以下のように定義する. let rec expand_args op args = match args with [] -> op | v::rest -> expand_args (op v) rest以下のように使いたい. # expa…

OCamlの評価順序

OCamlの2項演算子の評価順序は右から左だった. # let x = ref 3 in (let () = x := 5 in !x) + !x;; - : int = 8 # let x = ref 3 in !x + (let () = x := 5 in !x);; - : int = 10 関数の引数の評価順序も同様 # let f x y = x + y;; val f : int -> int -…

Tclのセマンティクスを定義してみる

自然意味論によってTclのセマンティクスを定義してみることにする. Tclの構文 まず,抽象構文を以下のように定義する. C ::= W W* | C ; C W ::= V | [ C ] | { C } V ::= s | x | $x s ∈ Str x ∈ Var sは文字列を表し,xは変数を表すメタ変数である.Tcl…

有向グラフを強連結成分に分解するアルゴリズム

CormenのIntroduction to Algorithmsには,グラフGと有向辺を逆にしたG_revに対してそれぞれDFSする方法が紹介されている.これは,わかりやすいアルゴリズムではあるのだけれど,逆グラフを求める必要があるのが玉にキズである.一方,SedgewickのAlgorithm…

DSからCPSの関数を呼び出す方法

CPSからDS(Direct Style)の関数を呼び出すのは,以下のように何の問題もなくできる. fun f_cps(k, x) = let t = g_ds(x) in ... (k t) // リターン ではその逆はどうか? DSの関数は,現在の継続を明示的にパラメータとして渡されていないので,呼び出した…

トランポリンの代わりにgotoを使う

値としてのラベル GCCはいろいろな独自拡張があるけど,その1つにラベルの指すアドレスを値として取得する機能がある. void *address = &&label; ... label: ... goto *address;のように&&演算子をラベル名の前に付けると,そのラベルのアドレスを取り出す…

CPS変換まとめ

CPS変換の手法にもいろいろある.前提として,λ式は以下のような構文で定義されているとする. M, N ::= x | λx.M | M N CPS(継続渡し形式)とは,計算が行われる順序を明示するために,ある式の計算結果を,残りの計算を表す継続(途中結果を受け取り,残り…