Seite: 1 [2] [3] [4] [5] [6] [7] [8] [9] [10] .. [23] [24] >> |
Autor |
Mitteilung |
|
verfasst am: 25.01.2010, 10:42 · Edited by: sujin
|
Spielsatz Alliances
Registrierdatum: 14.07.2004, 14:47
Beitrge: 1185
|
Keine Ahnung, ob eval() jemandem was sagt. Ist Bestandteil vieler interpretierten Sprachen (Java, PHP, Python, Ruby) und fhrt den String, der bergeben wird, als Befehl(e) der jeweiligen Sprache aus. Das ist v.A. ntzlich fr selbstmodifizierenden Code, aber man kann damit auch eine interaktive "Shell", die Befehle der jeweiligen Sprache akzeptiert, sehr leicht umsetzen, was jedem mit Skriptfhigkeiten das debuggen/testen sehr erleichtern knnte. Wenn PascalScript also soetwas hergibt, baut es bitte ein *zu Natter schiel, der das nach dem Mergen der Skriptsprache wissen knnte* |
|
verfasst am: 25.01.2010, 21:36
|
Programmierer, allgemeines
Registrierdatum: 06.06.2004, 17:19
Beitrge: 3186
|
Was genau willst du damit machen? Ich glaube, einen entsprechenden Befehl gibt es in PascalScript nicht. Eventuell liee sich eine Funktion basteln, die einen String als Grundlage fr ein neues Skript verwendet, und dieses startet. Wre aber schon etwas arbeit - und man msste auch berlegen wie so ein Befehl arbeiten sollte, bzw. was man damit alles erreichen will. |
|
verfasst am: 26.01.2010, 13:57 · Edited by: sujin
|
Spielsatz Alliances
Registrierdatum: 14.07.2004, 14:47
Beitrge: 1185
|
Naja, PascalScript wird doch max. zu Bytecode kompiliert (wenn berhaupt) und von einem in Delphi geschriebenen Interpreter ausgefhrt, oder? Prinzipiell macht eval nichts anderes, als diesen Interpreter mit einem String zu fttern, der nicht im Sourcecode stand, sondern aus irgendwelchen Quellen zur runtime entsteht.
Stark vereinfacht: Nehmen wir eine Schleife an, die das Script ausliest, und die einzelnen Zeilen an den eigentlichen Interpreter berreicht. Stt diese Schleife auf eval(str), reicht es nicht "eval(str)" weiter, sondern nur "str".
Ich habe keine Ahnung von der Engine... aber wenn ich das hier richtig lese, ist es wohl durchaus mglich. Ich meine diesen Teil:
function TPSCE.Compile(const FileName: string): Boolean;
var
S: TStringList;
i: Integer;
begin
Result:=False;
if FileExists(FileName) then begin
S:=TStringList.Create;
S.LoadFromFile(FileName);
FScr.Script:=S;
Result:=FScr.Compile; // hier wird zur runtime kompiliert
S.Free;
if not Result then
if FScr.CompilerMessageCount > 0 then
for i:=0 to FScr.CompilerMessageCount-1 do
Writeln(FScr.CompilerErrorToStr(i));
end else Writeln('File not found: ', FileName);
end;
function TPSCE.Execute: Boolean;
begin
Result:=FScr.Execute; // und hier wird das kompilierte ausgefhrt
if not Result then
Writeln('Run-time error:' + FScr.ExecErrorToString);
end;
Das ist wohl, was du mit "String als Grundlage fr ein neues Skript" meinst? |
|
verfasst am: 27.01.2010, 01:14 · Edited by: Natter
|
Programmierer, allgemeines
Registrierdatum: 06.06.2004, 17:19
Beitrge: 3186
|
Zitat: sujin
Das ist wohl, was du mit "String als Grundlage fr ein neues Skript" meinst?
Ja, so ungefhr. Allerdings wird man trotzdem ein ordentliches Skript bentigen - also es reicht nicht, game_api_MessageBox() zu schreiben, man bruchte auch program Name etc. Auerdem wird fr normale Skripte ja zu Beginn StartMission aufgerufen. Man msste sich halt berlegen, wie man das am besten umsetzen will. Also user komplettes Skript eingeben lassen, oder Gerst automatisch erzeugen (String in StartMission einfgen), oder eine Alternative programmieren, die direkt den String an den Compiler gibt. Dann msste man aber je nach Zweck eine vllig ungewohnte Syntax verwenden, was auch nicht immer praktisch wre. Daher die Frage, wofr du das verwenden willst. Oder soll der Befehl im laufenden Skript ausgefhrt werden (also dass Skript, das den String abfragt)? Das wre wohl die schwierigste Variante. Man msste auch beachten, dass bei der Variante wohl jeder Eingabefehler das Skript beenden wrde - und somit weitere Eingaben nicht mglich wren. |
|
verfasst am: 27.01.2010, 02:26
|
Programmierer, allgemeines
Registrierdatum: 06.06.2004, 17:19
Beitrge: 3186
|
Man knnte alternativ auch berlegen, z.B. bei gesetztem DEBUG-Wert (globale Variable) ein Shortcut zu aktivieren, das im Geoscape die Stringeingabe ermglicht. |
|
verfasst am: 27.01.2010, 13:49
|
Spielsatz Alliances
Registrierdatum: 14.07.2004, 14:47
Beitrge: 1185
|
Zitat: Natter Daher die Frage, wofr du das verwenden willst.
Wie gesagt z.B. eine "Pascal-Shell" - gib "myUFO := TUFO.Create" ein, und es entsteht ein neues UFO, gib dann "myUFO.huntObject(myUFO.nearestEnemy)" ein, und das neue UFO geht aufs nchste Flugzeug los.
Zitat: Natter Oder soll der Befehl im laufenden Skript ausgefhrt werden (also dass Skript, das den String abfragt)?
Ja, das ist eigentlich Sinn der Sache. In einem seperaten Namespace ist die ganze Sache schon deutlich witzloser... Zitat: Natter Man msste auch beachten, dass bei der Variante wohl jeder Eingabefehler das Skript beenden wrde - und somit weitere Eingaben nicht mglich wren.
Selbstverstndlich. Kennt PascalScript Exceptions? Wenn nicht, dann muss es so gehen... |
|
verfasst am: 27.01.2010, 22:41 · Edited by: Natter
|
Programmierer, allgemeines
Registrierdatum: 06.06.2004, 17:19
Beitrge: 3186
|
Zitat: sujin
Ja, das ist eigentlich Sinn der Sache. In einem seperaten Namespace ist die ganze Sache schon deutlich witzloser...
Naja - wenn man mehr als eine Zeile Eingeben kann, knnte man ja auch
myUFO:=ufo_api_create_UFO;
myUFO.huntObject(myUFO.nearestEnemy)
verwenden. Imho ist die Variante eines neuen Skriptes deutlich flexibler, da man z.B. auch neue Variablen anlegen knnte (dein Beispiel wrde nmlich nur klappen, wenn man vorher in weiser vorraussicht eine entsprechende Variable angelegt htte), Events registrieren etc. Natrlich ist dafr die Eingabe etwas komplizierter. Aber man kann ja eine einfache Eingabe ermglichen, wenn man im Skript das gewnschte Grundgerst (z.B. als Konstante) automatisch erzeugt.
Zitat: sujin
Selbstverstndlich. Kennt PascalScript Exceptions? Wenn nicht, dann muss es so gehen...
Nein. Momentan wird ein Skript bei einer Exception automatisch beeendet, und erst danach der Fehler abgefangen. |
|
verfasst am: 28.01.2010, 15:53 · Edited by: sujin
|
Spielsatz Alliances
Registrierdatum: 14.07.2004, 14:47
Beitrge: 1185
|
Man muss nicht unbedingt neue Variablen anlegen. Ein Dataholder (vom Skript, das zur Eingabe auffordert, verwaltet) wrde schon reichen.
Natrlich kann man auch mit dem Erstellen neuer Skripte viel erreichen. Wenn ein ausfhren im gleichen Namespace zu aufwndig ist, dann wird die erste Variante auch ausreichen. Wre nur etwas eleganter fr einfachere Zwecke gewesen. |
|
verfasst am: 28.01.2010, 18:52
|
Programmierer, allgemeines
Registrierdatum: 06.06.2004, 17:19
Beitrge: 3186
|
Zitat: sujin Wre nur etwas eleganter fr einfachere Zwecke gewesen.
Naja, wenn ich davon berzeugt wre, dass dies die bessere Variante ist, wrde ich schon probieren, ob sich das lsen lsst. Da knnte man ja auch in der PascalScript-Newsgroup nachfragen. Momentan sehe ich aber noch nicht den wirklichen Vorteil, weil man auch mit neuen Skripten eine hnlich einfache Eingabe realisieren knnte, die Variante bei Bedarf aber deutlich flexibler einsetzbar wre. Aber vielleicht bersehe ich ja auch noch was ^^ |
|
verfasst am: 28.01.2010, 20:10
|
Spielsatz Alliances
Registrierdatum: 14.07.2004, 14:47
Beitrge: 1185
|
Wie gesagt: Hat nur bei simplen Zwecken einen Vorteil, nmlich den geringeren Aufwand. Zugriff auf die Variablen des aufrufenden Skripts kann man mit ein minimalem Mehraufwand auch regeln. Ist also eine reine Bequemlichkeitsfrage ;-) |
|
verfasst am: 10.09.2011, 15:35 · Edited by: Natter
|
Programmierer, allgemeines
Registrierdatum: 06.06.2004, 17:19
Beitrge: 3186
|
2503
program YourName;
const
Nachricht = 'Test';
Skriptstring =
'program YourName;'+#13#10
+'procedure StartMission;'+#13#10
+'begin'+#13#10
+'game_api_MessageBox('+#39+Nachricht+#39+');'
+'end;'+#13#10
+'begin'+#13#10
+'end.';
procedure StartMission;
begin
mission_api_StartScriptFromString(Skriptstring,nil);
end;
begin
MissionName := 'YourName';
MissionType := mzObjects;
end.
So, hab da mal was umgesetzt. Vielleicht kann jemand mal ein eigenstndiges Skript erstellen, welches einen Button + zustzliche Seite erstellt, in der Skripte zunchst geschrieben (und gespeichert) werden knnen, und dann nach belieben gestartet. |
|
verfasst am: 27.11.2021, 15:18
|
Registrierdatum: 29.10.2021, 14:57
Beitrge: 763
|
Cant wait to find this love, soo great! baby photography okc cant wait to find this love, soo great! |
|
verfasst am: 22.11.2023, 10:26
|
Registrierdatum: 22.11.2023, 07:10
Beitrge: 72721
|
|
|
verfasst am: 01.12.2023, 12:03
|
Registrierdatum: 22.11.2023, 07:10
Beitrge: 72721
|
|
|
verfasst am: 14.01.2024, 10:30
|
Registrierdatum: 22.11.2023, 07:10
Beitrge: 72721
|
|
|
verfasst am: 14.01.2024, 10:31
|
Registrierdatum: 22.11.2023, 07:10
Beitrge: 72721
|
|
|
verfasst am: 14.01.2024, 10:32
|
Registrierdatum: 22.11.2023, 07:10
Beitrge: 72721
|
|
|
verfasst am: 14.01.2024, 10:33
|
Registrierdatum: 22.11.2023, 07:10
Beitrge: 72721
|
|
|
verfasst am: 14.01.2024, 10:34
|
Registrierdatum: 22.11.2023, 07:10
Beitrge: 72721
|
|
|
verfasst am: 14.01.2024, 10:35
|
Registrierdatum: 22.11.2023, 07:10
Beitrge: 72721
|
|
Seite: 1 [2] [3] [4] [5] [6] [7] [8] [9] [10] .. [23] [24] >> |