В Python я бы сделал следующую строку для обработки файла:
with open(infile) as f:
for line in f:
process(line)
Пытаясь найти способ сделать то же самое в elisp (с буферами вместо файлов), я не нашел очевидного пути.
(В итоге я хочу получить две упорядоченные структуры данных строк, одна из которых содержит все строки, соответствующие регулярному выражению, а другая содержит те, которые не совпадают.)
(let ((start (point))) (goto-char (point-max)) (while (> (point) start) ... (forward-line -1)))
?start
иend
являются существующими переменными, которые разграничивают область, над которой мы хотим работать.Я не знаю ни одного идиоматического способа, но я придумал это:
источник
Я думаю, что следующее настолько идиоматично, насколько это возможно:
РЕДАКТИРОВАТЬ: Вот другое решение с
loop
вместоdolist
, и которое также классифицирует строки в зависимости от того, соответствуют они или нет вашему регулярному выражению:Если вы установите переменную для вывода этой функции, скажем
(setq x (loop ...))
, тогда будет найден желаемый список совпадающих строк(car x)
, причем список несовпадающих строк будет(cdr x)
.источник