首页 > 解决方案 > 关于函数 alexandria:length= 的说明

问题描述

Alexandria Manual 包含一个用于测试序列长度的布尔函数:

功能:length= &rest 序列
以任意顺序取任意数量的序列或整数。如果所有序列的长度和整数相等,则返回 true。提示:如果第一个参数是文字整数,则有一个编译器宏可以扩展为更高效的代码。

第一句话谈到“整数”(复数)。这仅仅是为了测试几个计算的整数是否相同,同时测试序列长度吗?还是有更深层次的意义?

第三句提供了优化。这是否意味着当达到文字索引时,对列表的计数将停止,如果 lst 很长,它可能比 (= (length lst) 3) 更有效?

标签: macroscommon-lispsequencecompiler-optimization

解决方案


第一句话谈到“整数”(复数)。这仅仅是为了测试几个计算的整数是否相同,同时测试序列长度吗?还是有更深层次的意义?

没有更深层次的意义。这可能只是为了对称。基本上,(length= ...)只有整数参数只是一个较慢的=. 但它的主要用例是(length= 3 (some-list)),即测试某个序列是否具有特定长度(“序列值是否由(some-list)长度为 3 产生?”)。

第三句提供了优化。这是否意味着当达到文字索引时,对列表的计数将停止,从而使其可能比(= (length lst) 3)if lstis longy 更有效率?

是的,事实就是这样;编译器宏扩展为一个调用sequence-of-length-p,(对于列表)执行类似于(通过nthcdr)的操作。


推荐阅读