Common Lisp中(循环for)和(循环:for)之间的差异

Common Lisp中(循环for)和(循环:for)之间的差异,lisp,common-lisp,Lisp,Common Lisp,我刚刚看到西尔维斯特的答案,我觉得奇怪的是,这个循环到处都是冒号 通常,我会写信 (loop for n below 10 do (princ n) (terpri)) 而不是 (loop :for n :below 10 :do (princ n) (terpri)) 经过一些测试,我发现在第一个循环中,的、下面的和do符号是cl-user的一部分(edit:实际上不是do,只有另外两个,可能是因为do也是cl包中的一个宏),而不是第二个循环。同样地,“X”本身将是cl user的一部分,

我刚刚看到西尔维斯特的答案,我觉得奇怪的是,这个循环到处都是冒号

通常,我会写信

(loop for n below 10 do (princ n) (terpri))
而不是

(loop :for n :below 10 :do (princ n) (terpri))
经过一些测试,我发现在第一个循环中,
下面的
do
符号是cl-user的一部分(edit:实际上不是
do
,只有另外两个,可能是因为
do
也是cl包中的一个宏),而不是第二个循环。同样地,“X”本身将是cl user的一部分,而不是“:X”。函数
symbol package
告诉我后者在关键字package中

现在,第一个循环,没有冒号,在我看来更漂亮,所以我想知道前面的评论是否是使用第二个循环的好理由。将这些符号“包含”在当前包中看起来没有什么害处,但可能我忽略了后果


有什么想法吗?

你几乎已经回答了你自己的问题,区别正如你所描述的<代码>:某些符号
将在
:关键字
包中,默认情况下,
某些符号
将在当前包中
CL-USER
。在
loop
macro中,这只是口味的问题。例如,有些人更喜欢使用
:for
符号来在文本编辑器中获得更好的语法高亮显示

CL-USER 23 > (find-symbol "LOOP" "CL")
LOOP
:EXTERNAL

CL-USER 24 > (find-symbol "FOR" "CL")
NIL
NIL
LOOP
COMMON-LISP
包中的一个符号,它被导出<用于
的代码>两者都不是。因此,在没有
FOR
符号且没有继承符号的每个包中,在为
循环编写
循环时,将添加这样的符号


就这样。通常这应该没问题……

谢谢。我以前不知道这个选择。你也可以在其他包中使用符号,而不仅仅是当前包或关键字包。我认为,如果能提到为什么这是允许的,这个答案会有所改进。(弄清楚发生了什么并不难,但如果没有引用,很难知道这是一个bug还是预期行为。(我知道这是预期的。)@Sylvester是的,肯定是重复的。我想我这样做是为了区分循环关键字和变量/表达式<代码>(循环:对于元素:低于平均值:计数(>元素高于平均值))
(循环:对于元素低于平均值计数(>元素高于平均值))
@Sylwester是的,并且使用语法着色看起来更好。我试试看。