在“球拍领域”,作者构建了一个用于教育目的的内置函数。
他们对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,比如racket文档显示-link-也可以使用两个或多个列表作为输入,比如:
(check-equal? (ormap + '(1 2 3) '(4 5 6)) 5)

使用“Realm of Racket”的实现进行测试时,您将得到:
(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...:

我该怎么解决?
如何使“我的ormap手册”过程通过此测试用例?

最佳答案

你说得对,内置的ormap处理多个列表我想我可以把你的问题分成两个问题第一:如何定义一个接受可变数量参数(称为“variadic”)的函数第二:如何定义变量ormap?
回答第一个问题:有两种定义变量函数的方法。最简单的方法是在参数列表中最后一个参数之前使用点:

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

前两个参数之后的所有参数都绑定到具有给定名称的列表中。
这个完全无用的函数接受两个或多个参数,并返回第三个参数(好的,无意义的,坏掉的)。
回答你的另一个问题好吧,这是一个在相同长度的多个列表上同时递归的问题,我想我建议您参考section 23.1 of HtDP 2e

09-30 10:29