Spec-Zone.ru › Elisp

Функции байт-компиляции

Вы можете байт-компилировать отдельное определение функции или макроса с помощью функции byte-compile. Вы можете скомпилировать целый файл с помощью byte-compile-file или несколько файлов с помощью byte-recompile-directory или batch-byte-compile.

Иногда байт-компилятор выводит предупреждения и/или сообщения об ошибках (подробности см. в разделе Ошибки компилятора). Обычно эти сообщения записываются в буфер с именем *Compile-Log*, в котором используется режим Compilation. См. раздел Режим Compilation в Руководстве GNU Emacs. Однако если значение переменной byte-compile-debug не равно nil, сообщения об ошибках вместо этого будут сигнализироваться как ошибки Lisp (см. раздел Ошибки).

Будьте осторожны при написании вызовов макросов в файлах, которые вы собираетесь байт-компилировать. Поскольку при компиляции вызовы макросов раскрываются, макросы должны быть загружены в Emacs, иначе байт-компилятор не сможет обработать их должным образом. Обычно для этого используют формы require, указывающие файлы с необходимыми определениями макросов (см. раздел Возможности). Обычно байт-компилятор не выполняет компилируемый код, но специальные формы require он обрабатывает особым образом, загружая указанные библиотеки. Чтобы не загружать файлы с определениями макросов, когда кто-либо запускает скомпилированную программу, заключайте вызовы require в eval-when-compile (см. раздел Вычисление во время компиляции). Подробнее см. раздел Макросы и байт-компиляция.

Встроенные (defsubst) функции не вызывают таких затруднений: если вы скомпилируете вызов такой функции до того, как станет известно её определение, вызов всё равно будет работать правильно, но медленнее.

Функция: byte-compile symbol

Эта функция байт-компилирует определение функции symbol, заменяя прежнее определение скомпилированным. Определение функции symbol должно содержать собственно код функции; byte-compile не обрабатывает косвенные ссылки на функции. Возвращаемое значение — объект функции байт-кода, представляющий скомпилированное определение symbol (см. раздел Объекты функций-замыканий).

(defun factorial (integer)
  "Compute factorial of INTEGER."
  (if (= 1 integer) 1
    (* integer (factorial (1- integer)))))
⇒ factorial
(byte-compile 'factorial)
⇒
#[257
  "\211\300U\203^H^@\300\207\211\301^BS!_\207"
  [1 factorial] 4
  "Compute factorial of INTEGER.\n\n(fn INTEGER)"]

Если определение symbol является объектом функции байт-кода, byte-compile ничего не делает и возвращает nil. Функция не компилирует определение символа повторно, поскольку исходный (нескомпилированный) код уже заменён байт-компилированным кодом в ячейке функции этого символа.

Аргументом byte-compile также может быть выражение lambda. В этом случае функция возвращает соответствующий скомпилированный код, но нигде его не сохраняет.

Команда: compile-defun &optional arg

Эта команда считывает defun, содержащий точку, компилирует его и вычисляет результат. Если применить её к defun, который является определением функции, то результатом будет установка скомпилированной версии этой функции.

Обычно compile-defun отображает результат вычисления в области эха, но если arg не равно nil, она вставляет результат в текущий буфер после скомпилированной формы.

Команда: byte-compile-file filename

Эта функция компилирует файл кода Lisp с именем filename в файл байт-кода. Имя выходного файла образуется заменой суффикса «.el» на «.elc»; если имя filename не заканчивается на «.el», к нему добавляется «.elc».

Компиляция выполняется путём считывания входного файла по одной форме за раз. Если форма является определением функции или макроса, скомпилированное определение функции или макроса записывается в файл. Остальные формы группируются, затем каждая группа компилируется и записывается так, чтобы её скомпилированный код выполнялся при чтении файла. При считывании входного файла все комментарии отбрасываются.

Эта команда возвращает t, если ошибок не было, и nil в противном случае. При интерактивном вызове команда запрашивает имя файла.

$ ls -l push*
-rw-r--r-- 1 lewis lewis 791 Oct  5 20:31 push.el
(byte-compile-file "~/emacs/push.el")
     ⇒ t
$ ls -l push*
-rw-r--r-- 1 lewis lewis 791 Oct  5 20:31 push.el
-rw-rw-rw- 1 lewis lewis 638 Oct  8 20:25 push.elc
Команда: byte-recompile-directory directory &optional flag force follow-symlinks

Эта команда повторно компилирует все файлы «.el» в directory (или его подкаталогах), которые нуждаются в повторной компиляции. Файл нуждается в повторной компиляции, если файл «.elc» существует, но старше файла «.el».

Если у файла «.el» нет соответствующего файла «.elc», параметр flag определяет, что делать. Если он равен nil, эта команда игнорирует такие файлы. Если flag равен 0, команда компилирует их. Если он не равен ни nil, ни 0, команда спрашивает пользователя, следует ли компилировать каждый такой файл, а также спрашивает о каждом подкаталоге.

В интерактивном режиме byte-recompile-directory запрашивает directory, а значением flag служит префиксный аргумент.

Если force не равно nil, эта команда повторно компилирует каждый файл «.el», для которого существует файл «.elc».

Обычно эта команда не компилирует файлы «.el», являющиеся символическими ссылками. Если необязательный параметр follow-symlink не равен nil, символические ссылки на файлы «.el» также будут скомпилированы.

Возвращаемое значение непредсказуемо.

Функция: batch-byte-compile &optional noforce

Эта функция запускает byte-compile-file для файлов, указанных в командной строке. Эту функцию следует использовать только при пакетном запуске Emacs, поскольку по завершении она завершает работу Emacs. Ошибка в одном файле не мешает обработке последующих файлов, однако для этого файла выходной файл создан не будет, а процесс Emacs завершится с ненулевым кодом состояния.

Если noforce не равно nil, эта функция не компилирует повторно файлы, для которых уже существует актуальный файл «.elc».

$ emacs -batch -f batch-byte-compile *.el

Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Compilation-Functions.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API