【问题标题】:Ignoring multiple return values in Racket忽略球拍中的多个返回值
【发布时间】:2013-06-19 20:09:22
【问题描述】:

在 Racket 中,可以从一个函数中返回多个值,例如

(define (foo)
  (values 1 2 3))

然后我们可以通过做绑定它们

(define-values (one two three) (foo))

现在one 绑定到1two 绑定到2three 绑定到3

我有一个返回多个值的函数,但我只对其中一些值感兴趣。有没有一种方法可以提取“有趣的”返回值,而“忽略”(即不绑定)其余的,Haskell 中的 _ 模式?

【问题讨论】:

    标签: functional-programming scheme racket


    【解决方案1】:

    您可以为此使用match-let-valuesmatch-define-values(取决于您需要词法变量还是顶级变量):

    > (match-let-values (((_ _ a _) (values 1 2 3 4)))
        a)
    ; => 3
    
    > (match-define-values (_ a _ _) (values 1 2 3 4))
    > a
    ; => 2
    

    【讨论】:

    • define-values 有什么理由一直存在吗?它似乎是匹配定义变量的适当子集
    • @jozefg define-values 基本上也是一个低级原语。如果您通过宏扩展器运行任何代码并选择显示everything,您会在各处看到define-values。毕竟,definedefine-values 的特例,其中只有一个值,所以define 被扩展为define-values。编辑:从概念上讲,我认为define-values 可以扩展为match-define-values,但match 是该语言的更新和“更高级别”的补充。我想这个问题超出了我的工资等级。 :)
    • 正如 Greg 所写,define-values 是一个原语。也就是说,它是可以出现在“完全扩展的语法”中的一种形式。因此,JIT 编译器知道如何编译define-values。另一个形式的match-define-values 扩展为一堆更简单的语法。这当然只是一个实现细节——可以隐藏define-values,然后将match-define-values 导出为define-values。在其他系统中,define-values 可能是扩展为call-with-values 的宏。例如:community.schemewiki.org/?scheme-faq-macros#multidefine
    • match-define-values 可能实现为定义语法/语法规则,将表单转换为 call-with-values 以减少值,define-values 以定义它们。
    猜你喜欢
    • 2013-12-31
    • 2010-09-30
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    • 2019-08-09
    • 2018-04-02
    • 2021-10-03
    • 1970-01-01
    相关资源
    最近更新 更多