Was macht der Klassen-Lader?

Der Klassen-Lader ist ein Utility, das prüft, welche Klassen auf der Platte verändert wurden, und diese dann einliest und übersetzt. Er macht die Lade-Skripte und forward-Deklarationen des alten Systems überflüssig.

Der Klassen-Lader ist erreichbar als tycoon.tl.loader.

Wie benutze ich den Klassen-Lader?

  1. Vorraussetzung ist, dass in jeder *.tc - Datei genau eine Klasse liegt. Am besten läuft's, wenn der Klassenname mit dem Dateinamen übereinstimmt. Für nützliche emacs-Makros, um Metaklassen in eigene Files zu schneiden, frag am besten awienber.
  2. Teile dem Klassen-Lader mit, in welchen Files Deine Klassen zu finden sind. Dies geschieht entweder direkt durch
          tycoon.tl.loader.registerClassFile("Foo", "MeinPaket/Foo.tc");
    
    oder etwas bequemer mit
          tycoon.tl.loader.registerFile("MeinPaket/Foo.tc");
    
    (dann wird angenommen, die Klasse hätte den Namen der Datei). Am einfachsten ist es, alle Dateien der Form *.tc einzulesen, dies geschieht mit
          tycoon.tl.loader.registerDirectory("MeinPaket");
    
    Der Lader gibt ein Meldung "Building Foo" für jede bis dato unbekannte Klasse aus. Für Klassen, die vorher unter einem anderen Dateinamen bekannt waren, wird eine Warnung mit altem und neuem Pfad ausgegeben.

    Der Klassen-Lader interpretiert alle Dateinamen relativ zum ersten passenden Element der Environment-Variable TL2_PATH. Bei einem Wert von .:/local/teamware/tycoon2/hox/src/TL2 heißt der tatsächlich verwendete Pfad dann ./MeinPaket/Foo.tc, oder /local/teamware/tycoon2/hox/src/TL2/MeinPaket/Foo.tc, falls die erste Datei nicht existiert.

    Durch "registerDirectory" werden die DO load-Skripte des alten Systems überflüssig. Achte darauf, dass auch die Wurzelklasse Deines Pakets als einzelnes File existieren muss ("MeinPaket/MeinPaket.tc"). Initialisierungen der Singletons etc. müssen wie vorher explizit durchgeführt werden. Am besten schreibt man sie in ein Skript, das dann mit

         DO load "MeinPaket/Init.tyc";
    
    ausgeführt wird. Dieses Skript sollte KEINE Klassendefinitionen enthalten.

    Werden später Dateien gelöscht, beschwert sich der Klassen-Lader, wenn er die zugehörige Klasse überprüft. Um die Überprüfung einer Klasse auszuschalten, ruft man

         tycoon.tl.loader.unregisterClass("Foo");
    
    auf. Da Klassen nicht gelöscht werden können, überschreibt man eine nicht mehr benötigte Klasse am besten, indem man eine leere Definition, also
         class Foo metaclass AbstractClass;
    
    eingibt. Dies ist z.B. für die Typüberprüfung wichtig. Zum einen treten dann keine Fehler mehr in dieser Klasse auf und zum anderen treten mit großer Wahrscheinlichkeit Fehler auf, wenn diese Klasse noch irgendwo benutzt wird.

  3. Starte den Lader. Dies geschieht mit
         tycoon.tl.loader.update;
    
    Nun werden erst (3a) alle veränderten Klassen eingeparset, es wird geprüft, ob alle benötigten Klassen bekannt sind (3b), und schliesslich werden die Klassen in geschickter Reihenfolge übersetzt (3c). Tritt dabei ein Fehler auf, bricht die Bearbeitung ab. Bereits geparsete Klassen gehen nicht verloren, beim nächsten Aufruf von tycoon.tl.update geht es einfach weiter wie vorher.

    Wie sehen die einzelnen Schritte aus?

    1. Für jede eingelesene Quelldatei wird der Pfad ausgegeben.
          [../TWL/MeinPaket/Foo.tc...
          ]
      
    2. Ausgabe
          [Checking for unknown class names...]
      evtl. einige Fehlermeldungen.

    3. Der Lader bemüht sich, Klassen erst zu übersetzen, wenn ihre Metaklassen und Vorfahrenklassen schon übersetzt sind. Daher beschwert er sich über die rekursive Wurzel des Klassengraphen:
          Circular relationship in Class MetaClass
          ...
          Circular relationship in Class Class
          ...
      
      Dann beginnen die eigentlichen Übersetzungen:
          [Building Foo
          recomputing cpl in class BlibBlurb
          ...
          ]
      plus eventuelle Fehlermeldungen.

Tycoon-2 Administrator / 07.07.97