Bei diesem Kapitel geht es nun um die grundlegende Funktion der Perchance-Engine. Also warum die Generatoren funktionieren, wie sie funktionieren und wie du das ebenso bewerkstelligen kannst. So manches mag am Anfang etwas verwirrend klingen, doch ich versuche alles nachvollziehbar zu erklären und zu verdeutlichen.
Wichtig: Das funktioniert nur in der englischen Benutzung von Perchance!
Lass uns mit einem einfachen Beispiel starten.
output
[sentence]
flower
rose
lily
tulip
sentence
Oh you've got me a [flower]! Thank you, I love [flower.pluralForm].
Wir haben ja bereits die Perchance-Eigenschaften kennengerlernt, damit wir wissen was der Zusatz „.pluralForm“ bewirkt. Du kannst das bei Bedarf [hier] nochmals einsehen. Das offensichtlichste Problem bei dem Code oben ist nun, dass die Einzelform der Blume eine ganz andere Art von Blume ist, die bei der Mehrzahl angezeigt wird. Der Satz ergibt also nicht so viel Sinn, oder?
Lass uns das also korrigieren:
output
[sentence]
flower
rose
lily
tulip
sentence
Oh you've got me a [f = flower.selectOne]! Thank you, I love [f.pluralForm].
Was wir hier nun tun, ist, ein Element aus der Liste [flower] auszuwählen (z. B. „Tulpe“ oder „Rose“ oder „Lilie“) und es in die Variable „f“ zu setzen. Eine Variable ist wie eine temporäre Schublade. Wenn man ein Objekt, z.B. „Tulpe“ hinlegt, dann bleibt dieses Objekt in der Schublade, bis es entfernt oder gegen ein anderes Objekt, z.B. „Rose“ ausgetauscht wird. Du kannst die Variable benennen, wie du willst. In diesem Fall eben „f“.
Das wird übrigens durch das Gleichheitszeichen in eckigen Klammern erreicht. Es ermöglicht dir, „Dinge“ unter einer eindeutigen Kennung zu „speichern“.
[f = flower.selectOne]
Was wir hier nun tun, ist, ein Element aus der Liste [flower] auszuwählen (z. B. „Tulpe“ oder „Rose“ oder „Lilie“) und es in die Variable „f“ zu setzen. Eine Variable ist wie eine temporäre Schublade. Wenn man ein Objekt, z.B. „Tulpe“ hinlegt, dann bleibt dieses Objekt in der Schublade, bis es entfernt oder gegen ein anderes Objekt, z.B. „Rose“ ausgetauscht wird. Du kannst die Variable benennen, wie du willst. In diesem Fall eben „f“.
Das wird übrigens durch das Gleichheitszeichen in eckigen Klammern erreicht. Es ermöglicht dir, „Dinge“ unter einer eindeutigen Kennung zu „speichern“.
Wichtig: Die Schublade, also die Variable kann jeden Namen haben, solange dieser nur aus Buchstaben und Zahlen besteht. Sonderzeichen oder Leerzeichen sind nicht erlaubt.
Wcihtig: Beachte, dass das Beispiel oben einer Liste zugrunde liegt wie [flower] mit den Inhalten „Rose“, „Tulpe“ oder „Lilie“. Diese Inhalrte kannst du nun mit zufälligen Farbwerten ergänzen, wie [rot|pink}. Durch die Angabe der Farbe, wird der Satz greifbarer, anstatt einfach nur „Rose“.
Ursprüngliche flower-Liste
flower
rose
lily
tulip
Verbesserte flower-Liste
flower
{red|pink} rose
lily
{yellow|blue} tulip
Wenn du also so eine Liste aufgebaut hast, dann lautet der Code
f = flower.selectOne.evaluateItem
oder kürzer
f = flower.evaluateItem
evaluateItem führt im Hintergrund immer selectOne aus, deshalb kann man es auch weglassen.
evaluateItem wird verwendet, weil es dafür sorgt, dass eventuell definierte Teile vor einem Objekt, wie {rot|rosa}, vor dem Output gewählt und aufgelöst werden. Das bedeutet, es wird z. B. konkret rosa Rose oder rot Rose in der Variablen f gespeichert, anstatt der ursprünglichen, nicht aufgelösten Struktur {rot|rosa} Rose. Klingt kompliziert, oder?
Brechen wir es nochmal runter
Die Liste [flower] wird definiert.
output
[sentence]
flower
rose
lily
tulip
sentence
Oh you've got me a [f = flower]! Thank you, I love [f.pluralForm].
Allerdings führt das zu Problemen, weil f = flower nicht dazu führt, das ein Objekt definiert wird. Wir müssen also schreiben:
output
[sentence]
flower
rose
lily
tulip
sentence
Oh you've got me a [f = flower.selectOne]! Thank you, I love [f.pluralForm].
Dadurch wird in der Variable f vor dem output ein zufälliger Wert aus der Liste [flowers] bestimmt und in weiterer Folge durch [f.pluralForm] korrekt weiderholt und in der Mehrzahl ausgegeben.
Du fragst dich vielleicht, warum wir nicht einfach [f=flower] schreiben können. Das liegt daran, dass f dann ein Verweis auf die eigentliche Liste namens „flower“ wäre, anstatt auf ein zufällig ausgewähltes Element von [flower]. Denke einfach daran: Wir möchten ein Element der Liste speichern, nicht die Liste selbst. Wenn du tatsächlich [f=flower] schreiben würdest, wäre [f] nur ein Alias (ein anderer Name für) [flower], und daher würde [f] jedes Mal eine neue zufällige Blume zurückgeben (das kann praktisch sein, wenn du einen Listennamen abkürzen möchtest, den du häufig verwenden).
Möchtest du nun auch noch eine variable Liste in den Listenwerten selbst verankern, z.B. die Farbe der Blumen, dann ändert sich der Code auf:
output
[sentence]
flower
{red|pink} rose
lily
{yellow|blue} tulip
sentence
Oh you've got me a [f = flower.selectOne]! Thank you, I love [f.pluralForm].
Allerdings wird nun nur die Art der Blume korrekt an die zweite Ausgabe wiedergegeben. Die Farbe kann nach wie vor unterschiedlich sein, weil [f = flower.selectOne] nicht korrekte Zuordnung der Farbe vor der Ausgabe berücksichtigt. Der Code ist also zu ändern auf:
output
[sentence]
flower
{red|pink} rose
lily
{yellow|blue} tulip
sentence
Oh you've got me a [f = flower.selectOne.evaluateItem]! Thank you, I love [f.pluralForm].
Wobei [f = flower.selectOne.evaluateItem] auch durch [f = flower.evaluateItem] abgekürzt werden kann, weil .selectOne bei .evaluateItem automatisch im Hintergrund ausgeführt wird. Wir müssen .evaluateItem verwenden, weil wir etwas wie eine „rosa Rose“ in der Variable f speichern möchten und kein „nicht bewertetes“ Element wie eine {rote|rosa} Rose. Daher stellen wir mit .evaluateItem sicher, dass wir alle zufälligen Teile wie {rot|rosa} „bewerten“, bevor wir das ausgewählte Element in f speichern.
Hier ist ein weiteres Beispiel:
output
[sentence]
name
Addison
Alex
Alexis
lastName
Smith
Johnson
Williams
sentence
Her name was [n = name.selectOne]. [n.titleCase] [lastName.titleCase], if I recall correctly.
Es werden zuerst zwei Listen erstellt, eine mit [name] und eine mit [lastname]. Diese werden dann in sentence aufgerufen. Zuest wird die Variable n definiert und ein Wert aus der Liste selektiert und zugewiesen
[n = name.selectOne]
Danach können wir die Variable n nochmals verwenden und mit einem beliebigen Nachnamen kombinieren.
[n.titleCase] [lastName.titleCase]
Du kannst diese definierte Variable dann beliebig oft verwenden:
sentence
Her name was [n = name.selectOne]. [n.titleCase] [lastName.titleCase], if I recall correctly. Yes, ist [n.titleCase].
Du kannst eine Variable auch jederzeit ändern und einen neuen Wert zuweisen:
output
[sentence]
name
Addison
Alex
Alexis
Tom
Susanne
lastName
Smith
Johnson
Williams
sentence
I think her name was [n = name.selectOne.titleCase]? [n] [l = lastName.titleCase]? Wait, no, it was [n = name.selectOne]. Yeah, that's right, [n] [l].
Achtung: Rechteckige Klammern sollten nicht nochmals in rechteckigen Klammern verwendet werden:
- Das ist richtig:
[n = name.selectOne]
- Das ist falsch:
[n = [name].selectOne]
Beides ist eigentlich „funktionierender“ Perchance-Code, aber letzterer tut nicht das, was du beabsichtigst, da eckige Klammern eine andere Bedeutung haben, wenn sie innerhalb anderer eckiger Klammern verwendet werden. Dazu kommen wir noch. Denke also vorerst einfach daran: Wenn du dich innerhalb von eckigen Klammern befindesz, beziehst du dich direkt auf Listennamen – schließe sie nicht in eckige Klammern ein.