网络上一些有用的资源:
- 在探索峰会系列讲座中, @joseph_morgan有一场精彩的演讲:
https://community.jmp.com/t5/Abstracts/Using-JSL-to-Develop-Efficient-Robust-Applications-EU-2018-415/ev-p/849638
Joseph 解释了JSL 中表达式处理的秘密和可能性,以及与该功能相关的陷阱。
本次讲座的内容基于《表达式处理函数:第一部分——揭开Expr()、NameExpr()、Eval()等函数的谜题》一书。
- @Jasean 动态编写 JSL 代码
(通用技巧#1和#2的详细步骤指南,请参见下文)
- 字符串和表达式的区别——50行简述:
回复@Craige_Hales的社区帖子
- 很棒的课程,有很多应用案例: 第九课:高级JSL , @jthi
- 更多信息请参阅脚本指南: 高级表达式、宏和列表
基础知识
内部的:
#062 - JSL 中的表达式处理
#092 - 表达式处理
| 1 |
不要计算表达式 (2+1), 只需将其存储在变量x中即可。 |
x= Expr (2+1) |
| 2 |
获取存储在x中的表达式。 |
名称表达式(x) |
| 3 |
力量评估 |
评估(myexpr) |
| 4 |
评估xyz和 将表达式(xyz)替换为返回值 |
评估表达式( ... 表达式(xyz)) |
*)注意:在第 1 题和第 4 题中,函数“ Expr(...)”相同,但效果相反:
在 1 中, Expr的内容不会被求值;在 4 中,只有Expr的内容会被求值。
3个通用技巧
| 1 |
通过EvalExpr() 函数预先计算表达式的部分值 然后通过Eval()函数计算表达式的值。 解决了90%的问题(方案二可解决99%的问题)。 |
Eval( 评估实验 ( ... Exp (eval 1st) ...)) 选项 2: Eval( 评估实验 ( ... Exp (Name Expr( )) ...))
|
| 2 |
解决了同样的99%的问题 选项 1 - 选项 2 |
Eval(substitute(Expr(), Expr(), Name Expr() ))
|
| 3 |
ultimate trick for 列引用 ( @jthi, e.g. 第九课:高级JSL @33min ) |
名称表达式(作为列("column name" or :柱子)) |
注:
有些函数会求值其参数,有些则不会,有些函数会求值部分参数——例如`head()`函数会在一定程度上求值: `head()` 函数会求值其参数吗? ——还有一些函数会求值其参数,但如果参数是单个变量,它们的行为就类似于`NameExpr()` 函数: 例外情况是实用程序 `Show`、`Write` 和 `Print`……
遗憾的是,这些细节大部分用户都无法获取,只能靠猜测。
我希望 JSL 编辑器能够通过交互式方式向用户显示以下信息来帮助用户: JSL 编辑器中的高级语法高亮显示 - 函数是否会对其参数求值?
-> 如果您想获得这项自动支持,请点击链接并投票!
社区示例:
[更多的主题容器像这样]
嗨@hogi ,
感谢您整理这些信息并将这些信息汇总在一起。这次谈话听起来很有启发。
我确实喜欢在 JMP 和 JSL 中可以用几种不同的方式做事,但有时有太多不同的方式针对当前的情况,当尝试编写通用且能够处理许多不同场景的代码时,这会变得有些麻烦。
谢谢!,
DS
JSL 和变量——编写 JSL 代码时应该注意的 3 个问题。
不同的问题,总有相同的解决方案:)
解决方案?
--> 只读主要帖子。
c= 5;
col = Name Expr(:height);
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
gb = graph Builder(); framebox = report(gb)[FrameBox(1)];
// issues with variables in a message
// all 3 of them look quite innocent
// but none of them will survive a restart
New Column ("rescaled", Formula (c * :height));
dt << New Column ("rescaled", Formula (5 * col));
framebox << Add Graphics Script(Y Function( c * x, x ) );
// no issue here:
dt << concatenate(dt);
dt << new column(c, formula(3));人们可能会想:永远不要在消息中使用变量!
但这太过分了——最后两个例子没有问题。