端午在家休息了好几天,基本上就是带孩子和睡觉了。荒废了好几天之后,今天重操旧业。
The Little Scheme看到第99页了。要写一个函数numbered?来判断一个表达式是否是数字表达式。
上代码:
然后我自己写了一系列的测试用例来测试上面的函数。但是,慢慢的觉得这样太麻烦了。开始萌生自己写个测试工具的想法:我提供测试用例,工具来把参数传给被测试的函数,再把得到结果与预期结果相比较。这有点像JUnit中的AssertEqual。
时间不长写出来了,名字就叫testN吧。
上代码:
那来测一下之前写的函数numbered?
结果是:
哈哈,通过了。
The Little Scheme看到第99页了。要写一个函数numbered?来判断一个表达式是否是数字表达式。
上代码:
(define atom?
(lambda (a)
(not (or (null? a) (pair? a)))))
(define operator?
(lambda (op)
(or (eq? (quote +) op) (eq? (quote -) op) (eq? (quote *) op) (eq? (quote /) op))))
(define numbered?
(lambda (lat)
(cond
((atom? lat) (number? lat))
((null? lat) #f)
((null? (cdr lat)) #f)
((null? (cdr (cdr lat))) #f)
(else (and (numbered? (car lat)) (operator? (car (cdr lat))) (numbered? (car (cdr (cdr lat)))))))))
然后我自己写了一系列的测试用例来测试上面的函数。但是,慢慢的觉得这样太麻烦了。开始萌生自己写个测试工具的想法:我提供测试用例,工具来把参数传给被测试的函数,再把得到结果与预期结果相比较。这有点像JUnit中的AssertEqual。
时间不长写出来了,名字就叫testN吧。
上代码:
(define testN
(lambda (func test-cases)
(cond
((null? test-cases) '())
(else (map (lambda (it)
(eq? (apply func (list (car it))) (car (cdr it)))) test-cases)))))
那来测一下之前写的函数numbered?
(testN numbered? '(
(1 #t)
('a #f)
(() #f)
((1) #f)
((1 2) #f)
((1 'a) #f)
((1 + 2) #t)
((1 + (1 + 2)) #t)
((1 + (1 2)) #f)
(((1 + 2) + (1 + 9)) #t)
(((1 2) + (1 + 2)) #f)
))
结果是:
'(#t #t #t #t #t #t #t #t #t #t #t)
哈哈,通过了。