从多个 return 值 Racket 定义常量

Defining constants from multiple return values Racket

Racket 的数学库中的matrix-qr 函数输出两个值。我知道 call-with-values 可以将两个输出值都放入您想要的下一个函数中。

  1. 但是,我如何获取每个单独的输出并用该值定义一些常量? QR 函数输出 Q 矩阵和 R 矩阵。我需要这样的东西:

    (定义 Q ...)
    (定义 R ...)

  2. 另外,我怎么能只使用一个输出两个值的函数的输出之一呢?

为多个值创建定义的常用方法是使用 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*-valuesletrec-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 它们的函数,使用其中一个值而忽略另一个值通常没有多大意义。