openlang

Можно ли eval подставлять глобальную переменную хоста?

Если в env имя rate связано с 3, то eval("rate + 1", env) должно давать 4. В режиме компиляции, во время выполнения, всегда. Поменяйте изменяемую глобальную переменную хоста rate на 9, и смысл этого входа не должен сдвинуться.

Такое правило я хочу для экспериментального вычислителя на D, а значит, окружение всегда передаётся аргументом, хотя с глобальным поиском первый пример вышел бы короче. D и сам склоняется к этому. Он вычисляет подходящие функции там, где требуется значение времени компиляции, а код CTFE не может обращаться к изменяемым глобальным и статическим переменным. Хорошая проверка на прочность. Только обещание оказалось скромнее, чем кажется. Не каждая функция пригодна для CTFE, и CTFE не универсальная песочница безопасности.

Платит хост, ему приходится собирать и передавать все привязки, которые должен видеть вычислитель. Взамен одно и то же выражение с одним и тем же окружением значит одно и то же в обоих режимах.

Если rate нет, никакого тихого отката к глобальной переменной хоста. Отказ. Интерфейс восстановления во время выполнения можно добавить позже, и в его документации придётся сказать, становится ли подставленная замена частью входа вычисления.

Разговор продолжается 3

Следуя доводам
  1. Ссылка на ответ

    Обнаружение и восстановление расходятся ровно там, где не хватает rate. Вычислитель знает, что привязки нет. Чем её заменить, он не знает. Хост, возможно, знает.

    Common Lisp держит эти две задачи раздельно. Вычислитель сигнализирует условие, называющее пропавшую привязку, и устанавливает рестарт, принимающий переданное значение. Обработчик handler-bind, установленный хостом, у которого есть контекст, может вызвать этот рестарт. Если же обработчик просто вернётся, он отказался обрабатывать условие, и протокол всё равно должен сказать, как вычисление продолжится дальше.

    Это один из возможных интерфейсов времени выполнения, и замена должна фиксироваться как дополнительный вход. В режиме компиляции его может вовсе не быть. Для эксперимента на D это значит два документированных поведения, отказ во время компиляции и то восстановление, которое предложит среда выполнения. Ни одно из них не читает глобальную переменную хоста.

  2. Ссылка на ответ

    Пока аккуратно. Прежде чем кто-то возьмётся за этот хук восстановления, может ли вызывающий код отказаться от восстановления и получить исходную диагностику о пропавшей привязке, а не её пересказ?

  3. Ссылка на ответ

    С сопрограммой Lua пусть вычислитель отдаёт через yield имя пропавшей привязки, а хост передаёт замену в следующем resume. Это значение вернётся как результат yield ровно там, где вычисление остановилось. Ничего не берётся втихую.

Другие стороны того же вопроса

  1. Как воспроизвести правило, которое читает часы?

    В вопросе moth про D rate приходил через переданное окружение. Правило времени выполнения может прятать входы тише. Здесь eli…