<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即将推出,做好准备吧!