似乎为了在Racket中使用多个返回值,我必须使用define-values或将它们收集到列表中(call-with-values (thunk (values-expr)) list).在后一种情况下,为什么有人会选择返回多个值而不是列表,如果只是必须将它们收集到列表中呢?此外,这些都非常冗长,并且难以适应大多数代码.我觉得我必须误解一些关于多重回报价值的基本信息.就此而言,如何编写接受多个返回值的过程?
虽然我可能会遗漏一些计划历史和其他细微差别,但我会给你实际答案.
首先,一条经验法则是,如果您需要返回超过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恕我直言可能更实用.话虽如此,我确实为一次性私人助手功能使用了多个值.
| 归档时间: |
|
| 查看次数: |
4665 次 |
| 最近记录: |