创建一个接受任意数量的函数作为参数的函数

Creating a function which takes any number of functions as arguments

我无法弄清楚如何创建一个可以将一系列 相同 函数作为参数的函数最后一个参数作为操作数。例如:

(func sqrt sqrt sqrt 390625)

上面的调用应该 return 5 as (sqrt 390625) > (sqrt 625) > (sqrt 25) > 5

我无法弄清楚我应该如何写这篇文章,因为我尝试过的任何方式都给我错误或实现了无限循环。

这段代码目前有:

(define func
  (lambda L
     (cond ( (equal? (length L) 2)               ((car L) (cadr L)) )  ;; If the list consists of only 2 elements, carry out the function (element 1) onto the operand (element 2)
           ( #t                     (apply (car L) (func (cdr L))) )  ;; otherwise, apply the function (1st element) onto the rest of the list
           )
    )
  )

第一个条件有效,例如 returning 5 如果我调用 (func sqrt 25),但是递归调用会抛出错误。

如有任何帮助,我将不胜感激。

OP 没有提供 chain 的定义,所以这部分不清楚,但我认为这里的一个基本问题是没有对 func 的递归调用;此外,apply 没有用在正确的位置。

与其使用 (equal (length L) 2) 作为基本情况,只要输入中的第一个元素是过程,或者只是 return 元素,进行递归调用可能会更好:

#lang racket

(define multi-call
  (lambda args
    (let ((arg (car args)))
      (if (procedure? arg)
          (arg (apply multi-call (cdr args)))
          arg))))

在这里,当 arg 是一个过程时,它会应用于对剩余参数递归调用 multi-call 的结果。请注意,multi-call 接受任意数量的参数,将它们包装在列表 args 中。缩减步骤提供 (cdr args),这是一个 list 的剩余参数。这意味着 apply 应该用于调用 multi-call 那些剩余的参数,因为 multi-call 需要任意数量的参数,而不是参数列表。

multi-call.rkt> (multi-call sqrt sqrt sqrt 390625)
5