<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />本文是一個示例應用程序,可以使用 JMP 12 表達式列在 JSL 中編寫。更多 JMP 12 帖子。
本文附加了一個 .JMP 文件,如下所示:

該表包含一個有限狀態機,簡稱FSM。如果您運行 Run Me 腳本,JMP 將打開一個如下窗口:

它的右側有按鈕可以在狀態之間導航。在此應用程序中,您所在的房間就是 FSM 所處的狀態。表中有六個房間、六個狀態和六行。
列房間名稱和信息是普通的舊字符列。內容是一個表達式列,包含大括號中的 JSL 列表。創建列後,列對話框可以將類型設置為表達式:

表達式列大多不關心單元格中的表達式類型,也不關心每個單元格是否具有相同類型的表達式。這門口column 是矩陣的表達式列,由方括號表示。這回車時column 是 JSL 的表達式列,當進入房間(狀態)時腳本將運行該列。
這就留下了圖片列,也是表達式列。JMP 確實對圖片做了例外,默認情況下顯示圖片,而不是表達式的文本。第一張圖片的表達式文本如下所示(除了...有很多字符):
新圖像(Char To Blob(“58016...j1EF”,“base64compressed”),“png”)
JSL 與表達式列配合,使該 FSM 的用戶界面隨著狀態的變化而變化。對於此 FSM,按下按鈕時會發生狀態更改。
room = Num( dtx << gettablevariable( "roomRow" ) );
表變量 roomRow(第一張圖片的左上角)會記住 FSM 所處的狀態。該腳本使用它來查找當前房間的內容:
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是FSM數據表,所以dtx:內容是列表的列。這 [房間] 下標從表中選取行。此例程的目標是構建按鈕框的水平列表。每個按鈕都標有房間中的一個項目。按鈕腳本調用拿從房間取出物品並將其放入的功能存貨,另一個表變量。Eval/EvalExpr/Expr 代碼“烘焙”“stuff”的當前值“ 所以拿稍後,當按下按鈕時,將獲得烘焙值,並且值東西和我將不再可用。
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();); 這拿函數獲取表變量存貨字符串並將其解析為列表。然後它做了一個位置與要獲取的項目相關的變量;事物是上面烘焙的名字。接下來的幾行操作房間的內容和存貨。該表可以隨 FSM 的當前狀態隨時保存,因為該 JSL 始終使用表變量和表達式列中的值。
最後一件事拿確實是打電話重建() 。
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] );); 重建任務是使FSM的用戶界面與內部狀態保持一致。舊的庫存、內容和門按鈕列表將被刪除並替換為新列表,並且圖片也會更新。所有名稱(inv、content、doors、txt、pic)均由創建窗口的腳本設置:
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() ));
每個變量都標識一個邊框。邊框不會被刪除,但其內容會被刪除,然後被替換。
最後,窗口的最右側(此處未顯示)由 onEnter 和 onExit 列中的腳本控制。您可以在上方看到客廳的 onEnter 腳本打開您可能在客廳觀看的電影的數據表。然後,不可見的表提供一個 NewDataBox 來放入桌架邊框框。onExit 在您離開房間時將其刪除,因此下一個房間的 onEnter 可以提供不同的內容。大多數房間都會選擇合適的數據表。浴室需要 JMP PRO 來運行表中的腳本。
附加表將在早期版本的 JMP 中打開,但表達式列將是字符列,並且腳本將無法正確運行。JMP12即將推出,做好準備吧!