FPC dont have 'reference to' #2

Closed
opened 2018-05-10 09:22:38 +00:00 by Ghost · 5 comments

на что это заменить- неясно.

на что это заменить- неясно.
Owner

в целом надо проверить что по анонимным функциям в FPC еси их нет то можно писать код для обычных type Tfunc={$IFDEF Delphi}reference to{$ENDIF}function(...):...;

в целом надо проверить что по анонимным функциям в FPC еси их нет то можно писать код для обычных type Tfunc={$IFDEF Delphi}reference to{$ENDIF}function(...):...;

обычную var процедурного типа? Тогда давай ее и юзать в делфи. зачем ref to.

а как проверить "что в FPC"- посм.

обычную var процедурного типа? Тогда давай ее и юзать в делфи. зачем ref to. а как проверить "что в FPC"- посм.
Owner

ref to более гибкая
https://8vmr.livejournal.com/6114.html

ref to более гибкая https://8vmr.livejournal.com/6114.html

почитал- но не понял пример в посте...
Вот пока то что у меня RuntimeBuilder.pas

unit RuntimeBuilder;

interface

uses
  {$ifndef fpc}System.{$endif}TypInfo,
  {$ifndef fpc}System.Rtti,{$endif}
  SysUtils,
  Variants
  ;

const
  CRTBCallTypeNil=ccStdCall;
  CRTBCallTypeRegister=ccReg;
  CRTBCallTypeStdCall=ccStdCall;
  CRTBCallTypeCdecl=ccCdecl;
  CRTBCallTypePascal=ccPascal;
  CRTBCallTypeSafeCall=ccSafeCall;
  CRTBCallType64Call=CRTBCallTypeNil;
  CRTBCallTypeScript=CRTBCallTypeNil;
  CRTBCallTypeDefault=CRTBCallTypeNil;

type
  TRTBCompiler=class;

  TRTBCallType=TCallConv;

  TRTBType=PTypeInfo;

  {$ifdef fpc}
  TValue = Variant;
  TRTBArgArray = specialize TArray<TValue>;
  {$else}
  TRTBArgArray = TArray<TValue>;
  {$endif}

  TRTBFunc=class abstract
    public
      function Call(OutType:PTypeInfo;args:TRTBArgArray;CallType:TRTBCallType=CRTBCallTypeDefault):TValue;virtual;abstract;
  end;

  TRTBCallBackOut=TValue;
  TRTBCallBack=reference to function(arg:array of const):TRTBCallBackOut;

  TRTBVar=class abstract
    protected
      procedure SetVal(Val:TValue);virtual;abstract;
      function GetVal:TValue;virtual;abstract;
    public
      property Val:TValue read GetVal write SetVal;
  end;

  TRTBModule=class abstract
    protected
      function GetFuntion(Name:string):TRTBFunc;virtual;abstract;
      function GetVar(Name:string):TRTBVar;virtual;abstract;
    public
      property Funtion[Name:string]:TRTBFunc read GetFuntion;
      property &Var[Name:string]:TRTBVar read GetVar;
  end;

  TRTBSource=class abstract
    protected
      Compiler:TRTBCompiler;
      function GetText:string;virtual;abstract;
      procedure SetText(S:string);virtual;abstract;
    public
      constructor Create(Compiler:TRTBCompiler);

      procedure LoadLib(Name:string);virtual;abstract;
      procedure UnLoadLib(Name:string);virtual;abstract;

      procedure AddNameSpace(Name:string);virtual;abstract;
      procedure DelNameSpace(Name:string);virtual;abstract;

      procedure AddType(NameSpace:string;Name:string;&Type:TRTBType);virtual;abstract;//äîáàâëÿåò òèï
      procedure DelType(NameSpace:string;Name:string);virtual;abstract;

      procedure AddConst(NameSpace:string;Name:string;Val:TValue);virtual;abstract;//äîáàâëÿåò êîíñòàíòó
      procedure DelConst(NameSpace:string;Name:string);virtual;abstract;

      procedure AddVariable(NameSpace:string;Name:string;var Data);virtual;abstract;//äîáàâëÿåò ïåðåìåííóþ,èíèöèàëèçèðóÿ å¸ çíà÷åíèå
      procedure ExportVariable(NameSpace:string;Name:string;var Data);virtual;abstract;//äîáàâëÿåò ïåðåìåííóþ,ñèíõõðîíèçèðîâàííóþ ñ Data
      procedure DelVariable(NameSpace:string;Name:string);virtual;abstract;

      procedure AddCallBack(NameSpace:string;Name:string;CallBack:TRTBCallBack);virtual;abstract;//äîáàâëÿåò ôóíêöèþ/ïðîöåäóðó/ìåòîä
      procedure DelCallBack(NameSpace:string;Name:string);virtual;abstract;

      procedure &Register(NameSpace:string;Name:string;&Type:TRTBType);virtual;abstract;//ðåãèñòðèðóåò ïåðåìåííóþ îáúÿâëåííóþ â ñêðèïòå
      procedure UnRegister(NameSpace:string;Name:string);virtual;abstract;
      procedure &RegisterFunction(NameSpace:string;Name:string);virtual;abstract;//ðåãèñòðèðóåò ôóíêöèþ îáúÿâëåííóþ â ñêðèïòå
      procedure UnRegisterFunction(NameSpace:string;Name:string);virtual;abstract;

      function Compilate:TRTBModule;virtual;abstract;
      procedure LoadFromFile(&File:string);virtual;
      procedure SaveToFile(&File:string);virtual;
      property Text:string read GetText write SetText;
  end;

  TRTBCompiler=class abstract
    public
      function GenNewSrc():TRTBSource;virtual;abstract;
  end;

implementation

uses
  System.SysUtils,System.Classes;

constructor TRTBSource.Create(Compiler:TRTBCompiler);
begin
Self.Compiler:=Compiler;
end;

procedure TRTBSource.LoadFromFile(&File:string);
var
  Data:TStrings;
begin
Data:=TStringList.Create;
Data.LoadFromFile(&File);
Text:=Data.Text;
FreeAndNil(Data);
end;

procedure TRTBSource.SaveToFile(&File:string);
var
  Data:TStrings;
begin
Data:=TStringList.Create;
Data.Text:=Text;
Data.SaveToFile(&File);
FreeAndNil(Data);
end;

end.

почитал- но не понял пример в посте... Вот пока то что у меня RuntimeBuilder.pas ``` unit RuntimeBuilder; interface uses {$ifndef fpc}System.{$endif}TypInfo, {$ifndef fpc}System.Rtti,{$endif} SysUtils, Variants ; const CRTBCallTypeNil=ccStdCall; CRTBCallTypeRegister=ccReg; CRTBCallTypeStdCall=ccStdCall; CRTBCallTypeCdecl=ccCdecl; CRTBCallTypePascal=ccPascal; CRTBCallTypeSafeCall=ccSafeCall; CRTBCallType64Call=CRTBCallTypeNil; CRTBCallTypeScript=CRTBCallTypeNil; CRTBCallTypeDefault=CRTBCallTypeNil; type TRTBCompiler=class; TRTBCallType=TCallConv; TRTBType=PTypeInfo; {$ifdef fpc} TValue = Variant; TRTBArgArray = specialize TArray<TValue>; {$else} TRTBArgArray = TArray<TValue>; {$endif} TRTBFunc=class abstract public function Call(OutType:PTypeInfo;args:TRTBArgArray;CallType:TRTBCallType=CRTBCallTypeDefault):TValue;virtual;abstract; end; TRTBCallBackOut=TValue; TRTBCallBack=reference to function(arg:array of const):TRTBCallBackOut; TRTBVar=class abstract protected procedure SetVal(Val:TValue);virtual;abstract; function GetVal:TValue;virtual;abstract; public property Val:TValue read GetVal write SetVal; end; TRTBModule=class abstract protected function GetFuntion(Name:string):TRTBFunc;virtual;abstract; function GetVar(Name:string):TRTBVar;virtual;abstract; public property Funtion[Name:string]:TRTBFunc read GetFuntion; property &Var[Name:string]:TRTBVar read GetVar; end; TRTBSource=class abstract protected Compiler:TRTBCompiler; function GetText:string;virtual;abstract; procedure SetText(S:string);virtual;abstract; public constructor Create(Compiler:TRTBCompiler); procedure LoadLib(Name:string);virtual;abstract; procedure UnLoadLib(Name:string);virtual;abstract; procedure AddNameSpace(Name:string);virtual;abstract; procedure DelNameSpace(Name:string);virtual;abstract; procedure AddType(NameSpace:string;Name:string;&Type:TRTBType);virtual;abstract;//äîáàâëÿåò òèï procedure DelType(NameSpace:string;Name:string);virtual;abstract; procedure AddConst(NameSpace:string;Name:string;Val:TValue);virtual;abstract;//äîáàâëÿåò êîíñòàíòó procedure DelConst(NameSpace:string;Name:string);virtual;abstract; procedure AddVariable(NameSpace:string;Name:string;var Data);virtual;abstract;//äîáàâëÿåò ïåðåìåííóþ,èíèöèàëèçèðóÿ å¸ çíà÷åíèå procedure ExportVariable(NameSpace:string;Name:string;var Data);virtual;abstract;//äîáàâëÿåò ïåðåìåííóþ,ñèíõõðîíèçèðîâàííóþ ñ Data procedure DelVariable(NameSpace:string;Name:string);virtual;abstract; procedure AddCallBack(NameSpace:string;Name:string;CallBack:TRTBCallBack);virtual;abstract;//äîáàâëÿåò ôóíêöèþ/ïðîöåäóðó/ìåòîä procedure DelCallBack(NameSpace:string;Name:string);virtual;abstract; procedure &Register(NameSpace:string;Name:string;&Type:TRTBType);virtual;abstract;//ðåãèñòðèðóåò ïåðåìåííóþ îáúÿâëåííóþ â ñêðèïòå procedure UnRegister(NameSpace:string;Name:string);virtual;abstract; procedure &RegisterFunction(NameSpace:string;Name:string);virtual;abstract;//ðåãèñòðèðóåò ôóíêöèþ îáúÿâëåííóþ â ñêðèïòå procedure UnRegisterFunction(NameSpace:string;Name:string);virtual;abstract; function Compilate:TRTBModule;virtual;abstract; procedure LoadFromFile(&File:string);virtual; procedure SaveToFile(&File:string);virtual; property Text:string read GetText write SetText; end; TRTBCompiler=class abstract public function GenNewSrc():TRTBSource;virtual;abstract; end; implementation uses System.SysUtils,System.Classes; constructor TRTBSource.Create(Compiler:TRTBCompiler); begin Self.Compiler:=Compiler; end; procedure TRTBSource.LoadFromFile(&File:string); var Data:TStrings; begin Data:=TStringList.Create; Data.LoadFromFile(&File); Text:=Data.Text; FreeAndNil(Data); end; procedure TRTBSource.SaveToFile(&File:string); var Data:TStrings; begin Data:=TStringList.Create; Data.Text:=Text; Data.SaveToFile(&File); FreeAndNil(Data); end; end. ```
Owner

анонимная функция лучше тем, что её можно генерить в RT и сразу без имени

анонимная функция лучше тем, что её можно генерить в RT и сразу без имени
Ghost closed this issue 2018-06-11 16:52:25 +00:00
Sign in to join this conversation.
No Label
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: artem3213212/RuntimeBuilder#2
No description provided.