Spec-Zone.ru › Elisp

Объекты функций байткода

Компилированные в байт-код функции имеют специальный тип данных: они являются объектами функций байткода. Всякий раз, когда такой объект появляется как функция, которую нужно вызвать, Emacs использует интерпретатор байткода для выполнения байткода.

Внутренне, объект функции байткода очень похож на вектор; к его элементам можно получить доступ с помощью aref. Его печатное представление похоже на представление вектора, с дополнительным ‘#’ перед открывающей ‘[’. Он должен иметь как минимум четыре элемента; максимального числа элементов нет, но только первые шесть элементов имеют обычное применение. Это:

argdesc

Описание аргументов. Это может быть список аргументов, как описано в Списке аргументов, или целое число, кодирующее требуемое количество аргументов. В последнем случае значение описания определяет минимальное количество аргументов в битах от нуля до 6, а максимальное количество аргументов — в битах от 8 до 14. Если список аргументов использует &rest, то бит 7 устанавливается; в противном случае он очищается.

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

byte-code

Строка, содержащая инструкции байткода.

constants

Вектор объектов Lisp, на которые ссылается байт-код. Они включают символы, используемые в качестве имён функций и имён переменных.

stacksize

Максимальный размер стека, необходимый для этой функции.

docstring

Строка документации (если есть); в противном случае, nil. Значение может быть числом или списком, в случае если строка документации хранится в файле. Используйте функцию documentation для получения реальной строки документации (см. Доступ к документации).

interactive

Спецификация интерактивности (если есть). Это может быть строка или выражение Lisp. Оно nil для функции, которая не является интерактивной.

Вот пример объекта функции байткода, в печатном представлении. Это определение команды backward-sexp.

#[256
  "\211\204^G^@\300\262^A\301^A[!\207"
  [1 forward-sexp]
  3
  1793299
  "^p"]

Примитивный способ создания объекта байткода — с помощью make-byte-code:

Функция: make-byte-code &rest elements

Эта функция создаёт и возвращает объект функции байткода с elements в качестве его элементов.

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

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

Spec-Zone.ru

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