время от времени фофан экспериментирую с написанием простеньких интерпретаторов, и пришел к таким вот выводам.
Термин «язык» в применении к современным ЯП вообще не вполне подходит, в том смысле, что они не являются языками, разве что только в математическом смысле, с натяжкой.
Когда речь идет о естественных языках, предполагается, что интерпертатором этого языка является человек. Когда человек интерпретирует выражения языка, он формирует контекст на ходу. Например, рассмотрим два выражения:
1) С первыми криками петухов Василий проснулся.
2) В этом году природа проснулась очень рано, в феврале уже капали сосульки.
Очевидно, что «проснуться» тут означает несколько разные вещи. Наш интерпретатор исходит из контекста.
если мы берем выражение, например foo.bar.baz
, то наш интерпретатор, как правило, абсолютно не видит текущего окружения. В лучшем случае, при наличии динамического связывания, baz может прочитать и зарезольвить лишь предыдущее слово, выполниться в его контексте, про foo на этапе выполнения baz ничего не известно, и никогда не будет, он исчез бесследно, и доступа к нему нет. Даже в наиболее динамичных языках, подобные возможности сильно ограничены, хотя кое какие попытки есть, например code-walking.
Думал, как можно было бы в теории решить эту проблему.
Пока думаю, ввести некий класс Interpreter, и каждое выражение им оборачивать. Нужно запоминать текущее выражение, и пытаться выполнить последующие слова в контексте предыдущих, которые уже схлопнулись Тут еще надо заметить, что разные объекты должны обрабатывать те же самые выражения по-разному.
Перемещено tailgunner из development