有没有办法只获得values
返回的结果之一?我尝试做(define x (first (values 1 2)))
,但这没用。是写(define-values (x dont-care) (values 1 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
。