unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, PaxCompiler, PaxProgram, PaxRegister;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    arr_x, arr_y: array[1..3] of Double;
    h_norm, h_x, h_y: Integer;

    buff: array[1..4096] of Byte;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function Norm(x, y: Double): Double;
begin
  result := Sqrt(x * x + y * y);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  PaxCompiler1: TPaxCompiler;
  PaxPascalLanguage1: TPaxPascalLanguage;
  PaxProgram1: TPaxProgram;
  I: Integer;
begin
  PaxCompiler1 := TPaxCompiler.Create(nil);
  PaxPascalLanguage1 := TPaxPascalLanguage.Create(nil);
  PaxProgram1 := TPaxProgram.Create(nil);

  try
    PaxCompiler1.Reset;
    PaxCompiler1.RegisterLanguage(PaxPascalLanguage1);

    h_norm := PaxCompiler1.RegisterHeader(0, 'function Norm(x, y: Double): Double;');

    h_x := PaxCompiler1.RegisterVariable(0, 'x', _typeDOUBLE);
    h_y := PaxCompiler1.RegisterVariable(0, 'y', _typeDOUBLE);

    if PaxCompiler1.CompileExpression('Norm(x, y)', PaxProgram1) then
    begin
      PaxProgram1.SaveToBuff(buff);
      ShowMessage('Compiled expression has been created!');
    end
    else
      for I:=0 to PaxCompiler1.ErrorCount - 1 do
        ShowMessage(PaxCompiler1.ErrorMessage[I]);
  finally
    PaxCompiler1.Free;
    PaxPascalLanguage1.Free;
    PaxProgram1.Free;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  PaxProgram1: TPaxProgram;
  ResValue: Double;
  I: Integer;
begin
{$O-}
  if h_x <> 0 then
  begin
    PaxProgram1 := TPaxProgram.Create(nil);
    try
      PaxProgram1.LoadFromBuff(buff);

      PaxProgram1.SetAddress(h_norm, @norm);

      for I:=1 to 3 do
      begin
        PaxProgram1.SetAddress(h_x, @arr_x[I]);
        PaxProgram1.SetAddress(h_y, @arr_y[I]);

        PaxProgram1.Run;

        ResValue := Double(PaxProgram1.ResultPtr^);
        ShowMessage(FloatToStr(ResValue));
      end;

    finally
      PaxProgram1.Free;
    end;
  end
  else
    ShowMessage('Press the first button to create compiled script.');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  h_x := 0; h_y := 0; h_norm := 0;
  arr_x[1] := 4.2;   arr_y[1] := -5.2;
  arr_x[2] := -0.4;  arr_y[2] := 3.2;
  arr_x[3] := 2.0;   arr_y[3] := 3;
end;

end.
