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

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

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

Печатное представление символа с позицией использует нотацию хеша, изложенную в Печатное представление и синтаксис чтения. Оно выглядит как «#». Оно не имеет синтаксиса чтения. Вы можете заставить печататься только базовый символ, привязав переменную 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.