6.7 Булевы векторы

Булев вектор очень похож на вектор, за исключением того, что он хранит только значения t и nil. Если вы попытаетесь сохранить в элемент булева вектора любое значение, отличное от nil, то вместо этого будет сохранено t. Как и во всех массивах, индексы булевых векторов начинаются с 0, и длину нельзя изменить после создания булева вектора. Булевы векторы являются константами при вычислении.

Несколько функций работают специально с булевыми векторами; помимо этого, вы манипулируете ими с помощью тех же функций, которые используются для других типов массивов.

Функция: make-bool-vector length initial

Возвращает новый булев вектор с length элементами, каждый из которых инициализирован значением initial.

Функция: bool-vector &rest objects

Эта функция создает и возвращает булев вектор, чьи элементы — это переданные аргументы, objects.

Функция: bool-vector-p object

Возвращает t, если object является булевым вектором, и nil в противном случае.

Существуют также некоторые функции операций над булевыми векторами, описанные ниже:

Функция: bool-vector-exclusive-or a b &optional c

Возвращает побитовое исключающее ИЛИ булевых векторов a и b. Если указан необязательный аргумент c, результат этой операции сохраняется в c. Все аргументы должны быть булевыми векторами одинаковой длины.

Функция: bool-vector-union a b &optional c

Возвращает побитовое ИЛИ булевых векторов a и b. Если указан необязательный аргумент c, результат этой операции сохраняется в c. Все аргументы должны быть булевыми векторами одинаковой длины.

Функция: bool-vector-intersection a b &optional c

Возвращает побитовое И булевых векторов a и b. Если указан необязательный аргумент c, результат этой операции сохраняется в c. Все аргументы должны быть булевыми векторами одинаковой длины.

Функция: bool-vector-set-difference a b &optional c

Возвращает разность множеств булевых векторов a и b. Если указан необязательный аргумент c, результат этой операции сохраняется в c. Все аргументы должны быть булевыми векторами одинаковой длины.

Функция: bool-vector-not a &optional b

Возвращает дополнение множества булевого вектора a. Если необязательный аргумент b указан, результат этой операции сохраняется в b. Все аргументы должны быть булевыми векторами одинаковой длины.

Функция: bool-vector-subsetp a b

Возвращает t, если каждое значение t в a также t в b, и nil в противном случае. Все аргументы должны быть булевыми векторами одинаковой длины.

Функция: bool-vector-count-consecutive a b i

Возвращает количество последовательных элементов в a, равных b, начиная с i. a — булев вектор, b — t или nil, а i — индекс в a.

Функция: bool-vector-count-population a

Возвращает количество элементов, равных t в булевом векторе a.

Выведенная форма представляет до 8 булевых значений в одном символе:

(bool-vector t nil t nil)
     ⇒ #&4"^E"
(bool-vector)
     ⇒ #&0""

Вы можете использовать vconcat для вывода булева вектора, как и другие векторы:

(vconcat (bool-vector nil t nil t))
     ⇒ [nil t nil t]

Вот еще один пример создания, просмотра и обновления булева вектора:

(setq bv (make-bool-vector 5 t))
     ⇒ #&5"^_"
(aref bv 1)
     ⇒ t
(aset bv 3 nil)
     ⇒ nil
bv
     ⇒ #&5"^W"

Эти результаты имеют смысл, потому что двоичные коды для control-_ и control-W составляют 11111 и 10111 соответственно.