2024-08-10-24557272

գուցէ գիտէք, որ borland֊ը որ ստեղծել էր delphi֊ն, փորձեց object pascal֊ում եղած ֆիչըրները բերել c++։ ու բորլանդի c++֊ը տարբերւում ա սովորական c++֊ից նրանով, որ ունի այսպէս կոչուած closure֊ներ, կամ անոնիմ մեթոդներ։

իրականում, եթէ գալիս ես օբերոնից՝ ոչ մի տարօրինակ բան չկայ, շատ նորմալ ֆունկցիոնալ ա։

ահա օրինակ՝

type
TNotifyEvent = procedure(Sender: TObject) of object;

TButton = class
private
FOnClick: TNotifyEvent;
public
procedure Click;
property OnClick: TNotifyEvent read FOnClick write FOnClick;
end;

procedure TButton.Click;
begin
if Assigned(FOnClick) then
FOnClick(Self);
end;

procedure MyButtonClick(Sender: TObject);
begin
WriteLn('Button clicked!');
end;

procedure SomeEntryPoint;
var
Button: TButton;
begin
Button := TButton.Create;
Button.OnClick := @MyButtonClick;
Button.Click;  // Outputs: Button clicked!
Button.Free;
end;

TNotifyEvent֊ը ֆունկցիայի, պրոցեդուրայի տիպ ա։ յետոյ այդ տիպի պրոցեդուրա ա կարելի ստեղծել։

Sender: Tobject ֊ը մեզ պէտք ա, որ իմանանք ով ա այդ event֊ը ուղարկել։ ինչի՞ ա ինքը TObject տիպի՝ որովհետեւ դա կլասսերի ծառի արմատն ա՝ ամէնը դրանից են ժառանգած, այսինքն՝ ամէնը կարելի ա դրան վերագրել։

օրինակ, կարելի ա էսպէս իմանալ թէ ով ա՝

if Sender is TButton then  // Check if the sender is a button
begin
if TButton(Sender).Name = 'Button1' then
ShowMessage('Button 1 was clicked!')
else if TButton(Sender).Name = 'Button2' then
ShowMessage('Button 2 was clicked!');
end
else
begin
ShowMessage('Something else triggered this event!');
end;

տեսէք լրիւ օբերոնի runtime check անող IS ֊ն ա։

Button(Sender).Name ֊ը թոյլ ա տալիս կարդալ էդ կոնկրէտ կոճակի անունը։ օրինակ, կարող ես կոճակի անունը դնել Button1, իսկ կարող ես օրինակ՝ processButton։

Button֊ը իրականում ցուցիչ ա յիշողութեան մի տեղի, որ դատարկ ա։

TButton.Create֊ը լցնում ա էդ տեղը, ստեղծում ա յիշողութեան մէջ դաշտերը, կլասը, ու վերադարձնում ա էդ պատրաստուած յիշողութեանը ցուցիչ։

Button.OnClick֊ին կարողանում ենք վերագրել MyButtonClick ֆունկցիայի հասցէն։

այդ OnClick֊ը pascal֊ի property ա, որը կայ իմ իմանալով միայն այլ անդրեաս հայլսբերգի լեզուի՝ c#֊ի մէջ։

դրանից յետոյ Button.Click֊ը դա ա կանչելու։

շատ օբերոնական ա, չէ՞։ (:

ո՞նց ա դա արւում borland֊ի c++ դիալեկտով՝

#include <vcl.h>
#pragma hdrstop

class TButton
{
private:
typedef void __fastcall (__closure *TNotifyEvent)(TObject *Sender);
TNotifyEvent FOnClick;
public:
void __fastcall Click()
{
if (FOnClick)
FOnClick(this);
}

void __fastcall setOnClick(TNotifyEvent value)
{
FOnClick = value;
}

TNotifyEvent __fastcall getOnClick()
{
return FOnClick;
}

__property TNotifyEvent OnClick = {read=getOnClick, write=setOnClick};
};

void __fastcall MyButtonClick(TObject *Sender)
{
ShowMessage("Button clicked!");
}

int main()
{
TButton *Button = new TButton;
Button->OnClick = MyButtonClick;
Button->Click();  // Outputs: Button clicked!
delete Button;
return 0;
}

նախ, ահագին ոչ ընթերնելի ա, ինձ թւում ա։

յետոյ, դէ մասնաւորապէս որովհետեւ fastcall֊ը նշանակում ա որ պասկալի ֆունկցիա ա կանչելու, զի ամբողջ գրադարանը (vcl֊ը կամ fmx֊ը) պասկալով ա գրուած։

closure֊ը borland֊ի լուծումն ա որ մեթոդ փոյնթերն իմանայ this֊ի մասին։ ոնց pascal֊ում ա հնարաւոր։

property֊ով են փորձում դէ property իրականացնել։

հետաքրքիր ա, որ qt֊ն էլ ստանդարտ c++ չի՝ իրենք փաստացի նոր լեզու են ստեղծել, ու իրենց մօտ կայ moc (meta object compiler) որը յետոյ բերում ա qt֊ի կոդը ստանդարտ c++֊ի։ ու իրենք ունեն ինչ֊որ slot֊եր ու signal֊ներ որ էլի էմուլացնում են նոյն բանը՝ property֊ներ ու event֊ներ։

gtk֊ում ստանդարտ c ա, ու դա աւելի ա դուրս գալիս։

ի դէպ՝

https://norayr.am/weblog/2021/04/18/2492083/ — այն մասին ա որ embarcadero֊ն այլեւս չի կարողանում իր c++ քոմփայլերը շարունակել, զի c++ ստանդարտն էնքան արագ ա շարժւում, որ չեն ձգում։ ու հիմա փաստացի մէյնթէյն են անում llvm֊ի փաթչեր։ llvm֊ի արտօնագիրն էլ թոյլ ա տալիս որ դա անեն։ աւաղ։ (:

https://norayr.am/weblog/2021/04/19/2530704/

#ծրագրաւորում #ծրագրաւորման_լեզուներ #տէք #պասկալ #օբերոն #pascal #oberon

բնօրինակ ծմակուտում(եւ մեկնաբանութիւննե՞ր)

պիտակներ՝ ֊ի  include  pragma  ծրագրաւորում  ծրագրաւորման_լեզուներ  տէք  պասկալ  օբերոն  pascal  oberon