Давеча товарищ Темерев задумал в Перле захреначить незахреначиваемое.
А именно, воспротивиться завету великого Ларри Уолла «full qualified idenifier is context independent».
Когда на перлмонкс сказали, что это принципиально невозможно, я сильно заинтересовался вопросом.
На деле выяснилось, что для создания принципиально невозможного мне требуется порядка 20 часов непрерывной работы, google.com (1 шт) и исходники языка программирования (1 шт, дохрена мегабайт и нихрена непонятно).
Херовина работает. Использование выглядит так:
Работает эта фиговина весьма dirtyhack'но, но для статических пакетов стопроцентно стабильно.
Для динамически создаваемых работает, скажем так, приемлимо. На поверхности никаких глюков нет, базовые юнит-тесты проходят без нареканий. Т.е. всё хорошо работает, но неожиданно может какая-нибудь глюка всплыть и никто (кроме меня и Larry Wall'а) не догадается, откуда.
Ну и конечно при динамическом создании объектов никакой thread safety.
Какая нахер thread safety, когда пакет нагло лезет в compiler globals? :(
Но работает, сцукно. Работает.
Чего-то я уже спать хочу, хотя за окном всё ещё светло.. А, это УЖЕ светло!
Ну, тем более спать. :-)
А именно, воспротивиться завету великого Ларри Уолла «full qualified idenifier is context independent».
Когда на перлмонкс сказали, что это принципиально невозможно, я сильно заинтересовался вопросом.
На деле выяснилось, что для создания принципиально невозможного мне требуется порядка 20 часов непрерывной работы, google.com (1 шт) и исходники языка программирования (1 шт, дохрена мегабайт и нихрена непонятно).
Херовина работает. Использование выглядит так:
# тут мы создаём классы как нам вздумается,
# загружаем чужие модули и прочая, прочая.
use namespace New::Root::Context;
# А теперь у нас рутовым контекстом
# (только для дочерних пакетов, для
# обычных переменных ничего не изменилось)
# Стал New::Root::Context!
#
# Все дочерние пакеты старого дерева
# запихнуты в ROOT::blablabla.
# Если надо ROOT переименовать, то
# работает так:
use namespace New::Root::Context, root => 'TOOR';
Работает эта фиговина весьма dirtyhack'но, но для статических пакетов стопроцентно стабильно.
Для динамически создаваемых работает, скажем так, приемлимо. На поверхности никаких глюков нет, базовые юнит-тесты проходят без нареканий. Т.е. всё хорошо работает, но неожиданно может какая-нибудь глюка всплыть и никто (кроме меня и Larry Wall'а) не догадается, откуда.
Ну и конечно при динамическом создании объектов никакой thread safety.
Какая нахер thread safety, когда пакет нагло лезет в compiler globals? :(
Но работает, сцукно. Работает.
Чего-то я уже спать хочу, хотя за окном всё ещё светло.. А, это УЖЕ светло!
Ну, тем более спать. :-)