Inhaltsverzeichnis

Strings formatieren

Aus Python:

STRING = "This is %(foo)s, and this is also %(foo)s"
print STRING % {"foo": "BAR"}
STRING = "This is %(0)s, and this is also %(0)s"
print STRING % "BAR"
STRING = "%s %s"
print STRING % ("Hello", "World")
STRING = "%s %s"
print STRING % ("Hello", "World")

Umwandlung von Datentypen

„%d“ % 5 geht in Genesys entsprechend nicht, da es nicht typsicher wäre. Man könnte nun eine Argumentliste/Struktur verlangen, das wäre hier entsprechend ein Teil einer Signatur: (int). Die kann man nicht erwarten, weil der String das vorgibt, sondern nur, weil es sich um den % Operator handelt, der eben eine Struktur(beschreibung) erwartet.

%d sagt dann aus, dass ein Element als Dezimalzahl ausgegeben werden soll - was immer da kommt. Hier kommt ein (int 5). Dies wird in den Konstruktor für int() geworfen, was funktioniert.

Point contains
  x, y is double;

Point p;
p.x : 1.;
p.y : 2.;

print "%f/%f" % p;

Modulo bekommt die Reflection-Struktur für Point, was zum einen erklärt, dass die Struktur zur Laufzeit auslesbar bleiben sein muss. Anschließend wird erst das erste Element (x) nach double konvertiert, dann das zweite Element (y) nach Double konvertiert. Wird in Klammern kein Argument angegeben, wird einfach von vorne nach Hinten druchgegangen.

Sofern der Format-String konstant ist, kann das optimiert werden.

Entsprechend.

Point contains
  x, y is double;

Point p;
p.x : 1.;
p.y : 2.;

print "%(x)f/%(y)f" % p;

PS: Eher mit Einbau von Variablen versuchen… „$(p.x)/$(p.y)“

Ich könnte mir hier allerdings auch vorstellen, dass mit Multiplikation gearbeitet wird:

print "%(x)/%(y)" * p;

Was immer da ausgegeben wird, wird mit opertator $ zu einem String verwurstet.

Einbau von Variablen

Wenn ein String eingelesen wird, sollten $-Zeichen mitinterpretiert werden, so dass

  hello : "Hallo";
  world : "Welt";
 
  bla : "$(hello) $(world)";

interpretiert wird wie

hello$ + " " + world$
 

und entsprechend

"Hallo Welt"

erzeugt.

Die Variablen werden zur Compilerlaufzeit überprüft, das heißt, sie müssen existieren und ihr Datentyp muss über eine Implementation von operator $ verfügen. Wird das $ „ausescaped“, so werden die Klammern nicht berücksichtigt.

"\$(hello) \$world"

wird zu

"$(hello) $(world)"

Wird der Formatstring über eine Variable reingereicht, so muss er leider interpretiert werden.