OberonCore
https://forum.oberoncore.ru/

Динамическая генерация кода
https://forum.oberoncore.ru/viewtopic.php?f=1&t=4896
Страница 1 из 1

Автор:  Димыч [ Вторник, 17 Декабрь, 2013 08:54 ]
Заголовок сообщения:  Динамическая генерация кода

Как можно сделать следующий трюк?

Имеется такая запись:

Код:
S := "
MODULE TmpMdl1;

   IMPORT StdLog;

PROCEDURE Hello*();
BEGIN
   StdLog.String('Hello world');
END Hello;

BEGIN
   Hello;
END TmpMdl1.";

Eval(S);


Что должна вызывать несуществующая пока процедура Eval?
В Лиспе, с которым я проработал достаточно много, это вообще не проблема, там "код как данные" и никаких проблем.

А в ББ?

Автор:  Пётр Кушнир [ Вторник, 17 Декабрь, 2013 10:05 ]
Заголовок сообщения:  Re: Динамическая генерация кода

Насколько я могу предположить, в компилируемом КП+ББ можно сделать только так:
Код:
s:="MODULE MyMod; PROCEDURE Do*; BEGIN END Do; END MyMod.";
text:=TextModels.dir.NewFromString(s);
DevCompiler.CompileText (text, 0, error);
IF ~error THEN
   Dialog.Call("MyMod.Do", "error while loading", res);
   m:=Kernel.ThisLoadedMod("MyMod");
   IF m#NIL THEN Kernel.UnloadMod(m) END;
   Files.dir.Delete(Files.dir.This('My/Code'), 'Mod');
   Files.dir.Delete(Files.dir.This('My/Sym'), 'Mod');
END;

или аналогично.

Автор:  Димыч [ Вторник, 17 Декабрь, 2013 10:13 ]
Заголовок сообщения:  Re: Динамическая генерация кода

Класс, я примерно такое же решение уже обдумывал!

Не понял только слово «компилируемый» в данном контексте.
Лисп уже давно компилируемый язык (есть, впрочем, и интерпретируемые реализации).

Автор:  Пётр Кушнир [ Вторник, 17 Декабрь, 2013 11:45 ]
Заголовок сообщения:  Re: Динамическая генерация кода

Димыч писал(а):
Не понял только слово «компилируемый» в данном контексте.
Лисп уже давно компилируемый язык (есть, впрочем, и интерпретируемые реализации).
Ну я скорее не про лисп, а про eval, потому что раньше обдумывал эту проблему и ориентировался на принципы работы eval в жаваскрипте и пхп.
Димыч писал(а):
Класс, я примерно такое же решение уже обдумывал!
Единственное, что лично я бы добавил - это свою инсталлируемую Files.Directory, чтобы компиляция модулей производилась в память. Так быстрее.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/