У меня есть предстоящий проект, в котором основным требованием будет изменение способа работы метода во время выполнения.Обратите внимание, что я не говорю о концепции ОО более высокого уровня, такой как «затенение одного метода другим», хотя практический эффект будет аналогичным.
Ключевые свойства, которые мне нужны,:
Я должен иметь возможность изменить метод таким образом, чтобы я мог добавлять новые выражения, удалять существующие выражения или изменять любые выражения, которые в нем присутствуют.
После изменения метода последующие вызовы этого метода вызовут новую последовательность операций.(Или, если язык связывает методы, а не оценивает каждый раз, предоставьте мне способ отсоединить / перепривязать новый метод.)
В идеале, я хотел бы манипулировать атомными единицамиязыка (например, «вызвать метод foo
для объекта bar
»), а не сборку напрямую (например, «вставить эти три параметра в стек»).Другими словами, я бы хотел иметь высокую уверенность в том, что создаваемые мной операции семантически значимы в языке.Но я возьму то, что смогу получить.
Если вы не уверены, соответствует ли язык кандидата этим критериям, вот простой лакмусовый тест:
Можете ли вы написать другой метод с именем clean
, который:
принимает метод m
в качестве ввода
возвращает другой метод m2
который выполняет те же операции, что и m
, так что m2
идентичен m
, но не содержит вызовов метода print-to-standard-outна вашем языке (переводит, System.Console.WriteLn, println и т. д.)?
Я бы хотел провести предварительное исследование и выяснить, какие кандидаты наиболее сильны.являются.Наличие большого активного сообщества для меня так же важно, как и практическая реализация того, что я хочу сделать.Я знаю, что здесь может быть какая-то неподделанная территория, поскольку непосредственное манипулирование байт-кодом, как правило, не является операцией, которую нужно разоблачать.
Какие варианты доступны для меня?Если возможно, можете ли вы привести пример игрушки на одном или нескольких рекомендованных вами языках или указать на недавний пример?
Обновление: Причина, по которой япосле этого я хотел бы написать программу, которая способна изменять себя во время выполнения в ответ на новую информацию.Эта модификация выходит за рамки простых параметров или настраиваемых данных, но представляет собой полноценные, развитые изменения в поведении.(Нет, я не пишу вирус.;))