Spec-Zone.ru › Elisp

Символы с позицией

Символ с позицией — это символ, называемый базовым символом, вместе с неотрицательным фикнумом, называемым позицией. Хотя символ с позицией часто ведёт себя как его базовый символ, он не является символом: это объект, содержащий базовый символ и позицию. Поскольку символы с позицией не являются символами, у них нет записей в таблице символов, хотя у их базовых символов такие записи обычно есть (см. раздел Создание символов и добавление их в таблицу символов).

Байтовый компилятор использует символы с позицией, записывает в них позицию каждого вхождения символа и использует эти позиции в предупреждениях и сообщениях об ошибках. Обычно их не следует использовать в других целях. Это может привести к неожиданным результатам при использовании таких базовых функций Emacs, как eq и equal.

Печатное представление символа с позицией использует нотацию с решёткой, описанную в разделе Печатное представление и синтаксис чтения. Оно выглядит так: ‘#<symbol foo at 12345>’. У него нет синтаксиса чтения. Чтобы при печати выводился только базовый символ, можно привязать переменную print-symbols-bare к значению, отличному от nil, на время операции печати. Байтовый компилятор делает это перед записью вывода в скомпилированный файл Lisp.

Когда переменная-флаг symbols-with-pos-enabled имеет значение, отличное от nil, символ с позицией обычно ведёт себя как его базовый символ. Например, выражение ‘(eq (position-symbol 'foo 12345) 'foo)’ возвращает t, а equal также рассматривает символ с позицией как его базовый символ.

Когда symbols-with-pos-enabled равно nil, символы с позицией ведут себя как самостоятельные объекты, а не как символы. Например, выражение ‘(eq (position-symbol 'foo 12345) 'foo)’ возвращает nil, а equal также рассматривает символ с позицией как объект, не равный его базовому символу.

В большинстве случаев в Emacs symbols-with-pos-enabled равно nil, но байтовый компилятор и нативный компилятор привязывают его к t во время работы, и в этом случае Emacs работает немного медленнее.

Обычно символы с позицией создаются байтовым компилятором, который вызывает функцию чтения read-positioning-symbols (см. раздел Функции ввода). Символ с позицией также можно создать с помощью функции position-symbol.

Переменная: symbols-with-pos-enabled

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

Переменная: print-symbols-bare

Если переменная привязана к значению, отличному от nil, принтер Lisp выводит только базовый символ символа с позицией, игнорируя позицию. В противном случае символ с позицией выводится как самостоятельный объект, а не как символ.

Функция: symbol-with-pos-p object

Эта функция возвращает t, если object — символ с позицией, и nil в противном случае. В отличие от symbolp, эта функция игнорирует symbols-with-pos-enabled.

Функция: bare-symbol sym

Эта функция возвращает базовый символ символа с позицией sym или сам sym, если он уже является символом. Для объекта любого другого типа функция сигнализирует об ошибке. Эта функция игнорирует symbols-with-pos-enabled.

Функция: symbol-with-pos-pos sympos

Эта функция возвращает позицию — неотрицательный фикнум — символа с позицией sympos. Для объекта любого другого типа функция сигнализирует об ошибке. Эта функция игнорирует symbols-with-pos-enabled.

Функция: position-symbol sym pos

Создаёт новый символ с позицией. Базовый символ нового объекта берётся из sym, который может быть символом или символом с позицией; в последнем случае используется его базовый символ. Позиция нового объекта берётся из pos, который может быть неотрицательным фикнумом или символом с позицией; в последнем случае используется его позиция. Если любой из аргументов недопустим, Emacs сигнализирует об ошибке. Эта функция игнорирует symbols-with-pos-enabled.

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/Symbols-with-Position.html

Spec-Zone.ru

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