自己写一个scheme测试工具

端午在家休息了好几天,基本上就是带孩子和睡觉了。荒废了好几天之后,今天重操旧业。
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)

哈哈,通过了。

你可能感兴趣的:(Scheme)