Open4

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

okuokuokuoku

普通のインタプリタって何だよ。。とにかく "スクリプトファイルとライブラリパスをコマンドラインに指定して実行する" 機能を付けないとテストがお辛いんで。。

ToDo

  1. ソースコードの整理。今のところ手元のビルド環境のパスを方々にハードコードしているのでそれらを止められるように。。
  2. bootstrapをC配列か何かにして内蔵できるように。
  3. 例外を setjmp/longjmp やC++例外で処理できるようにする。
  4. 型エラーみたいな軽微なエラーで abort()しないようにする。
  5. コンパイラを自前のものに置き換えて、定数伝播最適化をする。
  6. 名前空間を実装し、それに対応したグローバル変数の定数畳込をする。 (memo: reader類のディレイロードに対応が必要...)
  7. FFIに対応する
  8. マイコン用の実装を用意する

... これだけで1年終わるんじゃないか。。?

okuokuokuoku

キャッシュからライブラリを読んでくれない

なんか文字化けしている。

(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; した場合は使わなかった引数をスタックから消さないとダメじゃん。。

https://github.com/okuoku/ribbon/commit/d17e06d8140f1bbd6f34b145fda0a5a5be282ebf

okuokuokuoku

とりあえず固定ファイルのロードが動いた

<= の修正だけでとりあえず動いた。

real    0m7.214s
user    0m7.171s
sys     0m0.030s

1分くらい掛かってたのに比べると格段の進化。。bootstrapに含まれるVMコンパイル済のライブラリを直接使えるからね。。

後はコマンドラインのパースとかをSchemeで書いてしまえばインタプリタにはなるだろう。