> -- Alexey Veselovsky писал(а):
> "доступны динамически" лично я интерпретировал, как: мы имеем право получить доступ к тому чего небыло на этапе компиляции. Т.е. мы можем сказать LoadModule("MyModule")С чего вы взяли LoadModule? Там говорится скорее о FindModule("MyModule"). "Доступны динамически" не новые модули, которых не было в момент компиляции, а информация о доступных на момент исполнения модулях.> -- Alexey Veselovsky писал(а):
> Т.о. про метаинформацию нет ничего (кроме разве что имен модулей (а эта метаинформация может быть просто в имени файла модуля) и сигнатур процедур-команд), зато про загрузку модулей есть вполне:Цитаты хорошие, только надо внимательно читать. Во-первых, про метаинформацию там есть (meta information), во-вторых:> -- Цитата:
> If necessary, this  cause modules to be loaded.Может будут загружены, а может и не будут - в зависимости от реализации. Слово "may" означает "может", а не "должен". Отдельно проговорено, что в случае встроенных систем никакой загрузки ожидать не приходится, т.е. это возможность дополнительная. А основная возможность, как я и говорю, - в том, чтобы получить ссылку на модуль по имени, если модуль с таким именем присутствует (в памяти или, если есть динамический загрузчик, на диске), а потом уже найти там по имени нужную команду или экспортированный тип.

Смотрим на реализаицю XDS. Напомню, что в XDS только статическая линковка. Описание модуля oberonRTS.
PROCEDURE Search(name: ARRAY OF CHAR): Module;
(* Returns a module by its name or nullModule. *)
PROCEDURE ThisCommand(m: Module; name: ARRAY OF CHAR): Command;
(* Returns the command (parameterless procedure) named "name" in the module m or NIL, if the command does not exist. *)

Пример кода (только что накидал, не компилировал):
## Код:
```
PROCEDURE RunCmd* (modName, cmdName: ARRAY OF CHAR);
VAR
   mod: oberonRTS.Module;
   cmd: oberonRTS.Command; (* TYPE Command = PROCEDURE (); *)
BEGIN
   mod := oberonRTS.Search (modName);
   IF mod # oberonRTS.nullModule THEN
      cmd := oberonRTS.ThisCommand (mod, cmdName);
      IF cmd # NIL THEN
         cmd (); (* Выполняем найденную команду *)
      END
   END
END RunCmd;
```
RunCmd ('MyModule', 'MyCmd'); (* Выполнится MyModule.MyCmd при условии, что модуль MyModule прилинкован и содержит экспортированную процедуру MyCmd без параметров. Тот, кто вызывает RunCmd не обязан импортировать MyModule ни прямо, ни косвенно. Вот это и есть "retrievable dynamically", не путайте с "loadable dynamically". *)