Einzelnen Beitrag anzeigen

Benutzerbild von littleDave
littleDave

Registriert seit: 27. Apr 2006
Ort: München
556 Beiträge
 
Delphi 7 Professional
 
#80

Re: Sysygy Script Engine - Version 0.99h

  Alt 1. Sep 2009, 20:27
Hallo,

ich meld mich mal wieder *g*. In meinem letzten Post (der ja doch schon 2,5 Monate her ist ), hab ich ja angekündigt, dass ich versuche in 2 Monaten was auf die Beine zu stellen. Leider hab ich das Zeitlimit nicht geschafft, da ich mit diesem Post noch keine Version veröffentlichen will.

Aber ich hab mir gedacht - machste mal nen Status-Update - und diesmal ist es wirklich ein gewaltiger Schritt, den ich geschafft habe, denn

.... *trommelwirbel* ...

ich habe es endlich geschafft, dass meine Script-Sprache objekt-orientiertes Arbeiten möglich macht. Im Klartext heißt das, dass man jetzt im Script eigene Klassen erstellen kann (natürlich mit Variablen, Properties, Methoden, Constructor, Destructor, ...) und diese dann im Script verwenden. Dabei unterstützten die Klassen sogar Vererbung (also Zugriff auf Public/Protected-Properties/Methoden von Eltern-Klassen, Methoden überschreiben, usw.).

Am besten ich zeig euch mal ein kleines Script:

Delphi-Quellcode:
program Project1;

type
  TTest1 = class(TObject)
  private
    FABC : integer;
  public
    constructor Create; override;
    procedure Test1; virtual;
    
    property ABC : integer read FABC;
  end;
  
  TTest2 = class(TTest1)
  public
    constructor Create; override;
    procedure Test1; override;
  end;
  
  TTest3 = class(TTest2)
  public
    procedure Test1; override;
  end;

{ TTest1 }
  
constructor TTest1.Create;
begin
  inherited;
  Self.FABC := 1024;
  Console.WriteLine('TTest1.Create');
end;

procedure TTest1.Test1;
begin
  Console.WriteLine('TTest1.Test1');
end;

{ TTest2 }

constructor TTest2.Create;
begin
  inherited;
  Console.WriteLine('TTest2.Create');
end;

procedure TTest2.Test1;
begin
  inherited;
  Console.WriteLine('TTest2.Test1');
end;

{ TTest3 }
     
procedure TTest3.Test1;
begin
  inherited;
  Self.FABC := 512; // nur sichtbar, da in gleicher Unit
  Console.WriteLine('TTest3.Test1');
end;

{ Main }

var p: TTest1; // Der Basistyp
begin
  p := TTest3.Create; // eine abgeleitete Variante davon
  try
    Console.WriteLine(p.ABC);
    p.Test1;
    Console.WriteLine(p.ABC);
  finally
    p.Free;
  end;
end.
Wenn ich dieses Script ausführe, bekomme ich folgende Ausgabe in der Konsole:
Code:
TTest1.Create
TTest2.Create
1024
TTest1.Test1
TTest2.Test1
TTest3.Test1
512
Das ist jetzt schon etwas schwerer zu lesen, aber wenn man mal mit dem Finger den Ablauf so langgeht, dann kann man das schon ganz gut nachvollziehen.

Die Script-Klassen kann ich auch aus dem Programm heraus erstellen und die Vererbung nutzen. Hier mal ein wenig Pseudo-Code (Pseudo-Code, da die einzelnen Methoden noch ein paar andere Paremter haben, die hierfür erstmal nur stören würden)
Delphi-Quellcode:
var aClass : Pointer;
    aObject : Pointer;
    method : Pointer;

begin
  // erstmal die Klasse suchen, die erstellt werden soll
  aClass := FRunTime.CodeAccess.FindClass('TTest3');
  // dann eine "Instanz" der Klasse erzeugen
  aObject := FRunTime.CreateClass(aClass);
  // dann noch die Basis-Methode suchen
  method := FRunTime.CodeAccess.FindMethod('TTest1.Test');
  // und dann die Methode mit "aObject" als Self-Parameter aufrufen
  FRunTime.Call(method, [aObject]);

  // -> jetzt wird im Script nicht die Funktion TTest1.Test ausgeführt, sondern
  // jetzt wird die Funktion "TTest3.Test" ausgeführt.
end;
Das ganze funktioniert schon sehr gut - jedoch muss ich den Compiler noch viel strenger machen. Zudem muss ich noch den Befehl "reintroduce" einbauen sowie den "inherited" - Befehl erweitern. Außerdem warten noch ein paar Bugs darauf, gelöscht zu werden.

Ich hoffe, dass ein paar Leute eine object-orientierte Script-Sprache brauchen könnten - ich brauch sie auf jeden fall

Grüße
Jabber: littleDave@jabber.org
in case of 1 is 0 do external raise while in public class of object array else repeat until 1 is 0
  Mit Zitat antworten Zitat