【问题标题】:Scheme - run two procedures from arguments sequentially?方案 - 从参数顺序运行两个过程?
【发布时间】:2012-10-05 22:30:53
【问题描述】:

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

我尝试使用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)))

【问题讨论】:

    标签: scheme racket


    【解决方案1】:

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

    (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

    【讨论】:

    • 在您的第一个代码中,您也可以使用(begin (action1) (action2)),因为它“无处不在”。
    • @ReyCharles begin 隐含在过程中,无需显式编写
    • 我知道这一点。我建议它是出于教学原因。我相信首先显示一般情况,然后显示 lambda 情况的“语法糖”是有道理的。 :-)
    • 谢谢,我不知道 values 函数
    【解决方案2】:

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

    【讨论】:

    • 这解释了为什么我认为只有一个项目正在执行。我需要输出这两个项目而不是列表的一部分。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-09-25
      • 1970-01-01
      • 1970-01-01
      • 2017-03-08
      • 1970-01-01
      • 1970-01-01
      • 2021-02-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多