4

我正在尝试创建一个将两个函数作为参数并执行它们的函数。

我尝试使用cond,但它只执行action1

(define seq-action
  (lambda (action1 action2)
    (cond
     ((procedure? action1) (action1))
     ((procedure? action2) (action2)))))

我觉得一个接一个地跑应该不会太难。它们不需要同时运行。

我只是(action1) (action2)并排尝试过,但它只返回action2. 这是我为action1and定义的内容action2

(define ax 
  (lambda ()
    (+ 1 2)))
(define bx 
  (lambda ()
    (+ 5 2)))
4

3 回答 3

5

一个接一个地执行一个过程就这么简单:

(define seq-action
  (lambda (action1 action2)
    (action1)
    (action2)))

但是,上面只会返回最后一个过程的结果。如果您需要两个结果,则返回一个包含值的列表,如下所示:

(define seq-action
  (lambda (action1 action2)
    (list (action1) (action2))))

或者,您可以使用以下过程同时返回多个值:values

(define seq-action
  (lambda (action1 action2)
    (values (action1) (action2))))

要在调用最后一个版本后检索这两个值,您需要使用let-values.

于 2012-10-05T04:00:30.207 回答
1

Scheme 函数将返回它评估的最后一件事。如果您需要两个退货,您可以尝试将它们打包成一个列表并将其退回。

于 2012-10-05T03:56:14.510 回答
0

如果您想procedure?在调用之前检查参数,您可以使用以下解决方案。

(define seq-action
  (lambda (action1 action2)
    (and (procedure? action1) (action1))
    (and (procedure? action2) (action2))))
于 2012-10-05T08:17:32.743 回答