Loops 如何在“iterate”表单中使用函数“count”?
我刚刚意识到在Loops 如何在“iterate”表单中使用函数“count”?,loops,common-lisp,Loops,Common Lisp,我刚刚意识到在iterate中使用count函数很尴尬。比如: (iterate (for x below 5) (collect (count x '(1 4 2 3 4 2 1 2)))) 导致错误(因为iterate有count子句),需要重写为: (iterate (for x below 5) (collect (funcall #'count x '(1 4 2 3 4 2 1 2)))) 这让我希望迭代坚持计数,查找等,而只剩下计数,查找
iterate
中使用count
函数很尴尬。比如:
(iterate (for x below 5)
(collect (count x '(1 4 2 3 4 2 1 2))))
导致错误(因为iterate
有count
子句),需要重写为:
(iterate (for x below 5)
(collect (funcall #'count x '(1 4 2 3 4 2 1 2))))
这让我希望
迭代
坚持计数
,查找
等,而只剩下计数
,查找
等。但也许我只是没有看到正确的方法。是否有更好的方法从迭代
表单内部使用计数
呢?为什么不使用循环
(loop for x below 5
collect (count x '(1 4 2 3 4 2 1 2)))
甚至在迭代中使用common-lisp:count
也无济于事
我会这样做:
(defun count-it (x list) (count x list))
(iter (for x below 5)
(collect (count-it x '(1 4 2 3 4 2 1 2))))
但是,您的funcall
解决方案甚至更优雅…出于某种原因,很久以前有人添加了count
的同义词。这与cl:count
冲突
我们可以删除同义词:
CL-USER 14 > (remprop 'iterate::count 'iterate::synonym)
(ITERATE::SYNONYM COUNTING)
CL-USER 15 > (iterate (for x below 5)
(collect (cl:count x '(1 4 2 3 4 2 1 2))))
(0 2 3 1 2)
迭代手册与当前的ITERATE
实现冲突:
这些从句都以动词开头。当动词不冲突时
如果有一个现有的公共Lisp函数,那么它可以用于
其不定式或现在分词形式(如sum、summing)。
但是,当与Common Lisp发生冲突时,只有
可以使用现在分词形式(如unioning)。这是为了
防止迭代子句与公共Lisp函数冲突
可能有助于报告错误:删除有问题的同义词或修复文档。在修复文档时,在iterate子句中记录如何使用cl:count
。手册仅描述counting
,而不是count
。您使用的是什么迭代实现?我检查的手册是,但它说宏名为iter
,而不是iterate
。请注意,iterate不是CL标准的一部分,它是第三方库。@Barmar,您链接的手册还在脚注中提到了宏的iterate
名称,其中说“您也可以使用iterate
,但首选iter
,因为它避免了将来可能添加到公共Lisp中的潜在冲突“。实际上,我倾向于在自己的代码中使用iter
,我不确定为什么要在这里使用iterate
。但两者都是相同的宏。@Barmarcount
和counting
是同义词(如sum
和summing
等)。例如(iter(对于5以下的x)(count(oddp x)))
返回2。循环肯定更适合这种情况,但我仍然想知道迭代用户如何解决这个问题。我认为您只需确保“count”不是取自“iter”…奇怪-尽管(common lisp:count 2'(1 2 3))
在iterate
内部起作用,iterate
必须在其代码遍历器中使用字符串比较,因为如果它导出像count
这样的名称,它们将导致名称与通用lisp
等效名称冲突。我已将错误报告发送到邮件列表,并抄送您。谢谢你向我解释这件事!