0

我正在尝试在 R5RS 中编写自己的简化地图程序。简而言之,它接受一个过程和两个列表,并返回一个列表,其中包含在两个参数列表中的每对对象上调用的过程的结果,直到其中一个为空。

这适用于算术运算符,例如:

(map2-rec + '(1 2 3) '(1 2 3 4))

但是,当我尝试传递返回 #t 或 #f 的匿名 lambda 函数(我的 both? 过程的返回值)时,这不起作用。

(define (map2-rec proc items1 items2)
  (if (or (null? items1) (null? items2))
      '()
      (cons (proc (car items1) (car items2))
            (map2-rec proc (cdr items1) (cdr items2)))))


(define (both? proc)
  (lambda (item1 item2)
    ((if (and (proc item1) (proc item2))
         #t
         #f))))

我在 DrRacket 中收到的具体错误是:

application: not a procedure;  
expected a procedure that can be
applied to arguments   
given: #t   
arguments...: [none]

如果有人能告诉我如何纠正这个错误,我会很高兴。我不明白为什么这段代码自己会失败。

4

1 回答 1

4

both?在表达式周围有一对额外的(和错误的)括号if。这应该解决它:

(define (both? proc)
  (lambda (item1 item2)
    (if (and (proc item1) (proc item2))
        #t
        #f)))

现在您的程序按预期工作:

(map2-rec + '(1 2 3) '(1 2 3 4))
=> '(2 4 6)
(map2-rec (both? even?) '(1 2 3) '(1 2 3 4))
=> '(#f #t #f)
于 2014-02-18T13:24:15.380 回答