2010-08-06 2 views
4

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

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

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

(aset v 1 ?X) 

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

ответ

6

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

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

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

Смежные вопросы