从多个 return 值 Racket 定义常量
Defining constants from multiple return values Racket
Racket 的数学库中的matrix-qr
函数输出两个值。我知道 call-with-values 可以将两个输出值都放入您想要的下一个函数中。
但是,我如何获取每个单独的输出并用该值定义一些常量? QR 函数输出 Q 矩阵和 R 矩阵。我需要这样的东西:
(定义 Q ...)
(定义 R ...)
另外,我怎么能只使用一个输出两个值的函数的输出之一呢?
为多个值创建定义的常用方法是使用 define-values
,它的工作原理与您预期的差不多。
(define-values (Q R) ; Q and R are defined
(matrix-qr (matrix [[12 -51 4]
[ 6 167 -68]
[-4 24 -41]])))
还有一个 let
等价于多个值,称为 let-values
(以及 let*-values
和 letrec-values
)。
忽略值更难。例如,没有像 (first-value ...)
这样的函数,因为普通的函数应用程序不会产生可以接受多个值的延续。但是,您可以使用 match-define-values
之类的东西和 _
“孔标记”来忽略值并且不绑定它们。
(match-define-values (Q _) ; only Q is defined
(matrix-qr (matrix [[12 -51 4]
[ 6 167 -68]
[-4 24 -41]])))
理论上可以创建一个可以将多个值转换为列表或仅使用特定值的宏,但通常可以避免这种情况。返回多个值不应该轻易完成,这就是为什么对于几乎所有 return 它们的函数,使用其中一个值而忽略另一个值通常没有多大意义。
Racket 的数学库中的matrix-qr
函数输出两个值。我知道 call-with-values 可以将两个输出值都放入您想要的下一个函数中。
但是,我如何获取每个单独的输出并用该值定义一些常量? QR 函数输出 Q 矩阵和 R 矩阵。我需要这样的东西:
(定义 Q ...)
(定义 R ...)另外,我怎么能只使用一个输出两个值的函数的输出之一呢?
为多个值创建定义的常用方法是使用 define-values
,它的工作原理与您预期的差不多。
(define-values (Q R) ; Q and R are defined
(matrix-qr (matrix [[12 -51 4]
[ 6 167 -68]
[-4 24 -41]])))
还有一个 let
等价于多个值,称为 let-values
(以及 let*-values
和 letrec-values
)。
忽略值更难。例如,没有像 (first-value ...)
这样的函数,因为普通的函数应用程序不会产生可以接受多个值的延续。但是,您可以使用 match-define-values
之类的东西和 _
“孔标记”来忽略值并且不绑定它们。
(match-define-values (Q _) ; only Q is defined
(matrix-qr (matrix [[12 -51 4]
[ 6 167 -68]
[-4 24 -41]])))
理论上可以创建一个可以将多个值转换为列表或仅使用特定值的宏,但通常可以避免这种情况。返回多个值不应该轻易完成,这就是为什么对于几乎所有 return 它们的函数,使用其中一个值而忽略另一个值通常没有多大意义。