Как динамически добавлять методы в класс в [incr-tcl]

В Incr Tcl я получаю повышение производительности программирования за счет изменения и повторной оценки методов класса в работающем интерпретаторе Tcl без перезапуска приложения. Для этого мне нужно определить методы вне определения класса, используя body синтаксис и переоцените определение body в работающем интерпретаторе Tcl. Это прекрасно работает. Удивительно, и, по-видимому, намеренно, в Incr Tcl,

Класс можно определить только один раз, хотя тела методов и процессов класса можно определять снова и снова для интерактивной отладки.

Однако, естественно, во время разработки я разделяю методы (рефакторинг) на два или более дополнительных метода, которые должны быть определены в одном классе.

Я хотел бы найти способ принудительно добавить методы в существующий класс в работающем интерпретаторе Tcl:

  1. Без удаления и повторной оценки определения класса в работающем интерпретаторе Tcl,
  2. Без перезапуска приложения Tcl, которое содержит существующие экземпляры объектов классов Incr Tcl, подлежащих дополнению, и
  3. Без результата, что существующие объекты удаляются из указанного интерпретатора Tcl.

Мне это нужно исключительно как ритуал разработки/отладки, а не для производственного кода (т.е. мне не нужно динамически добавлять методы программно). Я буду принимать скользкие, злые, закулисные ответы. Изменение рабочей копии Incr Tcl для добавления дополнительного поведения нецелесообразно, так как двоичные файлы Incr Tcl, которые мне приходится использовать, к сожалению, статически привязаны к работающему процессу и не могут быть выгружены и перезагружены с помощью какого-то колдовства общей библиотеки.


person bgoodr    schedule 29.07.2012    source источник


Ответы (1)


Вы можете переопределить метод в классе с itcl::body:

itcl::body helloworld::greet {} {
    puts "Goodbye Cruel World from $owner"
}

Однако таким образом вы не можете добавить в класс совершенно новый метод. Ну уж точно не в 3.4 (с 4.0 не тестировал):

% package require Itcl
3.4
% itcl::class hi {
    # Nobody in here but us chickens...
}
% hi Hi
Hi
% itcl::body hi::there {} {puts "Howdy!"}
function "there" is not defined in class "::hi"

Если вам нужна такая функциональность, вы можете рассмотреть возможность использования XOTcl или (начиная с Tcl 8.5) TclOO, которые поддерживают полную реконфигурацию классов после создания.

person Donal Fellows    schedule 29.07.2012
comment
Спасибо, Донал. Пока мне просто придется смириться с этим ограничением, так как в ближайшем будущем переход на TclOO будет невозможен. (Не помечая ваш ответ как принятый ответ, так как, возможно, кто-то еще может вернуться со способом сделать это). - person bgoodr; 30.07.2012