Map 应用程序不是过程(方案映射过程)
我正在尝试用R5RS编写自己的简化映射过程。简而言之,它接受一个过程和两个列表,并返回一个列表,其中包含对两个参数列表中的每对对象调用的过程的结果,直到其中一个为空 这适用于算术运算符,例如: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
(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或最后一个参数的值”行为。