<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />この投稿は、JMP 12 式列を使用して JSL で記述できるサンプル アプリケーションです。その他の JMP 12 投稿.
この投稿には、次のような .JMP ファイルが添付されています。

このテーブルには有限ステート マシン、略してFSM。Run Me スクリプトを実行すると、JMP は次のようなウィンドウを開きます。

状態間を移動するためのボタンが右側にあります。このアプリケーションでは、現在いる部屋が FSM の状態です。テーブルには 6 つの部屋、6 つの州、および 6 つの行があります。
列部屋の名前とメッセージ昔ながらの文字列です。コンテンツ中括弧で囲まれた JSL リストを含む Expression 列です。列を作成した後、列ダイアログでタイプを式に設定できます。

式列は、ほとんどの場合、セル内の式の種類は気にしません。また、すべてのセルに同じ種類の式があるかどうかも気にしません。の戸口column は行列の式列で、角かっこで示されます。のonEnter column は、ルーム (状態) に入ったときにスクリプトが実行する JSL の式列です。
それは写真これは式列でもあります。JMP は写真については例外として、式のテキストではなく、デフォルトで写真を表示します。最初の画像の式のテキストは次のようになります (ただし、... は多くの文字です)。
New Image(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 コードは、「もの」の現在の値を「焼き込んでいます」 " それで取った後でボタンが押されたときに組み込み値が取得され、値がものと私もう利用できなくなります。
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();); の取った関数はテーブル変数を取得します在庫文字列を解析してリストにします。次に、位置取得するアイテムを含む変数。もの上記で焼き付けられた名前です。次の数行は、部屋の内容そしてその在庫.このJSLは常にテーブル変数と式列の値を使用するため、テーブルはFSMの現在の状態でいつでも保存できます。
最後のこと取った呼び出します再構築() .
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 は間もなくリリースされます。準備を整えてください。