从通话中仅获取值之一

时间:2019-04-02 04:44:21

标签: racket

有没有办法只获得values返回的结果之一?我尝试做(define x (first (values 1 2))),但这没用。是写(define-values (x dont-care) (values 1 2))之类的东西并定义一个额外变量的唯一方法吗?

2 个答案:

答案 0 :(得分:1)

  

编写(define-values (x dont-care) (values 1 2))之类的东西并定义一个额外的变量是唯一的方法吗?

从多值事物中获取值之一的唯一方法都是在此处定义额外的变量,例如dont-care。但是,可以使用局部作用域或宏作用域的作用域来减轻这种情况并将其隐藏起来。

您可以使用let-values来限制范围,例如:

(define x (let-values ([(x dont-care) (values 1 2)]) x))

或者您可以使用宏“隐藏”其他变量:

(define-syntax-rule (define-first-of-two-values x expr/2vs)
  (define-values (x dont-care) expr/2vs))

(define-first-of-two-values x (values 1 2))

在此定义之后,x将可用,但是dont-care将不会因为它局限于宏定义的范围。

您还可以使用现有的宏,例如match-define-values,并使用_通配符表示不需要的值。

(match-define-values (x _) (values 1 2))

match-define-values宏实际上扩展为与上面的第一个let-values示例非常相似的内容。

答案 1 :(得分:0)

我一直在使用此宏:

(define-syntax-rule (first-value expr)
  (call-with-values (λ () expr)
    (λ (result . ignored) result)))

> (first-value (values 10 20 30 40 50))
10

这适用于任意数量的值。有关文档,请参见call-with-values