<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Questo post è un'applicazione di esempio che può essere scritta in JSL con colonne di espressione JMP 12.Altri post JMP 12 .
C'è un file .JMP allegato a questo post che assomiglia a questo:

Questa tabella contiene a Macchina a stati finiti , FSM in breve.Se esegui lo script Run Me, JMP apre una finestra come questa:

che ha i pulsanti sulla destra per navigare tra gli stati.In questa applicazione, la stanza in cui ti trovi è lo stato in cui si trova l'FSM.Ci sono sei stanze, sei stati e sei righe nella tabella.
Le colonne nome della stanza E Messaggio sono semplici colonne di caratteri vecchi.Contenuti è una colonna Espressione contenente elenchi JSL tra parentesi graffe.Dopo aver creato una colonna, la finestra di dialogo della colonna può impostare il tipo su espressione:

Le colonne di espressione per lo più non si preoccupano del tipo di espressione presente nelle celle e non si preoccupano se ogni cella ha lo stesso tipo di espressione.IL Porta colonna è una colonna di espressione di matrici, indicata dalle parentesi quadre.IL suInvio colonna è una colonna di espressione di JSL che lo script eseguirà quando viene inserita una stanza (stato).
Questo lascia il immagine colonna, che è anche una colonna di espressione.JMP fa un'eccezione per le immagini, visualizzando l'immagine per impostazione predefinita, anziché il testo dell'espressione.Il testo dell'espressione per la prima immagine è simile a questo (tranne il ... è un sacco di caratteri):
Nuova immagine (Char To Blob ("58016...j1EF", "base64compressed" ), "png")
Il JSL funziona con le colonne di espressione per modificare l'interfaccia utente di questo FSM con i cambiamenti di stato.Per questo FSM, i cambiamenti di stato avvengono quando vengono premuti i pulsanti.
room = Num( dtx << gettablevariable( "roomRow" ) );
la variabile della tabella roomRow (angolo in alto a sinistra della prima immagine) ricorda in che stato si trova l'FSM.Lo script lo utilizza per trovare il contenuto della stanza corrente:
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 è la tabella dati FSM, quindi dtx: contenuto è la colonna delle liste.IL [ camera ] pedice preleva la riga dalla tabella.L'obiettivo di questa routine è creare un elenco orizzontale di caselle di pulsanti.Ogni pulsante è etichettato con un oggetto nella stanza.Lo script del pulsante chiama a Prendere funzione per prendere l'oggetto dalla stanza e metterlo dentro inventario , un'altra variabile di tabella.Il codice Eval/EvalExpr/Expr sta "integrando" il valore corrente di "stuff " COSÌ Prendere otterrà il valore integrato, in seguito, quando il pulsante viene premuto e i valori inseriti cose E io non sarà più disponibile.
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();); IL Prendere la funzione afferra la variabile della tabella inventario string e lo analizza in un elenco.Quindi fa un pos variabile con l'oggetto da prendere; cosa è il nome che è stato inserito sopra.Le prossime righe manipolano il file contenuto della stanza e il inventario .La tabella può essere salvata in qualsiasi momento con lo stato corrente dell'FSM perché questo JSL utilizza sempre i valori della variabile della tabella e della colonna dell'espressione.
L'ultima cosa Prendere non fa altro che chiamare ricostruire() .
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] );); l'attività di ricostruzione consiste nel rendere l'interfaccia utente dell'FSM coerente con lo stato interno.I vecchi elenchi di inventario, contenuti e pulsanti delle porte vengono eliminati e sostituiti con nuovi elenchi e l'immagine viene aggiornata.Tutti i nomi (inv, content, doors, txt, pic) sono impostati dallo script che crea la finestra:
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() ));
ciascuna delle variabili identifica una casella di confine.La casella di bordo non viene eliminata, ma i suoi contenuti vengono eliminati e quindi sostituiti.
Infine, l'estrema destra della finestra, non mostrata qui, è controllata dallo script nella colonna onEnter e onExit.Puoi vedere, molto sopra, lo script onEnter per il soggiorno apre una tabella di dati di film che potresti guardare nel soggiorno.La tabella invisibile fornisce quindi un NewDataBox da inserire nel file porta tavola scatola di confine .onExit lo rimuove quando esci dalla stanza, quindi onEnter della stanza successiva può fornire qualcosa di diverso.La maggior parte delle stanze sceglie una tabella di dati appropriata.Il bagno richiede JMP PRO per eseguire gli script nella tabella.
La tabella allegata verrà aperta nelle versioni precedenti di JMP, ma le colonne delle espressioni saranno colonne di caratteri e lo script non verrà eseguito correttamente.JMP12 uscirà presto, preparati!