Динамический модуль Emacs — это разделяемая библиотека, которая предоставляет дополнительные возможности для использования в программах на Emacs Lisp, точно так же, как это делает пакет, написанный на Emacs Lisp.
Функции, загружающие пакеты Emacs Lisp, также могут загружать динамические модули. Они распознают динамические модули по расширению имени файла, также называемому «суффиксом». Это расширение зависит от платформы.
Эта переменная содержит зависимое от системы значение расширения имени файла для файлов модулей. Её значение равно .so на POSIX-системах, .dylib на macOS и .dll на MS-Windows.
На macOS динамические модули также могут иметь расширение .so в дополнение к .dylib.
Каждый динамический модуль должен экспортировать функцию с именем emacs_module_init, вызываемую из C, которую Emacs вызовет в рамках вызова load или require, загружающего модуль. Он также должен экспортировать символ с именем plugin_is_GPL_compatible, чтобы указать, что его код выпущен под лицензией GPL или совместимой с ней лицензией; Emacs выдаст ошибку, если ваша программа попытается загрузить модули, которые не экспортируют такой символ.
Если модулю необходимо вызывать функции Emacs, он должен делать это через API (интерфейс прикладного программирования), определённый и описанный в заголовочном файле emacs-module.h, который входит в дистрибутив Emacs. См. Написание динамически загружаемых модулей для подробностей об использовании этого API при написании собственных модулей.
Модули могут создавать объекты Lisp user-ptr, которые содержат указатели на структуры C, определённые модулем. Это полезно для хранения сложных структур данных, созданных модулем, чтобы передавать их обратно в функции модуля. Объекты user-ptr также могут иметь связанные с ними финализаторы — функции, которые выполняются при сборке мусора объекта; это полезно для освобождения любых ресурсов, выделенных для базовой структуры данных, таких как память, открытые файловые дескрипторы и т. д. См. Преобразование между значениями Lisp и модуля.
Эта функция возвращает t, если её аргумент является объектом user-ptr.
Emacs вызывает этот низкоуровневый примитив для загрузки модуля из указанного файла file и выполнения необходимой инициализации модуля. Это примитив, который проверяет, что модуль экспортирует символ plugin_is_GPL_compatible, вызывает функцию модуля emacs_module_init и выдает ошибку, если эта функция возвращает признак ошибки или если пользователь нажал C-g во время инициализации. Если инициализация успешна, module-load возвращает t. Обратите внимание, что file уже должен иметь правильное расширение имени файла, поскольку эта функция не пытается искать файлы с известными расширениями, в отличие от load.
В отличие от load, module-load не записывает модуль в load-history, не выводит никаких сообщений и не защищает от рекурсивных загрузок. Поэтому большинству пользователей следует использовать load, load-file, load-library или require вместо module-load.
Загружаемые модули в Emacs включаются с помощью опции --with-modules на этапе настройки (configure).