program pascalscriptdemo;
uses uPSCompiler, uPSUtils, uPSComponent;
type
tx = class
ps: TPSScript;
constructor Create;
procedure Free;
procedure oncompile(Sender: TPSScript);
procedure onexecute(Sender: TPSScript);
procedure eval(expr: string);
end;
var
myvar: integer;
procedure myprint(s: string);
begin
writeln('print = ', s);
end;
procedure myprintint(i: integer);
begin
writeln('printint = ', i);
end;
procedure myeval(b: boolean);
begin
writeln(b);
end;
constructor tx.Create;
begin
ps := TPSScript.Create(nil);
ps.OnCompile := @oncompile;
ps.OnExecute := @onexecute;
end;
procedure tx.Free;
begin
ps.Free;
end;
procedure tx.oncompile(Sender: TPSScript);
begin
Sender.AddFunction(@myeval, 'procedure eval(b: boolean);');
Sender.AddFunction(@myprint, 'procedure print(s: string);');
Sender.AddFunction(@myprintint, 'procedure printint(i: integer);');
Sender.AddRegisteredPTRVariable('myvar', 'Longint')
end;
procedure tx.onexecute(Sender: TPSScript);
begin
Sender.SetPointerToData('myvar', @myvar, ps.FindBaseType(bts32));
end;
procedure tx.eval(expr: string);
begin
write(expr:30, ' = ');
ps.Script.Text := 'begin eval('+expr+'); end.';
if not ps.Compile then
writeln('compile failed')
else if not ps.Execute then
writeln('execute failed');
end;
var
x: tx;
begin
x := tx.Create;
// evals
x.eval('1 = 1');
x.eval('''test'' = ''test''');
x.eval('2 in [1, 2, 3]');
x.eval('2 in [1, 3]');
x.eval('2 in [1..3]');
x.eval('10 in [1..100]');
x.eval('3 in [1, 2, 4..10]');
writeln;
// read "myvar" from pascalscript
x.ps.Script.Text := 'begin myvar := 1337; end.';
if not x.ps.Compile then begin
writeln('compile failed');
readln; exit;
end;
if not x.ps.Execute then begin
writeln('execute failed');
readln; exit;
end;
// write it out
writeln('myvar = ', myvar);
// change it
myvar := 1234;
// print it with pascalscript, its just a pointer so value is the same here and in PS
x.ps.Script.Text := 'begin printint(myvar) end.';
x.ps.Compile;
x.ps.Execute;
writeln;
x.Free;
writeln('end of demo');
readln;
end.