Функции match-data и set-match-data считывают или
записывают все данные совпадения за один раз.
Эта функция возвращает список позиций (маркеров или целых чисел), которые
записывают всю информацию о тексте, с которым последнее совпадение поиска совпало.
Элемент ноль — это позиция начала совпадения для всего выражения; элемент один —
позиция конца совпадения для выражения. Следующие два элемента — это позиции
начала и конца совпадения для первого подвыражения и так далее.
В общем случае, элемент
номер 2n
соответствует (match-beginning n); а
элемент
номер 2n + 1
соответствует (match-end n).
Обычно все элементы являются маркерами или nil, но если
integers не равен nil, это означает использование
целых чисел вместо маркеров. (В этом случае сам буфер добавляется как
дополнительный элемент в конец списка для облегчения полного восстановления
данных совпадения.) Если последнее совпадение было выполнено по строке с
string-match, то всегда используются целые числа, поскольку маркеры
не могут указывать внутрь строки.
Если reuse не равен nil, то это должен быть список.
В этом случае match-data сохраняет данные совпадения в reuse.
То есть reuse изменяется деструктивно. reuse не
обязательно должен иметь правильную длину. Если его недостаточно для хранения
данных совпадения, он расширяется. Если он слишком длинный, длина reuse
остается прежней, но неиспользованные элементы устанавливаются в nil.
Цель этой функции — уменьшить потребность в сборке мусора.
Если reseat не равен nil, все маркеры в списке
reuse сбрасываются, чтобы они не указывали ни на что.
Как всегда, не должно быть возможности промежуточных поисков между вызовом
функции поиска и вызовом match-data, предназначенным для
доступа к данным совпадения этого поиска.
(match-data)
⇒ (#<marker at 9 in foo>
#<marker at 17 in foo>
#<marker at 13 in foo>
#<marker at 17 in foo>)
Эта функция устанавливает данные совпадения из элементов match-list,
который должен быть списком, являвшимся результатом предыдущего вызова
match-data. (Более точно, подойдет что угодно с тем же форматом.)
Если match-list ссылается на буфер, которого не существует, вы не получите ошибку; это установит данные совпадения бессмысленным, но безвредным способом.
Если reseat не равен nil, все маркеры в списке
match-list сбрасываются, чтобы они не указывали ни на что.
store-match-data — это полуустаревший псевдоним для set-match-data.