在Racket中递归传递参数

在Racket中递归传递参数,racket,Racket,我在racket中编写一个函数时遇到了问题,该函数应该将另一个函数作为第一个参数,将一个列表作为第二个参数 在最初调用函数时,一切似乎都进行得很顺利,但当我尝试以函数作为参数递归调用它时,它需要函数的参数。我希望这个参数函数在递归时作为函数传递,但用于定义中其他地方的求值。任何帮助都将不胜感激 (define apply-to-pairs (lambda (arg1 arg2) (if (or (equal? (length arg2) 0) (equal?

我在racket中编写一个函数时遇到了问题,该函数应该将另一个函数作为第一个参数,将一个列表作为第二个参数

在最初调用函数时,一切似乎都进行得很顺利,但当我尝试以函数作为参数递归调用它时,它需要函数的参数。我希望这个参数函数在递归时作为函数传递,但用于定义中其他地方的求值。任何帮助都将不胜感激

(define apply-to-pairs
  (lambda (arg1 arg2)
    (if (or (equal? (length arg2) 0)
            (equal? (length arg2) 1))
        '()
        (cons (arg1 (car arg2) (car (cdr arg2)))
              (apply-to-pairs (arg1 (cdr (cdr arg2))))))))

这是我的代码,它编译得很好,但是当执行应用于pairs的递归调用时,程序需要arg1的参数,而我只希望它作为函数定义传入。我得到了错误“预期2个参数,但只找到1”,因为它将
(cdr(cdr arg2))
视为它的参数,而我的意思是它是递归调用的第二个参数。

在应用于对的递归调用中,您调用的是arg1,而不是简单地将其作为值传递。也就是说,在
(arg1(cdr(cdr arg2))
周围有一组额外的参数。总之,你想要的是

(define apply-to-pairs
  (lambda (arg1 arg2)
    (if (or (equal? (length arg2) 0) (equal? (length arg2) 1))
        '()
        (cons (arg1 (car arg2) (car (cdr arg2)))
              (apply-to-pairs arg1 (cdr (cdr arg2)))))))

考虑跨多行格式化代码,以便更容易发现这些错误。

你是一个生活品味者。非常感谢你。新的编程在球拍和格式是非常合理的建议,我要工作。再次感谢。