申请不是程序(方案图程序)

时间:2014-02-18 13:20:35

标签: map scheme lambda r5rs

我试图在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]

如果有人能告诉我如何纠正这个错误,我会非常高兴。我无法理解为什么这段代码会失败。

1 个答案:

答案 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)