Как лучше всего использовать common- lisp в elisp (если вообще)?

Может кто-нибудь объяснить, какие конкретные проблемы связаны с использованием пакета cl в elisp? Как новый кодер в emacs, я чувствую, что я делаю ошибку, когда я достигаю опции (require 'cl). Я прочитал и понял проблему с байтовой компиляцией с пакетом cl. Я рассмотрел старые аргументы и не хочу их оживлять. Я также не ищу каких-либо обобщающих комментариев о том, является ли common- lisp лучше, чем х бренд lisp.

То, что я хотел бы знать, - это практически то, как использовать common- lisp, чтобы любой elisp, который я пишу, будет иметь хорошие шансы быть принятым большинством elisp-кодеров. В частности, следует ли мне полностью использовать общий lisp или есть некоторые части языка, которые приемлемы для всех и некоторые части, где подавляющее большинство кодеров будет хихикать и издеваться над?

Не желая ограничивать ширину ответа, это:

(mapcar (lambda(x) (* x x)) '(1 2 3))

гораздо более приемлемым, чем это:

(require 'cl)
(loop for el in '(1 2 3) collect (* el el))

Ответ 1

При использовании большого количества сторонних библиотек и написании моего собственного кода eLisp я никогда не сталкивался с ситуацией, когда использование CL-пакета приводило к конфликту имен. Итак, у меня возникло бы желание сказать, что аргумент против использования CL - это не что иное, как пуританство (в первоначальном смысле этого слова, а не в религиозной стороне вещей).

Но если вы планируете очень долгое время поддерживать и хотите иметь какую-то резервную копию, вот что я буду делать (но я этого не делаю сам, потому что исправление вещей, когда они сломаны, похоже, быть лучшей тактикой). Для функций в пакете CL, которые вы используете, создайте специальный файл, в котором вы defalias все из них должны иметь префикс cl-. Так, например, вместо (position ...) у вас будет (cl-position ...). Теоретически сэкономит вам проблему передовой совместимости. Однако функции не удаляются мгновенно, вы получите предупреждение до того, как их устарели, и у вас будет много времени для обновления. До вас, действительно.

Макрос контура в Common Lisp является полемикой сам по себе, это не типичная конструкция для языка, и поэтому, например, существует итерационная библиотека. Это также требует, чтобы вы научились "мини-языку цикла", чтобы использовать его хорошо, что является своего рода небольшим языком, специфичным для домена, и на самом деле нет требования к тому, чтобы этот тип конструкции использовал его. НО, петля имеет свои сильные стороны. Функции обработки списка, такие как mapcar или reduce, помогут вам в более простых случаях, например, в вашем примере, но в менее простых случаях loop будет лучше, а также менее подробным способом делать то же самое.

Ответ 2

Вы прочитали макрос раздел руководства? Использование макросов, таких как ваш пример loop, совершенно нормально.

Но вы должны использовать eval-when-compile вокруг требуемого.

Фактически (eval-when-compile (require 'cl)) появляется 66 раз только в корневой папке lisp в моем Emacs.

Ответ 3

Если вы не планируете интегрировать свой код в Emacs, используйте пакет CL и поместите этот фрагмент в свой .emacs, чтобы отключить предупреждения.

(byte-compile-disable-warning 'cl-functions)

Примечание. Вы можете найти некоторые советы по программированию elisp на блоге nicferrier.