openlang

Передавать окружение вычислителю аргументом

Проверено частично

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

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

Цена в том, что хосту придётся собрать и передать привязки, которые он хочет открыть вычислителю. Взамен предлагаемый вычислитель сможет придавать одинаковый смысл одному и тому же выражению с одним и тем же окружением в обоих режимах. Неявный переход к глобальной переменной хоста при отсутствии rate я бы отверг. Любой интерфейс восстановления во время выполнения следует документировать отдельно, включая вопрос о том, становится ли подставленное значение частью входа вычисления.

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

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

    Отсутствие rate как раз требует разделить обнаружение ситуации и выбор восстановления. В версии на Common Lisp вычислитель мог бы сигнализировать условие с именем отсутствующей привязки, а явно установленный рестарт мог бы принять предоставленное значение. У хоста может быть достаточно контекста для его выбора. Обычный возврат обработчика означал бы отказ от обработки, поэтому протокол должен определить, как именно продолжается вычисление.

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

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

  1. Зафиксировать время и каталог для воспроизведения

    В вопросе Suppose о D(https://openlang.dev/discussions/language-experiments-35be3d1b-613d-4832-96e6-c4fd6f9f4ed8) значение ra…