L'applicazione su cui sto lavorando consente di incorporare sinppets di script in un documento. Per esempio:C'è un modo per mantenere i valori delle variabili quando si esegue un DWScript due volte?
SomeText
<* PrintLn("This line is generated by a script"); *>
Some other text
<* PrintLn("This line is generated by a script, too"); *>
Some more lines
Risultati
SomeText
This line is generated by a script
Some other text
This line is generated by a script, too
Some more lines
Sto usando DWScript. Internamente il primo snippet di script è compilato & eseguito. Il successivo è RecompiledInContext ed eseguito e così via. Una funzione/variabile/etc dichiarata in uno snippet diventa disponibile in tutti i frammenti successivi. Tuttavia i valori delle variabili sono persi tra i frammenti. Per esempio:
SomeText
<* var x: Integer = 5; *>
Some other text
<* PrintLn(x); *>
Some more lines
Dopo aver generato il documento:
SomeText
Some other text
0 <-- I would like this to be 5
Some more lines
Qui è un'applicazione di esempio che illustra il problema:
program POC.Variable;
{$APPTYPE CONSOLE}
{$R *.res}
uses
dwsExprs,
dwsComp,
dwsCompiler;
var
FDelphiWebScript: TDelphiWebScript;
FProgram: IdwsProgram;
FExecutionResult: IdwsProgramExecution;
begin
FDelphiWebScript := TDelphiWebScript.Create(nil);
try
FProgram := FDelphiWebScript.Compile('var x: Integer = 2;');
FProgram.Execute;
FDelphiWebScript.RecompileInContext(FProgram, 'PrintLn(x);');
FExecutionResult := FProgram.Execute;
// The next line fails, Result[1] is '0'
Assert(FExecutionResult.Result.ToString[1] = '2');
finally
FDelphiWebScript.Free;
end
end.
C'è un modo per "trasferimento" o "tenere "i valori variabili tra le esecuzioni?
Ecco un codice aggiornato di risposta di Andrea che non funziona:
begin
FDelphiWebScript := TDelphiWebScript.Create(nil);
try
FProgram := FDelphiWebScript.Compile('PrintLn("Hello");');
FExecution:= FProgram.BeginNewExecution();
FDelphiWebScript.RecompileInContext(FProgram, 'var x: Integer;');
FExecution.RunProgram(0);
WriteLn('Compile Result:');
WriteLn(FExecution.Result.ToString);
FDelphiWebScript.RecompileInContext(FProgram, 'x := 2; PrintLn(x);');
FExecution.RunProgram(0); // <-- Access violation
WriteLn('Compile Result:');
WriteLn(FExecution.Result.ToString);
FExecution.EndProgram();
ReadLn;
finally
FDelphiWebScript.Free;
end
end;
Urgh ... Lo scambio dei comandi di script interrompe l'esecuzione. Sembra che l'unico modo per far funzionare questa funzionalità sia scavare in profondità nella libreria con il debugger. Buona fortuna per te con DWSCript! :) – Andrew