//=========================================================
interface test;
create view
as select
*
from
x$files
;
//---------------------------------------------------------
screen sc
<<
>>
end;
//---------------------------------------------------------
handleEvent
cmInit:
{
var i,j : longInt;
// численным инвариантом генерируем некоторое положительное i
for (j := (i -= i) - 1; i <> j; i := j)
j += ((1 shl 12)- (j div 2));
if i < 0 then
Message('Результат отрицателен')
else
begin
// для отладки можно встроиться сюда..
// i := 9;
var type : string;
// выясняем тип, которым будет оперировать скрипт.
case i of
0 .. 255 : type := 'Byte';
256 .. 65535 : type := 'Word';
else type := 'LongInt';
end;
var source : longInt; // хендл исходного текста.
source := vaGetFreeHandle; // вообще-то, они все еще пустые.
// генерируем скрипт.
vaAddStr(source,' script Корень(i : '+Type+') : '+Type+'; ');
vaAddStr(source,' begin ');
vaAddStr(source,' result := SQRT(i); ');
vaAddStr(source,' end. ');
Message('Выводим построчно содержимое скрипта..');
var iterator : Word;
for (iterator := 1; iterator <= vaStrCount(source); iterator ++)
Message(vaGetStr(source, iterator));
Message('Конец скрипта.');
vaCompile(source);
vaFreesource(source); // подчистить за собой - хороший тон.
var extType : string;
// получаем тип, с которым оперирует первый скрипт, в строковом виде.
#declare CaseTypeElement(ElemType)
ft#ElemType: extType := '#ElemType'
#end
case vaResultType(vaGet('Корень')) of
#CaseTypeElement(Void);
#CaseTypeElement(Boolean);
#CaseTypeElement(Byte);
#CaseTypeElement(Char);
#CaseTypeElement(Word);
#CaseTypeElement(Integer);
#CaseTypeElement(longInt);
end;
var source1 : longInt;
source1 := vaGetFreeHandle;
// формируем скрипт-"обертку"
vaAddStr(source1,' Script wrapper(param : longInt) : longInt; ');
vaAddStr(source1,' begin ');
vaAddStr(source1,' var i : '+extType+'; ');
vaAddStr(source1,' i := '+extType+'(param); // вот оно, явное преобразование типа ');
vaAddStr(source1,' result := Корень(i); ');
vaAddStr(source1,' end. ');
vaCompile(source1);
vaFreesource(source1);
var callParameter : longInt;
var resultParameter : longInt;
callParameter := i;
// биндим параметр известного типа и вызываем "оберточный" скрипт.
vaBindParameter(vaGet('wrapper'), callParameter);
vaExecute(vaGet('wrapper'), resultParameter);
// получаем корень числа i
Message('Корень числа = ' + resultParameter);
end;
};
end;
end.