LINUX.ORG.RU

История изменений

Исправление den73, (текущая версия) :

Осудите план:

Делаю новый тег для bind. Беру все биндинги для Text, копирую их в этот тег. Каждый биндинг оборачиваю в проверку, не включён ли режим заморозки. Если не включён, то выполняю сразу, если включён, то откладываю.

Операция разморозки состоит в том, что я отправляю замороженные события по одному в after idle (или after 0, или after 50ms?) и после исчерпания замороженных событий отключаю режим заморозки.

Делаю я так сложно для того, чтобы не морочиться с разбором модификаторов клавиатуры, чтобы не перехватывать события, которые не предназначены моему виджету. Например, если пользователь нажал Alt-. для переключения в окно REPL, а редактор заморожен, то нет оснований заставлять пользователя ожидать разморозки редактора. Более того, это жизннено важно для отладки, когда сервер редактора повис.

Ну и вообще неплохо бы иметь библиотечку для метапрограммирования и шаблонирования. Пока уже сложились такие требования:

- подстановка метапараметров времени раскрытия шаблона. Пока окружаю шаблоны четырёхкратными угловыми скобками и делаю regsub.

- проверка, что в коде нет параметров, т.е. он не обращается ни к каким внешним переменным (ну или передавать список тех, к кому можно обращаться). Это нужно для «проверочных утверждений» (assert-ов) в ситуации, когда вычисление кода откладывается на потом и будет производиться в контексте, где текущие переменные могут быть недоступны.

- отложенная подстановка параметра. Здесь известно, что при выполнении кода в будущем будет определена некоторая переменная, которую и нужно будет использовать. Например, это будет если мы готовим тело для apply и при применении будут даны такие-то параметры.

При этом желательно, чтобы шаблоны кода задавались не строками, а были зрительно похожи на обычный код, т.е. с помощью {}. В общем-то, для такой библиотечки почти не нужно программирования. Это скорее должна быть статья, а не библиотечка. Может есть такая где-нибудь.

Самое обидное, что где-то в моём проекте уже есть наработки по этой теме, но я их потерял и не могу найти :)

Исходная версия den73, :

Осудите план:

Делаю новый тег для bind. Беру все биндинги для Text, копирую их в этот тег. Каждый биндинг оборачиваю в проверку, не включён ли режим заморозки. Если не включён, то выполняю сразу, если включён, то откладываю.

Операция разморозки состоит в том, что я отправляю замороженные события по одному в after idle (или after 0, или after 50ms?) и после исчерпания замороженных событий отключаю режим заморозки.

Делаю я так сложно для того, чтобы не морочиться с разбором модификаторов клавиатуры, чтобы не перехватывать события, которые не предназначены моему виджету. Например, если пользователь нажал Alt-. для переключения в окно REPL, а редактор заморожен, то нет оснований заставлять пользователя ожидать разморозки редактора. Более того, это жизннено важно для отладки, когда сервер редактора повис.

Ну и вообще неплохо бы иметь библиотечку для метапрограммирования и шаблонирования. Пока уже сложились такие требования:

- подстановка метапараметров времени раскрытия шаблона. Пока окружаю шаблоны четырёхкратными угловыми скобками и делаю regsub. - проверка, что в коде нет параметров, т.е. он не обращается ни к каким внешним переменным (ну или передавать список тех, к кому можно обращаться). Это нужно для «проверочных утверждений» (assert-ов) в ситуации, когда вычисление кода откладывается на потом и будет производиться в контексте, где текущие переменные могут быть недоступны. - отложенная подстановка параметра. Здесь известно, что при выполнении кода в будущем будет определена некоторая переменная, которую и нужно будет использовать. Например, это будет если мы готовим тело для apply и при применении будут даны такие-то параметры.

При этом желательно, чтобы шаблоны кода задавались не строками, а были зрительно похожи на обычный код, т.е. с помощью {}. В общем-то, для такой библиотечки почти не нужно программирования. Это скорее должна быть статья, а не библиотечка. Может есть такая где-нибудь.

Самое обидное, что где-то в моём проекте уже есть наработки по этой теме, но я их потерял и не могу найти :)