Обучение Elisp - какие библиотеки высшего качества читают исходный код?

При изучении нового языка программирования "чтение исходного кода" является общим советом, полученным экспертами. Однако с такой огромной системой, как emacs, которую многие десятилетия создают многие люди, новичкам не так легко понять, какие библиотеки являются лучшими примерами идиоматической проработки Elisp. Поэтому я хотел бы получить некоторые рекомендации относительно следующих критериев:

  • Идиоматический стиль программирования elisp

  • соблюдение директив Emacs по программированию

  • умное использование cl-пакета в соответствии с рекомендациями emacs

  • умное использование eieio-пакета

  • примерная организация одной библиотеки файлов .el

  • примерная организация библиотеки с несколькими файлами/несколькими пакетами

  • любые критерии, которые вы считаете важными

Предоставление причин, по которым вы рекомендуете определенные библиотеки для автодедактических исследований, несомненно, будет информативным для новичков в программировании Emacs lisp.

Ответы

Ответ 1

Как сказал Трей, используйте elisp от Emacs для изучения. Обычно я делаю одну из двух вещей:

1) Если я пытаюсь выяснить, как использовать определенную функцию, я открою окно dired и сделаю следующее:

% g foobar

где foobar - это имя функции, которая мне интересна в обучении использованию. Это отметит все файлы, которые используют foobar, а затем я иду и просматриваю их, чтобы увидеть, как его вызвать, в каком контексте он называется и т.д.

2) Если я пытаюсь понять, как что-то сделать, и я знаю режим, который делает что-то похожее, я пойду посмотрю на исходный код этого режима, чтобы посмотреть, как они это делают. Если вы не знаете, с чего начать, но вы знаете, как выполнить то, что вы хотите сделать, удобная вещь - посмотреть на нее с помощью привязки ключей. Например, в буфере dired выполните следующие действия:

C-h k % g

и это вызовет:

% g runs the command dired-mark-files-containing-regexp, which is an
% interactive compiled Lisp function in `dired.el'.

It is bound to % g, <menu-bar> <regexp> <mark-cont>.
(dired-mark-files-containing-regexp regexp &optional marker-char)

Mark all files with contents containing regexp for use in later
commands. A prefix argument means to unmark them instead.
`.' and `..' are never marked.

Нажав dired.el в приведенном выше тексте (в буфере emacs), вы откроете исходный код и вернетесь к определению этой функции. Это отличный способ узнать на примере.

Не забывайте, что отладчик elisp - это способ увидеть, что происходит, и следовать за ним, когда код выполняется шаг за шагом. Вы можете пометить код для отладки с помощью edebug-defun, а затем вызвать его как обычно, после чего emacs проведет вас через код.

Ответ 2

Исходным кодом, который я бы рекомендовал, будет сам Emacs. Начните с простых вещей (каламбур), и посмотрите на другие файлы, как вы привыкли.

M-x find-library simple RET

Я думаю, что самоочевидно, почему собственный код lisp Emacs является хорошим примером Emacs lisp.