我试图在R5RS中编写自己的简化地图程序。简而言之,它需要一个过程和两个列表,并返回一个列表,其中包含在两个参数列表中的每对对象上调用的过程结果,直到其中任何一个为空。
这适用于算术运算符,例如:
(map2-rec + '(1 2 3) '(1 2 3 4))
但是,当我尝试传递一个匿名的lambda函数(我的两个函数的返回值)返回#t或#f时,这不起作用。
(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]
如果有人能告诉我如何纠正这个错误,我会非常高兴。我无法理解为什么这段代码会失败。
答案 0 :(得分: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)