Упростил процедуру добавления команд в ядро DEmbro.
Допустим, что я хочу добавить группу команд «file», в которую входят fopen, fclose, fwrite и fread.
Как это было раньше
Заходим в директорию source\DEmbro\commands, создаём там файл DCommandsFile.pas4, в нём пишем паскалевский модуль, в котором реализуем все команды.
Создаём в модуле публичную функцию LoadCommands, в которой добавляем каждую команду в ядро (при помощи функции AddCommand).
Далее, заходим в главный файл проекта source\DEmbro\dembro32.dpr, в разделе uses добавляем подключение нового модуля.
Теперь, заходим в source\DEmbro\DForthMachine.pas4, в приватной секции uses тоже прописываем новый модуль. В методе OForthMachine.Create того же файла добавляем строку DCommandsFile.LoadCommands(@Self);.
В этот момент команда появилась в ядре дембро, проект можно компилировать. Чтобы при стандартном запуске дембро эти команды были видны, нужно проделать ещё пару шагов.
Заходим в core\release\default, создаём файл file.de, в нём при помощи команды samebuiltin прописываем подключаемые команды.
В файле core\release\default\system.de прописываем
str" core\default\file.de" evaluate-file
Теперь всё сделано. За исключением того, что ещё желательно писать хелп для каждой команды. Ужас, не правда ли?
Как это будет теперь
Заходим в source\DEmbro\commands, создаём файл file.cmd, в нём реализуем команды в таком виде:
DECLARE(fopen)
body( code for open );
RUS SUMMARY ( i B: s -- f) открывает файл по имени с заданными флагами
DECLARE(fclose)
body( code for close);
RUS SUMMARY ( f --) закрывает файл, открытый ранее при помощи команды fopen
DECLARE(fread)
body( code for read);
RUS SUMMARY ( pif --) читает i байт в область памяти p из файла f
DECLARE(fwrite)
body( code for write);
RUS SUMMARY ( pif --) записывает i байт из области памяти p из файла f
Далее, в файле source\DEmbro\commands\groups.list добавляем строку GROUP(file).
Теперь в директории source\DEmbro можно выполнить make commands и команды будут автоматически разнесены по всем нужным файлам, остаётся только скомпилировать ядро.
Как это работает
Файлы *.cmd и groups.list обрабатываются при помощи m4 в несколько проходов, каждый раз предварительно подгружаются разные библиотеки. Библиотеки распологаются в source\m4 и начинаются с буквы «c» (от слова commands).
Например, чтобы сгенерировать список подключения команд в ядре, используется cload.m4 в следующей команде
m4 ..\m4\cload.m4 temp\all.cmd > temp\load.inc4
Сгенерированный файл load.inc4 выглядит примерно так:
AddCommand("malloc", _malloc, False);
AddCommand("free", _free, False);
AddCommand("realloc", _realloc, False);
AddCommand("move", _move, False);
AddCommand("fill", _fill, False);
AddCommand("current-directory", _current_directory, False);
А если проделать то же самое, но подключать cbuiltin.m4, то получим файл вида mem.de.
Аналогичным образом строятся другие файлы, а в будущем будут строиться хелпы. Напоследок приведу текущий код скрипта, раскидывающий команды (таргет commands в главном makefile):
type commands\mem.cmd commands\misc.cmd > temp\all.cmd
m4 ..\m4\cgroups.m4 commands\groups.list > temp\all.cmd
m4 ..\m4\cload.m4 temp\all.cmd > temp\load.inc4
m4 commands.m4 temp\load.inc4 > temp\load.incq
dquotes temp\load.incq load.inc
m4 ..\m4\cbody.m4 temp\all.cmd > temp\body.inc4
m4 commands.m4 temp\body.inc4 > temp\body.incq
dquotes temp\body.incq body.inc
m4 ..\m4\cevaluate.m4 commands\groups.list > ..\..\release\core\builtin\all.de
m4 ..\m4\cbuiltin.m4 commands\mem.cmd > ..\..\release\core\builtin\mem.de
m4 ..\m4\cbuiltin.m4 commands\misc.cmd > ..\..\release\core\builtin\misc.de
Комментариев нет:
Отправить комментарий