Что означает, что библиотека Scheme должна быть * загружена *? Когда библиотеки Scheme * загружаются *?

Я изучаю пересмотренный7 отчет по алгоритмической языковой схеме. У меня вопрос по разделу 5.6 Библиотеки.

В этом разделе говорится:

Когда библиотека загружена, ее выражения выполняются в текстовом порядке. Если на определения библиотеки ссылаются в расширенной форме программы или тела библиотеки, то эта библиотека должна быть загружена до того, как будет развернута расширенная программа или тело библиотеки. Это правило применяется транзитивно. Если библиотека импортируется более чем одной программой или библиотекой, она может быть загружена дополнительное время.

Что это должно означать? Означает ли это, что библиотека загружается только в том случае, если на импортированный идентификатор действительно ссылаются или уже когда библиотека является частью набора импорта расширенной программы или библиотеки? Если на одну и ту же библиотеку ссылаются две другие библиотеки, импортированные той же самой программой, загружается ли библиотека дважды или только один раз?

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

Я провел несколько экспериментов с chibi-схемой: для каждой программы chibi-схема загружает каждую библиотеку только один раз, и даже если ни на один из экспортированных идентификаторов не ссылаются. На самом деле, это выглядит как разумная и легко осуществимая вещь для меня.

PS: есть еще один момент, когда я думаю, что спецификация немного расплывчата: что произойдет, если в программе набор импорта импортирует идентификатор с именем import? Означает ли это, что сразу после строки (import ...) интерпретируется как команда или определение (в зависимости от того, какой импортированный идентификатор import стоит) или еще как импортный набор?

PPS: В чем причина того, что в программе верхнего уровня разрешено более одного объявления импорта?

1 ответ

Решение

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


Библиотека загружается при импорте через import заявление.


Если на определения библиотеки ссылаются в расширенной форме программы или тела библиотеки, то эта библиотека должна быть загружена до того, как будет развернута расширенная программа или тело библиотеки.

Это просто означает, что библиотека должна быть загружена до ссылки на ее определения (или это будет ошибкой, поскольку определения не будут найдены).


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

Это зависит от реализации, поэтому код вашей библиотеки не должен предполагать, что он будет загружен только один раз.


Что произойдет, если в программе набор импорта импортирует идентификатор с именем import?

Скорее всего, новый import идентификатор будет затенять или заменять import, так что любой import заявления в той же области больше не будут работать, как ожидалось. Это может зависеть от реализации - если import реализуется как специальная форма, тогда она не будет переопределена вновь введенным идентификатором.

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