<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 即将发布,准备好!