如何将一个函数解析为scheme中的另一个函数

How to parse a function into another function in scheme

我正在尝试创建一个将另一个函数作为参数并在循环中调用这些函数的函数。

下面的代码应该得到函数和循环应该执行的次数:

(define (forLoop loopBody reps)
    (let
        (
         (fun (car loopBody))
         (str (cdr loopBody))
        )
       (cond
          ((eval (= reps 0) (interaction-environment)) "")
          (else (cons str (forLoop '(fun str) (- reps 1))))
       )
    )
)

下面的代码是我调用函数的方式

(define (printermsg)
  (display msg)
 )
(forLoop '(printer "text ") 4)

以上代码的预期输出:

text text text text 

您的代码存在几个问题:

  • 您将 loopBody 参数传递给您的函数的方式不正确,符号列表将不起作用:您想传递一个包含实际 函数的列表 及其参数。
  • 您没有获取列表中的第二个元素,cdr 将无法工作,因为它 returns 列表的其余部分,您需要改用 cadr
  • 避免使用 eval,它对于您想要的东西来说完全没有必要,而且通常是一个坏主意。
  • 你为什么要建立一个列表? cons 这里不需要。
  • 调用递归时,您再次传递符号列表而不是正确的参数。
  • 你实际上并没有调用函数!

这应该有效:

(define (forLoop loopBody reps)
  (let ((fun (car  loopBody))
        (str (cadr loopBody)))
    (cond
      ((= reps 0) (void)) ; don't do anything when the loop is done
      (else
       (fun str) ; actually call the function!
       (forLoop loopBody (- reps 1))))))

(define (printer msg)
  (display msg))

(forLoop (list printer "text ") 4) ; see how to build the loop body
=> text text text text