J-Bobを作ってみよう(8) 簡易プロファイラ
関数の呼び出し回数が見えるようにしてみようかと
env
に覚えるようにしておいて、japply
かなにかのタイミングで更新すればよさそう
リストのままだと更新しづらい(気がする)から、structにしてみようか
こういうの「純粋」なやりかたではどうやるのかな
まず動きはそのまま内部表現だけ変えます
続きを読むJ-Bobを作ってみよう(7)
テストを移植しながら調べているとここが無限ループとは言わないまでも
やたらと時間がかかっていることを発見しました
なおインデントは自分で直しています(以下同文
>> (defs? (tdefs)
'((defun double (x) (add x x))
(defun len (xs) (if (atom xs) '0 (+ '1 (len (cdr xs)))))
(dethm len>=0 (xs) (< '0 (+ (len xs) '1)))))
tdefs
というのはこれ
J-Bobでは普通の意味での変数がないので、引数なしの関数として定義しています
prelude
などと同じ
(defun tdefs ()
'((defun add (x y) (+ x y))
(dethm eq (x) (equal (equal x x) 't))
(defun li (x) (if (atom x) '() (cons (car x) (li (cdr x)))))
(dethm xy (x y) (if (equal x 'a) (equal y '1) 't))))
引数が短ければすぐ帰ってきます
続きを読むJ-Bobを作ってみよう(6) バグ発見
テストが書けるようになりましたのでj-bob.jbbにテストを移植しつつ調査していきました
へんな値が返されるのを発見
implication/1exp
actual :(if (equal x 'a) (equal (quote-c 't) 'b) 't)
expected:(if (equal x 'a) (equal y 'b) 't)
このテストで発生
続きを読むJ-Bobを作ってみよう(5) テスト
どうやって調べようか
テストを移植するかな
これまで書いたテストを再利用するためにはまずmy/test
が書けなきゃいけなくて
そのためには最低限display
とbegin
がほしい
J-Bobを作ってみよう(4) load
えーとあとは
ファイルから読めるようにしたらいいのか
どうするのがスマート?
J-Bobにload
つけるのかな
それともJ-Bobの外に作るのがいいだろうか
いったん外で使うのを作って、その後J-Bobに入れよう
文字列型もないけど
きっとread
ならなんとかしてくれる
J-Bobを作ってみよう(2) 組み込み関数
組み込み関数も作ればもうちょっとそれっぽい式で遊べるはず
関数が大きくなっていきますがしばらくは何も考えずにcond
の下に生やしていって
大きくなりすぎたなと感じてから考えます
でも(car e)
くらいはなんとかしたほうがいいな
(let ((op (car e)))
(cond ((eq? op 'quote) (cadr e))
ではまずcons
、car
、cdr
から