<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 a Endliche Zustandsmaschine , kurz FSM.Wenn Sie das Run Me-Skript ausführen, öffnet JMP ein Fenster wie dieses:

die Schaltflächen auf der rechten Seite hat, um zwischen den Zuständen zu navigieren.In dieser Anwendung ist der Raum, in dem Sie sich befinden, der Zustand, in dem sich der 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 setzen:

Ausdrucksspalten kümmern sich meistens nicht darum, welche Art von Ausdruck sich in den Zellen befindet, und es ist ihnen egal, ob jede Zelle dieselbe Art von Ausdruck hat.Der Tür Spalte ist eine Ausdrucksspalte von Matrizen, angezeigt durch die eckigen Klammern.Der onEnter Spalte ist eine Ausdrucksspalte von JSL, die das Skript ausführt, wenn ein Raum (Zustand) betreten wird.
Das lässt die Bild -Spalte, die auch eine Ausdrucksspalte ist.JMP macht eine Ausnahme für Bilder und zeigt standardmäßig das Bild und nicht den Text des Ausdrucks an.Der Text des Ausdrucks für das erste Bild sieht so aus (außer dass ... viele Zeichen sind):
Neues Bild (Char To Blob( "58016...j1EF", "base64compressed" ), "png")
Die JSL arbeitet mit den Ausdrucksspalten, um die Benutzeroberfläche dieser FSM mit 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 das 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.Jede Taste ist mit einem Gegenstand im Raum beschriftet.Das Schaltflächenskript ruft a 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 " So nehmen erhält später den eingebrannten Wert, wenn die Taste gedrückt 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 Die Funktion greift auf die Tabellenvariable zu Inventar string und zerlegt sie 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 Zimmerinhalt und das Inventar .Die Tabelle kann jederzeit mit dem aktuellen Stand der FSM gespeichert werden, da diese JSL immer die Werte aus der Tabellenvariable und der Ausdrucksspalte verwendet.
Das letzte Ding nehmen ruft an neu aufbauen () .
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 Benutzerschnittstelle des FSM mit dem internen Zustand konsistent zu machen.Die alten Inventarlisten, Inhaltslisten und Türknöpfe werden gelöscht und durch neue Listen ersetzt und das Bild aktualisiert.Alle Namen (inv, content, doors, txt, pic) werden von dem Skript gesetzt, 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 Rahmenkästchen.Das Rahmenfeld wird nicht gelöscht, aber sein Inhalt wird gelöscht und dann ersetzt.
Schließlich wird ganz rechts im Fenster, hier nicht gezeigt, durch das Skript in den Spalten onEnter und onExit gesteuert.Sie können ganz oben sehen, dass das onEnter-Skript für das Wohnzimmer eine Datentabelle mit Filmen öffnet, die Sie sich im Wohnzimmer ansehen könnten.Die unsichtbare Tabelle stellt dann eine NewDataBox zum Einfügen bereit Tischhalter Grenzkasten .onExit entfernt es, wenn Sie den Raum verlassen, sodass onEnter des nächsten Raums etwas anderes bieten kann.Die meisten Räume wählen eine geeignete Datentabelle aus.Das Badezimmer erfordert JMP PRO, um die Skripts in der Tabelle auszuführen.
Die angehängte Tabelle wird in früheren Versionen von JMP geöffnet, aber die Ausdrucksspalten sind Zeichenspalten und das Skript wird nicht korrekt ausgeführt.JMP12 wird bald erscheinen, machen Sie sich bereit!