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