Разница между (loop for) и (loop :for) в Common Lisp

Я только что увидел ответ Сильвестра на этот вопрос, и мне показалось странным, что цикл имеет двоеточия везде.

Обычно я писал

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

вместо

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

После некоторых тестов я вижу, что с первым циклом символы for, below и do затем являются частью cl-user (edit : на самом деле не do, только два других, вероятно, потому что do тоже макрос в пакете cl), не со вторым. Точно так же только 'X будет частью cl-user, а не ':X. Функция symbol-package говорит мне, что последний находится в пакете ключевых слов.

Итак, первый цикл без двоеточий выглядит для меня намного симпатичнее, поэтому я хотел бы знать, являются ли предыдущие замечания веской причиной для использования вместо него второго. То, что символы «включаются» в текущий пакет, выглядит довольно безобидно, но, возможно, я упустил из виду последствия.

Есть идеи?


person Community    schedule 13.02.2015    source источник
comment
@Sylwester Да, определенно дубликат.   -  person    schedule 13.02.2015
comment
Думаю, я делаю это, чтобы отличить ключевые слова цикла от переменных/выражений. (loop :for element :below below-average :counting (> element above-average)) легче правильно прочитать, чем (loop for element below below-average counting (> element above-average))   -  person Sylwester    schedule 13.02.2015
comment
@Sylwester Да, и с окраской синтаксиса это выглядит намного лучше. Я попробую.   -  person    schedule 13.02.2015


Ответы (2)


Вы почти уже ответили на свой вопрос, разница в том, что вы описали. :some-symbol будет в пакете :KEYWORD, а 'SOME-SYMBOL будет в вашем текущем пакете CL-USER по умолчанию. В макросе loop это просто дело вкуса. Некоторые люди предпочитают использовать нотацию :for, например, для лучшей подсветки синтаксиса в текстовом редакторе.

person coredump    schedule 13.02.2015
comment
Спасибо. Раньше я не знал об этом выборе. - person ; 13.02.2015
comment
Вы можете использовать символы и в других пакетах, а не только в текущих пакетах или пакетах ключевых слов. Думаю, этот ответ можно было бы улучшить ссылкой на почему это допустимо. (Не так сложно понять, что происходит, но без ссылки трудно понять, является ли это ошибкой или преднамеренным поведением. (Я знаю, что это задумано.)) - person Joshua Taylor; 13.02.2015

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

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

LOOP — это символ в пакете COMMON-LISP, и он экспортируется. FOR не является ни тем, ни другим. Таким образом, в каждом пакете, который не имеет символа FOR и не наследует его, будет добавлен такой символ при написании цикла LOOP FOR.

Вот и все. Обычно с этим проблем быть не должно...

person Rainer Joswig    schedule 13.02.2015