SML処理系で利用可能なSML Basis Libraryを一覧化する [SML]
各SML処理系がSML Basis Libraryをどこまでサポートしているかを比較してみたいことがある。 自分だけかもしれないが、そういう一覧が必要だと思ったので作ることにした。
とはいえ数多いモジュールとそれに属する関数や定数をいちいち手作業で確かめるのは大変なのでスクリプトを書いた。
https://gist.github.com/tkob/11498077
スクリプトに関する覚書
まず、manpages.rbが http://www.standardml.org/Basis/manpages.html から個別のモジュールの解説ページのURLを取得してmanpages.txtに保存する。
次にgethtml.shがwgetを使って個別解説ページをダウンロードし、 module.rbがそれらのページからstructureとそれに属する値を抽出する。 ここでInt{N}とかWord{N}のようなstructureは16,31,32,63,64の値で展開することにした。 (ただし一部の処理系ではもっと細かく用意されている場合がある) この結果がval.txtに保存される。これは「Array.length」のような名前が1行1つの形式である。
こうして得られた名前が処理系でサポートされているかを確認するには、 REPLのある処理系ならばREPLに打ち込んで評価させればよい。 これをそのまま行うためExpectを使ってREPLを制御することにした。 check.tclがそれを行う。 check.tclは処理系ごとに実行し、smlnj.txt, poly.txtなどの名前で結果が保存される。
compare.rbが処理系ごとの結果を列として読み込んで横に並べ変える。(この種の処理をしたくなることは多いのだけどいつもコードをたくさん書いている気がする。何かいい方法はないのだろうか) 最後にperlのワンライナーでMarkdown形式に変換する。
こうして得られたのが次の結果である。
結果
https://gist.github.com/tkob/11498120
MLtonやMLKitのようなREPLのない処理系はいまのところ未対応である。 やるとしたらautoconf系のツールで行われているように短いプログラムをコンパイルさせてコンパイルが通るかどうかを見る方法になるだろう。
またこれは64bit版のUbuntuで得られた結果だが、32bit環境などではInt{N}などのサポート状況は変化するだろう。
コメント 0