【问题标题】:Clarification About the Function alexandria:length=关于函数 alexandria:length= 的说明
【发布时间】:2021-03-10 12:51:44
【问题描述】:
Alexandria Manual
包括一个用于测试序列长度的布尔函数:
函数:length= &rest 序列
以任意顺序获取任意数量的序列或整数。如果所有序列的长度和整数相等,则返回 true。提示:如果第一个参数是文字整数,则有一个编译器宏可以扩展为更高效的代码。
第一句谈到“整数”(复数)。这仅仅是为了测试几个计算整数是否相同,同时测试序列长度吗?还是有更深层次的意义?
第三句提供了优化。这是否意味着当达到文字索引时,列表的计数将停止,如果 lst 很长,它可能比 (= (length lst) 3) 更有效?
【问题讨论】:
标签:
macros
common-lisp
sequence
compiler-optimization
【解决方案1】:
第一句谈到“整数”(复数)。这仅仅是为了测试几个计算的整数是否相同,同时测试序列长度吗?还是有更深层次的意义?
没有更深层次的意义。这可能只是为了对称。基本上,只有整数参数的(length= ...) 只是一个较慢的=。但主要用例是(length= 3 (some-list)),即测试某个序列是否具有特定长度(“(some-list) 产生的序列值的长度是否为 3?”)。
第三句提供了优化。这是否意味着当达到文字索引时,列表的计数将停止,如果lst 很长,它可能比(= (length lst) 3) 更有效?
是的,确实如此;编译器宏扩展为对 sequence-of-length-p 的调用,它(对于列表)执行类似的操作(通过 nthcdr)。