如何在球拍中使用多个返回值执行任何操作?

Mat*_*t G 12 racket

似乎为了在Racket中使用多个返回值,我必须使用define-values或将它们收集到列表中(call-with-values (thunk (values-expr)) list).在后一种情况下,为什么有人会选择返回多个值而不是列表,如果只是必须将它们收集到列表中呢?此外,这些都非常冗长,并且难以适应大多数代码.我觉得我必须误解一些关于多重回报价值的基本信息.就此而言,如何编写接受多个返回值的过程?

Gre*_*ott 7

虽然我可能会遗漏一些计划历史和其他细微差别,但我会给你实际答案.

首先,一条经验法则是,如果您需要返回超过2或3个值,请不要使用多个值,也不要使用列表.用一个struct.这通常更容易阅读和维护.

使用Racket的match表单可以更轻松地构建列表返回值 - 就像以下一样简单define-values:

(define (f)
  (list 1 2))

(match-define (list a b) (f))
(do-something-with a b)

;; or

(match (f)
  [(list a b) (do-something-with a b)])
Run Code Online (Sandbox Code Playgroud)

如果你有一些其他函数,g它需要一个(list/c a b),并且你想要用f它来组合,如果f返回一个列表则更简单.如果两者都使用双元素,也会更简单struct.call-with-values我想,虽然这是一种尴尬的热点.

允许多个返回值是一个优雅的想法,因为它使返回值与参数对称.使用多个值也比列表或结构更快(在当前的Racket实现中,尽管它可以起作用).

然而,当可读性比性能更高时,那么在现代Racket中使用a list或者struct恕我直言可能更实用.话虽如此,我确实为一次性私人助手功能使用了多个值.

最后,对Racket邮件列表进行长时间的有趣讨论.