J-Bobを作ってみよう(5) テスト
どうやって調べようか
テストを移植するかな
これまで書いたテストを再利用するためにはまずmy/test
が書けなきゃいけなくて
そのためには最低限display
とbegin
がほしい
とりあえずdisplay
(define op1s '(car cdr atom natp size load display))
:
((eq? op 'display) (display arg))))
:
相変わらず文字にもquoteが必要
>> (display '"aaa\nbbb\n")
aaa
bbb
#<void>
>>
display
はともかくbegin
は何となく気が引けます
begin
は特殊形式かな?
特殊な気もするけど、引数を順番に評価するだけだから関数として扱えないこともない気がする
あ、引数が可変個だ
まあとにかく特別扱いします
一応最後に評価した式の値を返すように
((eq? op 'begin)
(for/last ((e (cdr e)))
(jeval e)))
試す
>> (begin (display '1) (display '2) (display '"\n") 't)
12
t
いいかな
my/test
はちょっと簡略化してこう
(defun my/test (name actual expected)
(if (equal expected actual)
't
(begin
(display name)
(display '"\nactual :")
(display actual)
(display '"\nexpected:")
(display expected)
(display '"\n")
'nil)))
テストのテスト
> (repl)
>> (my/test '"test" (cons 'a 'b) '(a . b))
t
>> (my/test '"test" (cons 'a 'b) '(a . c))
test
actual :(a . b)
expected:(a . c)
nil
よさそう
quoteつけるのめんどくさくなってきたなあ
文字列は自身に評価されることにしちゃうか
でも数字はquoteすることにしておきたいので文字列だけ
(define (jeval e)
(cond
((string? e) e)
(else
(let ((op (car e)))
(cond ((member op op1s)
:
これで楽になったはず
>> "aaa"
aaa
>> (display "aaa")
aaa#<void>
>> (display '"aaa")
aaa#<void>
>> (load "mytest.jbb")
#<void>
>> (my/test "test" (cons 'a 'b) '(a . b))
t
>> (my/test "test" (cons 'a 'b) '(a . c))
test
actual :(a . b)
expected:(a . c)
nil
楽(何かを捨てている気もする