elisp векторы и символы / целые числа - PullRequest
4 голосов
/ 07 августа 2010

У меня вопрос по векторам Элиспа. Действительно ли целые и символы хранятся (эффективно) внутри вектора или через ссылку (указатель)? Векторы могут содержать произвольные объекты, например:

(setq v (make-vector 10 nil))
(aset v 0 "Hello World")

В этом случае очевидно, что в векторной ячейке 0 хранится ссылка (указатель) на строку «Hello World». Но как насчет целых чисел / символов?

(aset v 1 ?X)

Действительно ли символ X хранится внутри ячейки вектора 1?

1 Ответ

6 голосов
/ 07 августа 2010

На уровне C объект lisp emacs - это объект размером со слово, который содержит биты тегов и биты значений.Биты тега определяют, как следует интерпретировать биты значения: как указатель (и на что) или как прямую константу, такую ​​как целое число или символ.Это довольно распространенный метод реализации для языков высокого уровня.

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

Детали представления (такие как количество битов тега, сколько целых чисел может идти, ии так далее) зависит от версии Emacs и настроек времени компиляции.Исходный файл, в котором происходит магия: src/lisp.h.

...