<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Dieser Beitrag ist eine Beispielanwendung, die in JSL mit JMP 12-Ausdrucksspalten geschrieben werden kann.Weitere JMP 12-Beiträge .
An diesen Beitrag ist eine .JMP-Datei angehängt, die etwa so aussieht:

Diese Tabelle enthält eine Endliche Zustandsmaschine , kurz FSM.Wenn Sie das Run Me-Skript ausführen, öffnet JMP ein Fenster wie dieses:

Auf der rechten Seite befinden sich Schaltflächen zum Navigieren zwischen den Bundesstaaten.In dieser Anwendung entspricht der Raum, in dem Sie sich befinden, dem Zustand, in dem sich das FSM befindet.Es gibt sechs Räume, sechs Zustände und sechs Zeilen in der Tabelle.
Die Spalten Raumname Und Nachricht sind einfache alte Zeichenspalten.Inhalt ist eine Ausdrucksspalte, die JSL-Listen in geschweiften Klammern enthält.Nachdem Sie eine Spalte erstellt haben, kann der Spaltendialog den Typ auf Ausdruck festlegen:

Ausdrucksspalten kümmern sich meist nicht darum, welche Art von Ausdruck sich in den Zellen befindet, und es ist ihnen auch egal, ob jede Zelle die gleiche Art von Ausdruck hat.Der Tür Spalte ist eine Ausdrucksspalte von Matrizen, angezeigt durch die eckigen Klammern.Der onEnter Die Spalte ist eine Ausdrucksspalte von JSL, die das Skript ausführt, wenn ein Raum (Zustand) betreten wird.
Bleibt das Bild Spalte, die auch eine Ausdrucksspalte ist.Bei Bildern macht JMP eine Ausnahme und zeigt standardmäßig das Bild und nicht den Text des Ausdrucks an.Der Text des Ausdrucks für das erste Bild sieht folgendermaßen aus (außer dass ... viele Zeichen enthält):
Neues Bild (Char To Blob( "58016...j1EF", "base64compressed"), "png")
Die JSL arbeitet mit den Ausdrucksspalten, um die Benutzeroberfläche dieses FSM bei Statusänderungen zu ändern.Bei diesem FSM treten Zustandsänderungen auf, wenn Tasten gedrückt werden.
room = Num( dtx << gettablevariable( "roomRow" ) );
Die Tabellenvariable roomRow (obere linke Ecke des ersten Bildes) merkt sich, in welchem Zustand sich der FSM befindet.Das Skript verwendet dies, um den Inhalt des aktuellen Raums zu finden:
getcontents = Function( {}, {stuff = dtx:contents[room], rc = H List Box(), i}, For( i = 1, i <= N Items( stuff ), i++, rc << append( Eval( Eval Expr( Button Box( stuff, take( Expr( stuff ) ) ) ) ) ) ); rc;); dtx ist die FSM-Datentabelle, also dtx:Inhalt ist die Spalte der Listen.Die [ Zimmer ] subscript wählt die Zeile aus der Tabelle aus.Das Ziel dieser Routine besteht darin, eine horizontale Liste von Schaltflächenfeldern zu erstellen.Jeder Knopf ist mit einem Gegenstand im Raum beschriftet.Das Schaltflächenskript ruft a auf nehmen Funktion, um den Gegenstand aus dem Raum zu nehmen und hineinzulegen Inventar , eine weitere Tabellenvariable.Der Eval/EvalExpr/Expr-Code „backt“ den aktuellen Wert von „stuff“ ein " Also nehmen erhält später den eingebackenen Wert, wenn die Taste gedrückt wird und die Werte eingegeben werden Sachen Und ich wird nicht mehr verfügbar sein.
take = Function( {thing}, {stuff = Parse( dtx << gettablevariable( "inventory" ) ), pos = Contains( dtx:contents[room], thing)}, // move from room's content to inventory //Open( "$TEMP/take.mp3" ); tableholder << Bring Window To Front; dtx:contents[room] = Remove( dtx:contents[room], pos ); Insert Into( stuff, thing); dtx << settablevariable( "inventory", Char( stuff ) ); rebuild();); Der nehmen Funktion greift auf die Tabellenvariable zu Inventar string und parst ihn in eine Liste.Dann macht es ein Pos Variable mit dem zu nehmenden Gegenstand; Ding ist der Name, der oben eingebrannt wurde.Die nächsten paar Zeilen manipulieren die Inhalt des Zimmers und das Inventar .Die Tabelle kann jederzeit mit dem aktuellen Status des FSM gespeichert werden, da diese JSL immer die Werte aus der Tabellenvariablen und der Ausdrucksspalte verwendet.
Das letzte Ding nehmen ist Anruf neu erstellen() .
rebuild = Function( {}, (inv << child) << delete; inv << append( getinventory() ); (content << child) << delete; content << append( getcontents() ); (doors << child) << delete; doors << append( getdoors() ); txt << settext( dtx:message[room] ); (pic << child) << delete; pic << append( dtx:picture[room] );); Die Wiederherstellungsaufgabe besteht darin, die Benutzeroberfläche des FSM mit dem internen Status in Einklang zu bringen.Die alten Inventar-, Inhalts- und Türknopflisten werden gelöscht und durch neue Listen ersetzt, außerdem wird das Bild aktualisiert.Alle Namen (Inv, Inhalt, Türen, TXT, Bild) werden vom Skript festgelegt, das das Fenster erstellt:
New Window( "FSM", H List Box( V List Box( Text Box( "inventory:\!n click\!n to drop" ), inv = Border Box( getinventory() ) ), V List Box( txt = Text Box( dtx:message[room], < pic = Border Box( dtx:picture[room] ), H List Box( Text Box( "click to pick up:" ), content = Border Box( getcontents() ) ) ), V List Box( Text Box( "click to\!ngo through\!ndoor to..." ), doors = Border Box( getdoors() ) ), tableholder = Border Box() ));
Jede der Variablen identifiziert ein Rahmenfeld.Das Rahmenfeld wird nicht gelöscht, aber sein Inhalt wird gelöscht und dann ersetzt.
Schließlich wird der äußerste rechte Teil des Fensters, der hier nicht angezeigt wird, durch das Skript in den Spalten onEnter und onExit gesteuert.Sie können oben sehen, dass das onEnter-Skript für das Wohnzimmer eine Datentabelle mit Filmen öffnet, die Sie möglicherweise im Wohnzimmer ansehen.Die unsichtbare Tabelle stellt dann eine NewDataBox zum Einfügen bereit Tischhalter Grenzfeld .onExit entfernt es, wenn Sie den Raum verlassen, sodass der onEnter des nächsten Raums etwas anderes bieten kann.Die meisten Räume wählen eine entsprechende Datentabelle aus.Das Badezimmer erfordert JMP PRO, um die Skripte in der Tabelle auszuführen.
Die angehängte Tabelle wird in früheren Versionen von JMP geöffnet, die Ausdrucksspalten sind jedoch Zeichenspalten und das Skript wird nicht ordnungsgemäß ausgeführt.JMP12 erscheint bald, machen Sie sich bereit!