Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 如何在“iterate”表单中使用函数“count”?_Loops_Common Lisp - Fatal编程技术网

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
。但两者都是相同的宏。@Barmar
count
counting
是同义词(如
sum
summing
等)。例如
(iter(对于5以下的x)(count(oddp x)))
返回2。
循环肯定更适合这种情况,但我仍然想知道
迭代
用户如何解决这个问题。我认为您只需确保“count”不是取自“iter”…奇怪-尽管
(common lisp:count 2'(1 2 3))
iterate
内部起作用,
iterate
必须在其代码遍历器中使用字符串比较,因为如果它导出像
count
这样的名称,它们将导致名称与
通用lisp
等效名称冲突。我已将错误报告发送到邮件列表,并抄送您。谢谢你向我解释这件事!