kb84tkhrのブログ

何を書こうか考え中です あ、あと組織とは関係ないってやつです 個人的なやつ

J-Bobを作ってみよう(5) テスト

どうやって調べようか
テストを移植するかな
これまで書いたテストを再利用するためにはまずmy/testが書けなきゃいけなくて
そのためには最低限displaybeginがほしい

とりあえず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

楽(何かを捨てている気もする