Common Lisp 中 (loop for) 和 (loop :for) 的区别

Difference between (loop for) and (loop :for) in Common Lisp

我刚看到Sylwester对的回答,我觉得很奇怪,循环到处都是冒号。

通常我会写

(loop for n below 10 do (princ n) (terpri))

而不是

(loop :for n :below 10 :do (princ n) (terpri))

经过一些测试,我发现在第一个循环中,符号 forbelowdo 是 cl-user 的一部分(edit :其实不是do,只有另外两个,可能是因为do也是cl包中的一个宏),而不是第二个。同样,'X alone will then be part of cl-user, not ':X。 symbol-package 函数告诉我后者在关键字包中。

现在,没有冒号的第一个循环对我来说看起来更漂亮,所以我想知道前面的评论是否是使用第二个循环的充分理由。当前包中的符号变为 "included" 看起来很无礼,但也许我忽略了后果。

有什么想法吗?

你大部分已经回答了你自己的问题,区别就像你描述的那样。默认情况下,:some-symbol 将在 :KEYWORD 包中,'SOME-SYMBOL 将在您当前的包 CL-USER 中。在 loop 宏中,这只是个人喜好问题。例如,有些人更喜欢使用 :for 符号来在他们的文本编辑器中获得更好的语法突出显示。

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

CL-USER 24 > (find-symbol "FOR" "CL")
NIL
NIL

LOOPCOMMON-LISP 包中的一个符号,它被导出。 FOR 两者都不是。因此,在每个没有 FOR 符号且不继承的包中,在编写 LOOP FOR 循环时将添加这样的符号。

就是这样。通常这应该没问题...