Functional programming 忽略Racket中的多个返回值

Functional programming 忽略Racket中的多个返回值,functional-programming,scheme,racket,Functional Programming,Scheme,Racket,在Racket中,可以通过执行以下操作从函数返回多个值: (define (foo) (values 1 2 3)) 然后,我们可以通过这样做来约束它们 (define-values (one two three) (foo)) 现在,one绑定到1,two到2,two到3 我有一个返回多个值的函数,但我只对其中的一些值感兴趣。是否有一种方法可以提取“感兴趣的”返回值,同时“忽略”(即不绑定)其余值,即Haskell中的la\uuu模式 您可以使用match let values或mat

在Racket中,可以通过执行以下操作从函数返回多个值:

(define (foo)
  (values 1 2 3))
然后,我们可以通过这样做来约束它们

(define-values (one two three) (foo))
现在,
one
绑定到
1
two
2
two
3


我有一个返回多个值的函数,但我只对其中的一些值感兴趣。是否有一种方法可以提取“感兴趣的”返回值,同时“忽略”(即不绑定)其余值,即Haskell中的la
\uuu
模式

您可以使用
match let values
match define values
进行此操作(取决于您想要的是词汇变量还是顶级变量):


有什么理由让定义值挂在那里吗?它似乎是匹配定义的适当子集-variables@jozefg嗯,
定义值
基本上也是一个低级原语。如果您通过宏扩展器运行任何代码并选择显示所有内容,您将看到
define values
到处都是。毕竟,
define
define values
的特例,其中只有一个值,因此
define
被扩展为
define values
。编辑:从概念上讲,我认为
定义值
可以扩展为
匹配定义值
,但是
匹配
是对该语言的一个更新的“更高级别”的补充。我想那个问题超出了我的工资等级正如格雷格所写,
定义值
是一个原语。也就是说,它是可以以“完全扩展语法”的形式出现的形式之一。因此,JIT编译器知道如何编译
定义值
。另一种形式是
匹配定义值
,它扩展为一组更简单的语法。这当然只是一个实现细节-可以隐藏
定义值
,然后将
匹配定义值
导出为
定义值
。在其他系统中,
定义值
可能是一个宏,它可以扩展为
调用值
。例如,请参见:
match define values
可能作为定义语法/语法规则来实现,该规则将表单转换为
call with values
以减少值,并
定义值
以定义值。
> (match-let-values (((_ _ a _) (values 1 2 3 4)))
    a)
; => 3

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