编写一个函数,将函数作为Racket中的参数

时间:2014-08-13 23:22:15

标签: scheme racket

这是一个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)))。我试图找出如何处理函数参数。谢谢你的帮助!

1 个答案:

答案 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}}在下一次迭代中,而不是55。要解决此问题,您需要使用8(cdr + cdr)而不是cddr