关于用 expr() 声明的变量的 type() 的问题你好
我正在使用'expr()',我有几个问题。
我会根据评论中写的数字提问。
1) 是否可以认为当 c 按原样执行时应用了 eval() ?
2) -
3)为什么检查声明为expr()的变量c的类型时会出现Number?
如果 type() 执行参数,识别类型并显示结果,我想知道为什么它是 Expression in case of 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
谢谢 :)
脚本Re: 关于用 expr() 声明的变量的 type() 的问题要记住的主要事情是打印() ,写()和显示()对待他们的论点与大多数函数有点不同——他们解包但不评估。 因此打印(c)将打印的东西C is——它是一个表达式。 类型()将解包然后评估它的参数然后返回它的类型。 如果你想类型()表现得更像打印() ,然后使用名称 Expr() , 作为类型(名称Expr(c))
Re: 关于用 expr() 声明的变量的 type() 的问题谢谢@ErraticAttach
我很清楚你在解释什么。
不过,我有一个问题要问你。
如果类型() 被解包和评估,然后表达式(a + b) 在情况 4 中进行评估,不应将 Number 作为返回值返回类型() 与案例 3 一样?在解包后评估类型的过程中,根据参数是指定为变量还是函数,处理是否有所不同?
Re: 关于用 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(...) 只返回其参数。)
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
这是相关的位:
