gpt4 book ai didi

scheme - 使用 let-values 而不是 let 有什么好处?

转载 作者:行者123 更新时间:2023-12-04 00:34:51 26 4
gpt4 key购买 nike

我脑海中的例子是:什么更好?

示例 1:

(define (foo x)
...
(values a b c))

(let-values (((a b c) (foo 42)))
...)

示例 2:
(define (foo x)
...
(list a b c))

(let ((f (foo 42)))
(let ((x (first f)) (y (second f)) (z (third f)))
...))

我粗略的猜测是,第一种方法是最好的,因为在第二种方法中,因为每当调用 first/ second/ third 时,它​​都必须遍历列表。所以我的问题变成了: values 是如何工作的?它只是列表的语法糖还是使用其他东西? (例如一个数组)

如果这取决于实现,我会让您知道我正在使用鸡肉计划。

最佳答案

从语义的角度来看,没有一种比另一种更好。您可以使用列表、向量和记录,它们将提供相同的功能。 IMO 散列会稍微有利,因为那时您有访问器,因此以后可以增加接口(interface)。 JavaScript 只能返回一个值,因此它使用对象,并且通过新的重组运算符,它变得非常有用。

除了词法闭包之外,Scheme 并没有发明太多东西,很多都是从早期的 lisp 版本中衍生出来的。就像 loop 宏能够返回多个值一样,您不需要在堆上分配稍后需要 GC 的短期对象。当时机器的内存很少,GC-ing 有时是用磁盘来完成的。在机器级别,返回通常是留在堆栈或寄存器中的东西。多个值将是堆栈上的两个值或使用两个寄存器。没有为封装分配堆意味着没有分配短期内存。

在同级语言 Common Lisp 中,多值更有用,因为每个函数都可以在一个值的地方使用,然后只使用返回的第一个值。您会看到 Scheme 中的标准库缺少此功能,该库具有多个相同的功能。 quotient/remainder 返回两个值,quotientremainder 返回两个值中的每一个。

关于scheme - 使用 let-values 而不是 let 有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45379116/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com