Реализация макросов

Вопросы использования сторонних (не входящих в состав FPC и Lazarus) утилит и библиотек.

Модератор: Модераторы

Реализация макросов

Сообщение zub » 09.02.2020 23:38:04

Подскажите пжст, есть где нибудь хорошая реализация макросов на fpc?
Имеется ввиду что то типа Лазарусной подстановки в путях вместо шаблонов вида $(LazarusDir) фактических значений
Утянул бы лазарусную, но смущает зависимость от иде
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

Re: Реализация макросов

Сообщение Ichthyander » 10.02.2020 01:01:06

Может имелся ввиду шаблонизатор? https://wiki.lazarus.freepascal.org/Template_Engines
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 668
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: Реализация макросов

Сообщение zub » 10.02.2020 15:03:01

Имею ввиду вот это:
Код: Выделить всё
program Project1;
uses
  MacroIntf,TransferMacros,MacroDefIntf;//From lazarus ide
type
  TMacroMethods=class
    function MacroFuncCurrentCPU  (const {%H-}Param: string; const Data: PtrInt;
                                     var {%H-}Abort: boolean): string;
    function MacroFuncCurrentOS   (const {%H-}Param: string; const Data: PtrInt;
                                     var {%H-}Abort: boolean): string;
    function MacroFuncYourOwnMacro(const {%H-}Param: string; const Data: PtrInt;
                                     var {%H-}Abort: boolean): string;
  end;
function TMacroMethods.MacroFuncCurrentCPU(const Param: string;
  const Data: PtrInt; var Abort: boolean): string;
begin
  Result:={$I %FPCTARGETCPU%};
end;
function TMacroMethods.MacroFuncCurrentOS(const Param: string;
  const Data: PtrInt; var Abort: boolean): string;
begin
  Result:={$I %FPCTARGETOS%};
end;
function TMacroMethods.MacroFuncYourOwnMacro(const Param: string;
  const Data: PtrInt; var Abort: boolean): string;
begin
  Result:='hehe!!!';
end;
var
  DefaultMacroMethods:TMacroMethods;
  S:string;
begin
  GlobalMacroList:=TTransferMacroList.Create;
  GlobalMacroList.Add(TTransferMacro.Create('CPU','',
                      'CPU',@DefaultMacroMethods.MacroFuncCurrentCPU,[]));
  GlobalMacroList.Add(TTransferMacro.Create('OS','',
                      'OS',@DefaultMacroMethods.MacroFuncCurrentOS,[]));
  GlobalMacroList.Add(TTransferMacro.Create('YourOwn','',
                      'YourOwn',@DefaultMacroMethods.MacroFuncYourOwnMacro,[]));
  s:='It was on $(CPU) under $(OS). $(YourOwn)';
  writeln(s);
  GlobalMacroList.SubstituteStr(s);
  writeln(s);
  readln;
end.

результат выполнения
Код: Выделить всё
It was on $(CPU) under $(OS). $(YourOwn)
It was on i386 under Win32. hehe!!!

Для компиляции в зависимостях проекта должны быть IDEIntf и CodeTools, в путях поиска $(LazarusDir)\ide

Нужен именно вызов процедур для замены, а не просто замена текста на текст и тонкая настройка оформления шаблонов чтоб можно было и $(YourOwn) и %YourOwn% сделать, также очень желательна шаблонизация для передачи параметров в процедуры замены чтоб именно конкретный тип, а не безликий const Data: PtrInt
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

Re: Реализация макросов

Сообщение Ichthyander » 10.02.2020 16:15:34

zub писал(а):Нужен именно вызов процедур для замены, а не просто замена текста на текст и тонкая настройка оформления шаблонов чтоб можно было и $(YourOwn) и %YourOwn% сделать, также очень желательна шаблонизация для передачи параметров в процедуры замены чтоб именно конкретный тип, а не безликий const Data: PtrInt

Посмотрите реализации шаблонизаторов FPTemplate и QTemplate (event-driven template engine with parameters). К примеру, для QTemplate прописываем метод
Код: Выделить всё
QTemplate['mod']:=@QTemplateMod;

Код: Выделить всё
function QTemplateMod(const ATag: String; AParams: TStringList
  ): String;
begin
... ...
  Result:='this text will be inserted instead the tag ${+mod...+}. You can use ATag and Params'; // ATag - это метка по которому была вызвана эта процедура, AParams - это параметры вызова этой процедуры из шаблона
... ...
end;

В самом тексте шаблона могло быть так:
Код: Выделить всё
${+mod+}   
Без параметров. При вызове процедуры ATag будет равен 'mod'.
С параметрами можно вот так:
Код: Выделить всё
${+list
[-entity=<td>$entity</td>-]
[-header=<table>-]
[-footer=</table>-]
+}

Где header, к примеру, имя параметра, а '<table>', его значение, которое передается внутрь вызова метода. Само собой суффиксы всякие, символы для изоляции настраиваются. ATag здесь 'list'.
Это все-таки не полноценный парсер вроде TGoldenParser, но именно как шаблонизаторы, причем с достаточно полноценным функционалом годится
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 668
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань


Вернуться в Сторонние средства

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

Рейтинг@Mail.ru