Map 应用程序不是过程(方案映射过程)

Map 应用程序不是过程(方案映射过程),map,scheme,lambda,r5rs,Map,Scheme,Lambda,R5rs,我正在尝试用R5RS编写自己的简化映射过程。简而言之,它接受一个过程和两个列表,并返回一个列表,其中包含对两个参数列表中的每对对象调用的过程的结果,直到其中一个为空 这适用于算术运算符,例如: (map2-rec + '(1 2 3) '(1 2 3 4)) 但是,当我试图传递一个匿名lambda函数(我的tweet?过程的返回值)返回#t或#f时,这是不起作用的 (define (map2-rec proc items1 items2) (if (or (null? items1) (n

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

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

(map2-rec + '(1 2 3) '(1 2 3 4))
但是,当我试图传递一个匿名lambda函数(我的tweet?过程的返回值)返回#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]
如果有人能告诉我如何纠正这个错误,我会非常高兴。我自己也不明白为什么这段代码失败。

中都有一对额外的(错误的)括号,围绕着
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)
两个?
中都有一对额外的(错误的)括号,围绕着
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)

哇,就是这样!非常感谢你。一旦计时器准备好,我会接受答案:)@HenrikHillestadLøvold没问题,这是我的荣幸:)@HenrikÓscar的答案当然是正确的,但是你可以(而且应该)完全取消
if
,直接返回
(和(proc item1)(proc item2))
。哇,就是这样!非常感谢你。一旦计时器准备好,我会接受答案:)@HenrikHillestadLøvold没问题,这是我的荣幸:)@HenrikÓscar的答案当然是正确的,但是你可以(也应该)完全取消
if
,只需返回
(和(proc item1)(proc item2))
直接。当您有一组额外的括号(在本例中,它位于
((if…#t#f))
时,通常会发生此问题的可能重复。因此,
(if…#t#f)
(在本例中,
#t
)的结果将作为过程调用(但它不是过程)。此外,
(和……)
已经返回一个布尔值;
(如果test#t#f)
等同于
test
。您应该使用
(define(define(两者?proc)(lambda(item1 item2)(and(proc item1)(proc item2))
@JoshuaTaylor
不一定返回布尔值(例如:
(和12)
)-虽然它在OP的示例中可以正常工作,但如果出于某种原因,
两者都必须以独占方式返回
\t
\f
,那么可以使用
if
@scarLópez很好!是的,如果OP Henrik确实需要
\t
\f
,那么
(如果…\t\f)
是一个不错的选择。我似乎记得大多数Scheme对“任何非false的东西(
#f
在Scheme中,以及
()
在许多其他Lisp中)都是true”都有一点严格,“所以我只希望“
返回false或最后一个参数的值”Common Lisp中的行为。此问题的可能重复通常发生在您有一组额外的括号时(在本例中,它位于
((if…#t#f))
,因此
(if…#t#f)
(在本例中,
#t
)的结果被作为过程调用(但它不是过程)。此外,
(和……)
已经返回一个布尔值;
(如果test#t#f)
等同于
test
。您应该使用
(define(define(两者?proc)(lambda(item1 item2)(and(proc item1)(proc item2))
@JoshuaTaylor
不一定返回布尔值(例如:
(和12)
)-虽然它在OP的示例中可以正常工作,但如果出于某种原因,
两者都必须以独占方式返回
\t
\f
,那么可以使用
if
@scarLópez很好!是的,如果OP Henrik确实需要
\t
\f
,那么
(如果…\t\f)
是一个不错的选择。我似乎记得大多数Scheme对“Scheme中的任何非false(
#f
,以及许多其他Lisp中的
()
)都是true”的要求都比较严格,所以我只希望公共Lisp中的“
返回false或最后一个参数的值”行为。