2012-10-05 13 views
2

我想创建一个函数,它将两个函数作为参数并执行它们。Scheme - 依次从参数运行两个过程?

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

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

我觉得不应该太难运行一个接一个。他们不需要同时运行。

我试过简单的(action1) (action2)并排,但它只返回action2。以下是我定义action1action2

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

回答

4

执行一个程序后,另一种是如此简单:

(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

+0

在你的第一个代码中,你也可以使用'(begin(action1)(action2))',因为它可以在任何地方使用。 – ReyCharles

+1

@ReyCharles'begin'在过程中是隐含的,不需要明确写出 –

+0

我意识到这一点。我建议它出于教学原因。我相信首先要说明一般情况,然后是lambda情况下的“语法糖”。 :-) – ReyCharles

1

一个计划函数将返回不管它评估的最后一件事就是。如果你需要两个回报,你可以尝试将它们打包到一个列表中并返回。

+0

这就解释了为什么我认为只有一个项目正在执行。我需要输出这两个项目,而不是列表的一部分。 –

0

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

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