matchライブラリが動いた日
オレ処理系の[Nendo]についての開発メモ。
やっとmatchが動いたぞ。 chibi-scheme 0.3のmatchを変更無しで動かすことができた。 長かったー。let-syntaxの間違った実装を直すところから始めて約3ヶ月かかった。 忘れないうちに、Rubyのコードにトランスレートする時の注意点などを、これから数日かけて記事にしていこう。 自分で設計したVMに変換するのとは違い、既にターゲット言語が持つレキシカルスコープに乗せるやりかた(騙しかた)は、トランスレータ系の処理系を作っている人の役に立つかも。 ※ 英語で書ければベストなんだろうけど、そこまでのスキルは無い…
記念にmatchのテスト実行結果を貼っておこう。
time ruby -I ./lib ./bin/nendo ./test/match-test.nnd | tee -a test.log
Testing match ...
Testing match -----------------------------------------------------------------
<match>------------------------------------------------------------------------
test any, expects ok ==> ok
test symbol, expects ok ==> ok
test number, expects ok ==> ok
test string, expects ok ==> ok
test literal symbol, expects ok ==> ok
test null, expects ok ==> ok
test pair, expects ok ==> ok
test vector, expects ok ==> ok
test any doubled, expects ok ==> ok
test and empty, expects ok ==> ok
test and single, expects ok ==> ok
test and double, expects ok ==> ok
test or empty, expects ok ==> ok
test or single, expects ok ==> ok
test or double, expects ok ==> ok
test not, expects ok ==> ok
test pred, expects ok ==> ok
test named pred, expects 29 ==> ok
test duplicate symbols pass, expects ok ==> ok
test duplicate symbols fail, expects ok ==> ok
test duplicate symbols samth, expects ok ==> ok
test ellipses, expects ((a b c) (1 2 3)) ==> ok
test real ellipses, expects ((a b c) (1 2 3)) ==> ok
test vector ellipses, expects (1 2 3 (a b c) (1 2 3)) ==> ok
test pred ellipses, expects (1 2 3) ==> ok
test failure continuation, expects ok ==> ok
test let, expects (o k) ==> ok
test let*, expects (f o o f) ==> ok
test getter car, expects (1 2) ==> ok
test getter cdr, expects (1 2) ==> ok
test getter vector, expects (1 2 3) ==> ok
test setter car, expects (3 . 2) ==> ok
test setter cdr, expects (1 . 3) ==> ok
test setter vector, expects #(1 0 3) ==> ok
test single tail, expects ((a b) (1 2) (c . 3)) ==> ok
test single tail 2, expects ((a b) (1 2) 3) ==> ok
test multiple tail, expects ((a b) (1 2) (c . 3) (d . 4) (e . 5)) ==> ok
test Riastradh quasiquote, expects (2 3) ==> ok
test trivial tree search, expects (1 2 3) ==> ok
test simple tree search, expects (1 2 3) ==> ok
test deep tree search, expects (1 2 3) ==> ok
test non-tail tree search, expects (1 2 3) ==> ok
test restricted tree search, expects (1 2 3) ==> ok
test fail restricted tree search, expects #f ==> ok
test sxml tree search, expects (((href . "http://synthcode.com/")) ("synthcode")) ==> ok
test failed sxml tree search, expects #f ==> ok
test collect tree search, expects ((p ul li) ((href . "http://synthcode.com/")) ("synthcode")) ==> ok
passed.