Re: 关于用 expr() 声明的变量的 type() 的问题要记住的主要事情是打印() ,写()和显示()对待他们的论点与大多数函数有点不同——他们解包但不评估。 因此打印(c)将打印的东西C is——它是一个表达式。 类型()将解包然后评估它的参数然后返回它的类型。 如果你想类型()表现得更像打印() ,然后使用名称 Expr() , 作为类型(名称Expr(c))
Re: 关于用 expr() 声明的变量的 type() 的问题谢谢@ErraticAttach
我很清楚你在解释什么。
不过,我有一个问题要问你。
如果类型() 被解包和评估,然后表达式(a + b) 在情况 4 中进行评估,不应将 Number 作为返回值返回类型() 与案例 3 一样?在解包后评估类型的过程中,根据参数是指定为变量还是函数,处理是否有所不同?
Re: 关于用 expr() 声明的变量的 type() 的问题像 C 和 C++ 这样的语言在调用之前评估函数调用的参数。 C 和 C++ 没有 Expression 数据类型,因为表达式在编译时被编译成代码。 执行速度更快,但限制了您解决问题的一些方法。
JSL 有一个 parse() 函数,它接受一个字符串并将其转换为一个表达式树。 eval() 函数评估树。 当作为作业的右侧访问时,树会自动评估,除非特别注意偷看它。有一个 nameExpr() 函数,仅当您需要查看存储在变量中的表达式而不意外评估它时才应使用该函数。 出于某种原因,如果参数看起来是一个简单的变量,那么在时间上丢失了,并且现在修复可能为时已晚,打印/显示/写入没有调用来评估它们的参数。 好的,当时它可能看起来像是一个加速,因为 eval(c) 有一些开销,而不是仅仅获取 c 的值。 但是 print(c+0) 会计算参数,print(eval(c)) 也会计算参数,因为参数不是一个简单的变量。
Re: 关于用 expr() 声明的变量的 type() 的问题@Craige_Hales肯定是对的——拆包不是一个好词,如有任何混淆,请见谅!我试图描述的行为已记录在案 - 检查此链接: https://www.jmp.com/support/help/en/15.2/index.shtml#page/jmp/expressions.shtml
这是相关的位:

Re: 关于用 expr() 声明的变量的 type() 的问题谢谢你!!你非常有帮助! 
回复:关于用 expr() 声明的变量的 type() 的问题谢谢! 变得很有帮助。
回复:关于用 expr() 声明的变量的 type() 的问题a = 1;
b = 2;
type( a + b );
“数字”
在内部,type 收到一个看起来像 add(a, b) 的表达式树。 树被评估为一个数字。
a = 1;
b = 2;
type( expr( a + b ) );
“表达”
在内部,type 收到一个看起来像 expr( add( a, b ) ) 的表达式树。 再次评估树;树中的 expr() 节点将其参数作为表达式返回。
a = 1;
b = 2;
c = expr( a + b );
type( c );
“数字”
在内部,type 收到一个看起来像 c 的表达式树。 再次,它被评估。 c 是一个表达式 add(a,b),每当计算 c 时,它都会使用 a 和 b 的当前值。c 在其树中没有 expr() 节点。
“解包”在 JSL 中不是一个明确定义的概念。 每个内置函数最初都将其参数视为表达式树。 有些函数在不先查看参数的情况下评估它们的参数。 其他功能从不评估它们。 一些函数查看表达式的根节点是 eval() 或 expr() 还是 send() 并做一些不同的事情。 (send() 是 << 运算符。 参数列表中有一种用于识别特殊参数的一元用法,通常是将实际消息发送到正在创建的显示框。)将公式表达式添加到列是一个有时让我感到困惑的例子;它假设不应评估该论点。 在公式周围添加 eval() 会导致它求值,因为 formula(...) 会查看参数。 替代方案是始终评估参数,然后正常用例将需要围绕公式进行 expr() (因为评估 expr(...) 只会返回其参数。)
关于用 expr() 声明的变量的 type() 的问题你好
我正在使用“expr()”,我有几个问题。
我会按照评论里写的数量提问。
1)是否可以认为c原样执行时应用了eval()?
2)-
3) 为什么当检查声明为expr()的变量c的类型时会出现Number?
如果 type() 执行参数,识别类型并显示结果,我想知道为什么在 4) 的情况下它是表达式。
4)-
a = 1;
b = 2;
c = expr(a + b);
c; // 1) Result : 3
print(c); // 2) Result : a + b
type(c); // 3) Result : Number
type(expr(a + b)); // 4) Result : Expression
谢谢 :)
质量和工艺工程回复:关于用 expr() 声明的变量的 type() 的问题有趣的是看到 write 根据参数的类型做不同的事情。
还有一些其他函数执行相反的操作:它们查找一个简单的名称,但不会评估更复杂的表达式。
有人有在使用之前哪个函数执行“查找”、“解包”、“评估”......它的参数的完整列表吗?
需要考虑多少案例?
我注意到有一些特殊情况,例如每个情况- 检查第一个参数是否是一个列表。
x= Expr(Print(2));
y = "hello";
Write(x); // ->Print(2)
Write(y || " world"); // hello world
Head(x); // Print()
Type(x); //-> 2
...