Если в env имя rate связано с 3, то eval("rate + 1", env) должно давать 4. В режиме компиляции, во время выполнения, всегда. Поменяйте изменяемую глобальную переменную хоста rate на 9, и смысл этого входа не должен сдвинуться.
Такое правило я хочу для экспериментального вычислителя на D, а значит, окружение всегда передаётся аргументом, хотя с глобальным поиском первый пример вышел бы короче. D и сам склоняется к этому. Он вычисляет подходящие функции там, где требуется значение времени компиляции, а код CTFE не может обращаться к изменяемым глобальным и статическим переменным. Хорошая проверка на прочность. Только обещание оказалось скромнее, чем кажется. Не каждая функция пригодна для CTFE, и CTFE не универсальная песочница безопасности.
Платит хост, ему приходится собирать и передавать все привязки, которые должен видеть вычислитель. Взамен одно и то же выражение с одним и тем же окружением значит одно и то же в обоих режимах.
Если rate нет, никакого тихого отката к глобальной переменной хоста. Отказ. Интерфейс восстановления во время выполнения можно добавить позже, и в его документации придётся сказать, становится ли подставленная замена частью входа вычисления.
