Итак, мы делаем на tcl/tk текстовый редактор с раскраской. Раскрашиваем лисп. Принято принципиальное решение, что алгоритм раскраски будет написан на лиспе, а не на tcl/tk. Общение между tcl/tk и лиспом происходит через сокеты и сервер SWANK.
Естественно, есть вопрос о быстродействии раскраски.
Вопрос: как этого добиться? У меня пока только одна идея: перехватывать любое событие, которое меняет содержимое текста, отправлять его в лисп в виде потока сообщений такого рода:
открыт файл blablabla следующего содержимого:
(начальное содержимое файла асинхронно передаётся по кусочкам)
стёрта буква в позиции 4356
вставлена строка asdfjkl в позиции 123
На лисповой стороне эти команды воспроизводятся, буфер воссоздаётся и работает собственно алгоритм раскраски. Как он работает - не суть важно в данный момент. Дальше соответствие позиций с цветами передаётся обратно в tcl тоже в виде команд:
раскрась текст с 1 до 10 в зелёный
раскрась текст с 12 до 20 в красный
Всё это было бы круто, но проблема в задержке: пока команды передаются туда и обратно, пользователь продолжает редактировать текст. Поэтому наши команды к моменту своего прихода устаревают.
Как вообще такие задачи решаются в нормальной жизни? В tcl/tk есть маркеры, прилипшие к тексту, с помощью которых можно частично отслеживать движение блоков текста. Можно передавать маркеры в лисп, если это чему-то поможет.
У меня есть некоторые идеи, как решить задачу, но в XXI веке такие задачи желательно не решать, а брать в уже решённом виде. Лучше бы найти какую-нибудь статью, где расписан алгоритм, а ещё лучше, воплощение в виде кода.
Этот алгоритм не должен тормозить где-то до 300 кб исходника. БОльшие по размеру исходники встречаются не так часто, для начала можно забить на это.