Ormap版本在" Realm Of Racket"

时间:2016-11-08 17:13:45

标签: unit-testing lisp racket

在" Racket"领域,作者构建了一个用于教育目的的内置函数。

他们对ormap的实现是:

(define (my-ormap-book pred lst)
  (cond [(empty? lst) #f]
        [else (or (pred (first lst))
                  (my-ormap-book pred (rest lst)))]))

在许多情况下,这段代码似乎运行良好,比如下面的单元测试:

(require rackunit)
(check-equal? (my-ormap-book add1 '(3 4 5)) 4)
(check-equal? (my-ormap-book add1 '()) #f)
(check-equal? (my-ormap-book positive? '(1 2 a)) #t)

然而,真实的Ormap,如球拍文档显示 - link - 也适用于两个或多个列表作为输入,例如:

(check-equal? (ormap + '(1 2 3) '(4 5 6)) 5)

使用"实施Racket&#34实施的测试时,您会得到:

(check-equal? (my-ormap-book  + '(1 2 3) '(4 5 6)) 5)

my-ormap-book: arity mismatch;
 the expected number of arguments does not match the given number
  expected: 2
  given: 3
  arguments...:

我该如何解决这个问题? 如何制作" my-ormap-book"程序传递给这个测试用例?

1 个答案:

答案 0 :(得分:0)

内置的ormap处理多个列表是对的。我想我会把你的问题分成两个问题。首先:如何定义一个带有可变数量参数的函数(称为“variadic”)?第二:如何定义可变参数ormap?

回答第一个问题:有几种方法可以定义可变参数函数。最简单的是在参数列表中使用一个点,在最后一个参数之前:

(define (f a b . rest-args)
  (first rest-args))

前两个之后的所有参数都捆绑到具有给定名称的列表中。

这个完全无用的函数接受两个或多个参数,并返回第三个参数(好吧,没有意义的已损坏)。

回答你的另一个问题......好吧,这是一个同时递归多个相同长度列表的问题,我想我会把你推荐给section 23.1 of HtDP 2e