Подскажите пжст, есть где нибудь хорошая реализация макросов на fpc?
Имеется ввиду что то типа Лазарусной подстановки в путях вместо шаблонов вида $(LazarusDir) фактических значений
Утянул бы лазарусную, но смущает зависимость от иде
Реализация макросов
Модератор: Модераторы
- Ichthyander
- энтузиаст
- Сообщения: 701
- Зарегистрирован: 04.04.2007 08:32:43
- Откуда: Астрахань
- Контактная информация:
Может имелся ввиду шаблонизатор? https://wiki.lazarus.freepascal.org/Template_Engines
Имею ввиду вот это:
результат выполнения
Для компиляции в зависимостях проекта должны быть IDEIntf и CodeTools, в путях поиска $(LazarusDir)\ide
Нужен именно вызов процедур для замены, а не просто замена текста на текст и тонкая настройка оформления шаблонов чтоб можно было и $(YourOwn) и %YourOwn% сделать, также очень желательна шаблонизация для передачи параметров в процедуры замены чтоб именно конкретный тип, а не безликий const Data: PtrInt
Код: Выделить всё
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
- Ichthyander
- энтузиаст
- Сообщения: 701
- Зарегистрирован: 04.04.2007 08:32:43
- Откуда: Астрахань
- Контактная информация:
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+} С параметрами можно вот так:
Код: Выделить всё
${+list
[-entity=<td>$entity</td>-]
[-header=<table>-]
[-footer=</table>-]
+}
Где header, к примеру, имя параметра, а '<table>', его значение, которое передается внутрь вызова метода. Само собой суффиксы всякие, символы для изоляции настраиваются. ATag здесь 'list'.
Это все-таки не полноценный парсер вроде TGoldenParser, но именно как шаблонизаторы, причем с достаточно полноценным функционалом годится
