「Ocamlで動的型」に反応
Lisperとして住井先生 (id:sumii:20060129) に反応してみる.
「いかさまdynamic typing in OCaml」は,polymorphic variantが目を引くけど((Ocamlのpolymorphic variantってのは,本当に「最低限」を推論するんだなぁ.t
やd
の型はゴチャゴチャして見辛いけど,よく見れば必然性のある型付けをされていることが分かる.なお「コンストラクタが1通り以下の型」という表現に意味がないことに注意.)),要するにOcamlで動的型言語のevalを書いた話*1.インタプリタの最下位レイヤは結局 以下の3ステップであり,
- 実装された言語の値を実装する言語の値に変換する
- 実装する言語の値に対して演算を実行
- 実装する言語の値を実装されたの値に戻す
2はOcaml処理系がやってくれるので1, 3のためにtupleに変換のための関数を2つ入れた.「実装された言語の型というのはすなわち変換関数の組だ」というのは今まで考えたことがなかったので新鮮だった.
「拡張可能」というところは [> `Int | `Bool | `List]
に `Pair
を追加した,という想定らしい.分割コンパイルできるのかな?(試してない.)さてそのように型を次第に膨らませてったとき,そのevalの一部を担う関数は「下位に回す/自分自信で処理/上位に頼る」の32通り*2の選択肢がある.下位の担当は既に知られてるから名前で呼んでやればよいし,再帰的評価の際には上位の担当に引数self
を通じて頼ればよい.しかしYコンビネータっぽいものの必然性が分かりません.
ところでpolymorphic variantの型付けアルゴリズムについてはGarrigue先生の解説を読むしかないのかな? きっとmatch
がカギなのだろうけど...
さてその前段の「手動dictionary passingによる面倒type classプログラミング in Ocaml」,これはdictionary passingと言うより「↑で触れたような動的型言語のevalにおける場合分けを人間がやっただけ」に見える.Dictionaryの構成と検索を自動でやってくれないと物足りないような... まぁそんなことを言ってると本当に新言語のインタプリタを実装する破目になる(笑
それにしてもdictionary passingは,結局C++の仮想関数みたいな動的な処理(および上手く行けばインライン展開)に過ぎないのかな? Type Classes in Haskell は前に眺めたのだけど理解できなかった.
... こういうことをウダウダ書くのは割と時間をかけずにできるのだけど,じゃあ何か実装してみろと言われてもなかなかできないのだよな... はぁ=3