Когда можно переопределить привязки верхнего уровня в схеме (R7RS)?
Я прочитал текущий проект будущего стандарта схемы R7RS (небольшой язык), но я не понимаю, при каких условиях переопределение привязок верхнего уровня не является ошибкой.
Я думаю, что это можно определить или установить! привязка, которая была введена на верхнем уровне программы во второй раз. Но как насчет импортированных привязок из внешней библиотеки? Можно ли переопределить эти привязки по стандарту?
На странице 26/27 отчета говорится:
Верхний уровень программы также может включать объявления импорта. В объявлении библиотеки является ошибкой импортировать один и тот же идентификатор более одного раза с разными привязками или переопределять или изменять импортированную привязку с помощью define, define-syntax или set!. Однако, REPL должен разрешать эти действия.
Означает ли это, что переопределение является только ошибкой, когда это происходит в библиотеках для импортированных привязок?
Я понимаю, что он запрещает оптимизацию компиляторами, если компилятор не знает, означает ли, скажем, + встроенное дополнение, или является какой-либо другой указанной пользователем ошибкой. Но с этой точки зрения не имеет смысла ограничивать запрет повторной привязки на уровне библиотеки, когда это также имеет смысл (по крайней мере) для импортированных привязок в программах.
PS: Так как это все о среде программы программы: правильно ли я говорю, что среда не является гражданами первого сорта, потому что нельзя овладеть текущей средой? (Что, в свою очередь, позволяет скомпилированной программе забыть о выбранных именах привязок.)
1 ответ
Общий принцип заключается в том, что объявленная в библиотеке привязка может быть мутирована только в той же библиотеке. Если привязки библиотеки импортируются в программу (или в другую библиотеку), они не могут быть изменены там. Таким образом, если программа импортирует (scheme base)
, идентификатор +
всегда относится к стандартной процедуре сложения (за исключением области, где она локально затенена lambda, let, let*
или что у тебя, конечно).
На REPL или в сценарии, выполняемом REPL, это ограничение не применяется. Кроме того, реализация может расширить стандартный язык, сняв ограничение.
Ближайший эквивалент текущей глобальной окружающей среде является результатом (interaction-environment)
, который представляет изменчивую среду REPL, если таковая имеется. Если REPL не используется или не существует, вы можете смоделировать текущую, но неизменную среду, вызвав environment
на аргументы, соответствующие любому текущему набору импорта. R7RS, как и его предшественники, не имеет представления о лексических средах.