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

时间:2015-02-13 11:51:50

标签: lisp common-lisp

我刚看到Sylwester给this question的答案,我觉得很奇怪,这个循环到处都是冒号。

通常,我会写

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

而不是

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

经过一些测试后,我看到第一个循环时,符号forbelowdo成为cl-user的一部分(编辑 :实际上不是do,只有其他两个,可能是因为do也是cl包中的一个宏),而不是第二个。同样,单独的&#X; X将成为cl-user的一部分,而不是' X。 symbol-package函数告诉我后者在关键字包中。

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

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

你已经回答了自己的问题,区别在于你所描述的。 :some-symbol将在:KEYWORD个包中,'SOME-SYMBOL默认位于您当前的包CL-USER中。在loop宏中,这只是一个品味问题。例如,有些人更喜欢使用:for表示法在文本编辑器中获得更好的语法突出显示。

答案 1 :(得分:3)

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

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

LOOPCOMMON-LISP包中的符号,会将其导出。 FOR既不是。因此,在每个没有FOR符号并且不继承符号的包中,在编写LOOP FOR循环时会添加这样的符号。

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