Container-Klassen

Die Idee ist, dass Daten sortiert vorliegen können, aber man trotzdem leicht nach ihnen suchen können sollte.

Der Ursprung der Idee ist using, was einen Link erzeugt, so dass ein Identifier auch in einem fremden Namensraum gesucht werden soll. Dies führt dazu, dass Suchzugriffe konsistent erweitert werden müssen.

Die Idee ist nun, ein Konzept zu haben, dass man mehrere Container zusammenfügen kann (einen mit den eigenen Identifiern und einen Container, der nach verlinkten Identifiern suchen kann) und von diesen Containern zu erben. Die Container implementieren ein gleichartiges Interface: „FindIdentifier“. Die Klasse, die von beiden Containern erbt, sollte am Interface erkennen, dass diese Funktionen nicht ambivalent sind, sondern in Reihe oder auch parallel ausgeführt werden sollten, je nachdem ob die Frage EXISTS oder ALL entspricht (also das erstbeste oder alle gesucht werden).

IdentifierContainer is interface
{
  FindIdentifier is container code( id is string ) once -> Identifier ref;
};

SymbolContainer is IdentifierContainer
{
  Symbols is Array( Variables );

  FindIdentifier is code( id is string ) once -> Identifier ref
  {
    return Links.findFirst( Operator.FindIdentifier( string ) );
  };
};

UsingContainer is IdentifierContainer
{
  Links is Array( Operator ) 

  FindIdentifier is code( id is string ) once -> Identifier ref
  {
    return Links.findFirst( Operator.FindIdentifier( string ) );
  };
}

Operator is SymbolContainer, UsingContainer
{
  ...
}

once: erklärt, dass die Funktion genutzt wird um ein Ergebnis zu finden. (Once ist bereits Schlüsselwort) all oder collect: erklärt, dass alle Elemente gesucht werden sollen. (beides noch nicht als Schlüsselwort)

Ruft man nun Operator::FindIdentifier auf, so wird erst SymbolContainer durchsucht und anschließend UsingContainer. Hätten die Funkionen all/collect als Attribut, würden die Ergebnisse so entstehen, dass erst die Ergebnisse des SymbolContainers, anschließend die Ergebnisse des UsingContainers aufgelistet würden. Bei Once reicht eine Reference, Collect-Funktionen müssen einen Container-Datentyp zurückgeben, der ein Container-Interface implementiert (add).