|
1
44
CL中的多个值这个 语言 Common lisp 在ANSI中有描述 标准 INCITS 226-1994(R2004),有许多 实施 . 每个都可以实现 multiple values 如果它认为合适的话,他们当然可以为他们列出一份清单 (事实上, the Emacs Lisp compatibility layer for CL does just that - 但它是强调和有意的, 不 公共Lisp实现)。 意图然而 意图 该设施的目的是(至少) 一些)多个值 不考虑 (即,不分配 heap 存储器)和所有CL 我知道的实现就是这样做的。 从这个意义上说,多值设施是一个 优化 . 当然,对于 不同的平台和场景。例如, 20 - required by the standard )是 存储在线程本地向量的静态中,接下来的几个(1000?)是 在堆栈上分配,其余的(如果需要)在 堆作为向量或列表。 用法
例如,函数
如果只捕获第一个并丢弃第二个,则需要 写
以捕获这两个值。这与 other languages 可以表示为
使用 tuples ,除了CL 不 分配内存以传递(仅几个)多个值 其他语言也经常如此。 IOW,人们可以将多个值视为一个短暂的结构。 注意CL可以将多个值转换为列表:
而不是更高效和简洁
MV&类型
CL会
不
具有“多值对象”的特殊类型
正因为如此
不
分配单独的
对象
通过
围绕多个值。从这个意义上说,我们确实可以宣称
然而,在CL 1中 可以 declare 一 function type 返回 multiple values :
这意味着
你的案子
在您的特定情况下,
与相同
1的类型是
PS:控制返回值
一次使用
|
|
|
2
14
这个
例如,如果调用者只期望一个值,那么它将只从返回多个值的表单中获得一个值(第一个),而不是列表。自从
每个CommonLisp实现都可以自由地追求自己的策略来实现多个值。我从Frode Fjeld写的关于他的实现Movitz如何处理它的文章中学到了很多 The Movitz development platform ,第2.5节。 |
|
|
3
1
如果你做了一个CL实现,你可以用列表来实现它,只要它符合规范。你需要处理一个特定的值,你需要一些方法来标记0,2..n值,而其他函数需要理解格式和打印可以以与其他实现相同的方式显示它。
最有可能
CommonLisp与Scheme在积极的方向上有很大的不同,你可以创建一个函数,例如。
|
|
|
Stephen · 在emacs中评估Lisp的正确方法是什么 1 年前 |
|
|
lightning_missile · 词法范围和共享对象 8 年前 |
|
|
Alexandru Popa · SBCL中奇怪的宏扩展错误 8 年前 |
|
|
Jacky · 编辑列表中的每个偶数索引元素 8 年前 |
|
|
HappyFace · lisp典型缩进约定背后的规则是什么? 8 年前 |