<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />這篇文章是一個示例應用程序,可以用 JSL 編寫,帶有 JMP 12 表達式列。更多 JMP 12 帖子.
這篇文章附有一個 .JMP 文件,看起來像這樣:

這個表有一個有限狀態機,簡稱FSM。如果您運行 Run Me 腳本,JMP 會打開一個如下所示的窗口:

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

表達式列大多不關心單元格中有什麼樣的表達式,也不關心是否每個單元格都有相同的表達式。這門口column 是矩陣的表達式列,用方括號表示。這輸入時column 是 JSL 的表達式列,當進入房間(狀態)時腳本將運行。
那剩下的圖片列,也是一個表達式列。JMP 確實對圖片做了例外,默認顯示圖片,而不是表達式的文本。第一張圖片的表達式文本如下所示(除了 ... 是很多字符):
新圖像(字符到 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;); 數字傳輸系統是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 即將發布,準備好!