SML#の型安全性
こういうのを見るとついイジワルをしてみたくなるのが性というやつで……(好きなコをいじめちゃう子供の心理か?(笑))、
% smlsharp SML# 0.20 (2007-03-30 10:47:08 JST) # val libc = DynamicLink.dlopen </usr/lib/libSystem.dylib>; val libc = 0x00b00270 : unit ptr # val puts = DynamicLink.dlsym (libc, <puts>) : _import _stdcall int -> int; val puts = fn : int -> int # puts 0; (null) val it = 10 : int # puts 1; zsh: 642 bus error smlsharp
うむ、まあ、予想通りだな。
ヘッダファイルを読んで型を見てくれればよいのだけれど、それにかかるコストを嫌ったか、void* みたいな「ふつうキャストして使う」ような用途はそれじゃムリと判断したか、Cのプロトタイプ宣言を読んでも限界があると見切ったか……。いずれにせよ、 FFI なんだからそりゃまあ仕方ねえだろうというアレですね。
ちなみに Haskell でも foreign 宣言を解釈する処理系なら同じくらい気軽に書けるし、 C-&gt;Haskell (c2hs) を使えば c-wrapper くらいには楽に書けるのだけれど、ただし問題があって、対話環境にいきなり追加させたりできないし、型の相互受け渡しが面倒くさいのだ。 Int くらいは可能だけど、リスト→配列は(そういう関数があるわりには)自動的にやってくれないし、Haskell文字列(文字リスト)→C文字列の変換は、それはそれで厄介である。 SML# はその辺が異様に楽なようですごいなあと素直に感心する。
ところで、 SML# のソースコードに sample というのがあって、いろいろなサンプルがあって GLUT の例なんかなかなかスゴいと思うが、個人的にびっくりしたのは qsort。「なんだクイックソートかよ」と思ったらさにあらず、 libc にある qsort を使って SML の配列をソートする例なのだった。そんなのありか。
って qsort の型が多相的であることに今頃気付いてちょっと驚いている今のわたし。 _sizeof ってスゲエなー。何の話かというのはこちらに情報がありますね。
内容と絡んでなくて、さらに既にご存知だったらすみませんが、preタグのなかの’< 'や'>‘の’&'がさらにエスケープされてませんか?ソース読んでパッチ書けるほどHaskellが書けないのでご報告を。
あーこれですね、じつは1回編集して書き直すと、再編集段階でエスケープされてしまうのでうっかりすると残ってしまうというしょぼいことになっているのです。
わたしが再編集しなければ発生しない問題なので「まいっか」と後回しになっております。