这是一个hw赋值,要求我编写一个scheme函数,它接受一个函数(有两个参数)和一个列表作为参数,然后返回一个列表,其中列表的每个连续元素对被值替换应用于这两个元素的函数。
例如 - 如果列表具有奇数个元素,则忽略最后一个元素。例如,(应用于对(lambda(x y)(+ x y))'(3 9 5 8 2 4 7))应返回(12 13 6)。
到目前为止,我得到的是:(define (fn-name fn l)
(if (null? (cdr l))null
(cons
(fn((car l)(car (cdr l)))
(fn-name fn (cdr l))))))
但是,我在Racket(DrRacket)中收到此错误:
application: not a procedure;
expected a procedure that can be applied to arguments
given: 3
arguments...:
9
...并突出显示fn((car lst)(car (cdr lst)))
。我试图找出如何处理函数参数。谢谢你的帮助!
答案 0 :(得分:2)
正如您所做的那样,您只需像fn
这样的原语一样应用+
。但是,在(car lst)
和(car (cdr lst))
周围有额外的括号,这意味着您希望第一个元素也是您使用第二个元素调用的过程,因为它只是参数,然后只有fn
得到一个参数(结果是如果3,5或2恰好是程序)也许你反而想要(fn (car lst) (cadr lst))
(我用汽车+ cdr拍摄)
您的基本案例应检查l
和(cdr l)
是否为空,因为如果您正在完成其中任何一项。 (尝试使用(fn-name + '(5))
调用它)。您可以使用特殊表单or
来执行此操作,例如(or test1 test2)
。
另请注意,null
通常不是Scheme中的绑定符号。您需要定义(define null '())
或使用'()
。
编辑 ABout太多结果..
请注意,当您使用列表的前两个元素应用第一轮时,您将从列表开始递增一个新的l,除了第一个元素..这意味着您将处理9
和{ {1}}在下一次迭代中,而不是5
和5
。要解决此问题,您需要使用8
(cdr + cdr)而不是cddr
。