16.6 Повторная загрузка

Вы можете загружать один и тот же файл несколько раз в сеансе Emacs. Например, после того как вы переписали и переустановили определение функции, отредактировав его в буфере, вы можете захотеть вернуться к исходной версии; вы можете сделать это, перезагрузив файл, из которого он был взят.

При загрузке или перезагрузке файлов имейте в виду, что функции load и load-library автоматически загружают байт-скомпилированный файл, а не нескомпилированный файл аналогичного имени. Если вы переписываете файл, который намереваетесь сохранить и переустановить, вам необходимо байт-скомпилировать новую версию; в противном случае Emacs загрузит более старый, байт-скомпилированный файл вместо вашей новой, нескомпилированной версии! Если это произойдет, сообщение, отображаемое при загрузке файла, будет содержать «(compiled; note, source is newer)», чтобы напомнить вам о необходимости его перекомпиляции.

При написании форм в файле библиотеки Lisp помните, что файл может быть загружен несколько раз. Например, подумайте, следует ли повторно инициализировать каждую переменную при перезагрузке библиотеки; defvar не меняет значение, если переменная уже инициализирована. (См. Определение глобальных переменных.)

Самый простой способ добавить элемент в alist выглядит так:

(push '(leif-mode " Leif") minor-mode-alist)

Но это добавит несколько элементов, если библиотека будет перезагружена. Чтобы избежать этой проблемы, используйте add-to-list (см. Изменение переменных списка):

(add-to-list 'minor-mode-alist '(leif-mode " Leif"))

Иногда вы захотите явно проверить, была ли библиотека уже загружена. Если библиотека использует provide для предоставления именованной функции, вы можете использовать featurep в начале файла, чтобы проверить, был ли выполнен вызов provide ранее (см. Функции). Альтернативно, вы можете использовать что-то вроде этого:

(defvar foo-was-loaded nil)

(unless foo-was-loaded
  execute-first-time-only
  (setq foo-was-loaded t))