Open4
Ribbon: 普通のインタプリタに仕立てる

普通のインタプリタって何だよ。。とにかく "スクリプトファイルとライブラリパスをコマンドラインに指定して実行する" 機能を付けないとテストがお辛いんで。。
ToDo
- ソースコードの整理。今のところ手元のビルド環境のパスを方々にハードコードしているのでそれらを止められるように。。
- bootstrapをC配列か何かにして内蔵できるように。
- 例外を setjmp/longjmp やC++例外で処理できるようにする。
- 型エラーみたいな軽微なエラーで
abort()
しないようにする。 - コンパイラを自前のものに置き換えて、定数伝播最適化をする。
- 名前空間を実装し、それに対応したグローバル変数の定数畳込をする。 (memo: reader類のディレイロードに対応が必要...)
- FFIに対応する
- マイコン用の実装を用意する
... これだけで1年終わるんじゃないか。。?

キャッシュからライブラリを読んでくれない
なんか文字化けしている。
(gdb) p *libsym->value->as_rib->field[0]->as_string
$3 = {refcnt = 3, str = 0x80039b930 "_121_117_110_105__scheme", len = 24}
これはたぶんライブラリキャッシュのためのライブラリをシンボル名にマップしている箇所が正常に動いていないので、そこだけ切り出して:
(import (yuni scheme))
(define (csafe str) ;; => string
(define (safechar? c)
(let ((code (char->integer c)))
;; Assumes ascii
(or (<= 48 code 57) ;; 0 .. 9
(<= 65 code 90) ;; A-Z and a-z
(<= 97 code 122))))
(let loop ((acc "")
(q (string->list str)))
(if (pair? q)
(loop (string-append acc (if (safechar? (car q))
(list->string (list (car q)))
(string-append
"_"
(number->string
(char->integer (car q))))))
(cdr q))
acc)))
(write (csafe "yuni")) (newline)
(write (csafe "scheme")) (newline)
"_121_117_110_105"
"_115_99_104_101_109_101"
... そもそも動作に再現性が無い。。元々は _121_117_110_105__scheme
という出力だったのに、デバッグ用に切り出すと常に数字に変換されてしまう。
... あ、比較処理の途中で break;
した場合は使わなかった引数をスタックから消さないとダメじゃん。。

とりあえず固定ファイルのロードが動いた
<=
の修正だけでとりあえず動いた。
real 0m7.214s
user 0m7.171s
sys 0m0.030s
1分くらい掛かってたのに比べると格段の進化。。bootstrapに含まれるVMコンパイル済のライブラリを直接使えるからね。。
後はコマンドラインのパースとかをSchemeで書いてしまえばインタプリタにはなるだろう。

readerランタイムにキャッシュが効いてなかった
1ファイルのreadを削ると1秒早くなっている。やっぱりread遅いのが効いてるなぁ。。でもreaderを各言語で実装しろとか絶対やりたくないもんな。。
real 0m5.814s
user 0m5.765s
sys 0m0.061s