kdb:value和eval之间的差异
来自 KX:https : //code.kx.com/q/ref/value/说,whenx是一个列表,value[x]将作为解析树评估列表的结果。
一季度。在下面的代码中,我理解 (A) 是一个解析树,定义如下。但是,为什么(B)也有效?是("+";3;4)一个有效的解析树吗?
q)value(+;3;4) / A
7
q)value("+";3;4) / B
7
q)eval(+;3;4) / C
7
q)eval("+";3;4) / D
'length
[0] eval("+";3;4)
任何其他解析树都采用列表的形式,其中第一项是函数,其余项是其参数。这些项目中的任何一个都可以是解析树。https://code.kx.com/q/basics/parsetrees/
Q2。在下面的代码中,value未能返回我认为是有效解析树的结果,但eval工作正常,递归评估树。这是否意味着最上面的描述是错误的?
q)value(+;3;(+;4;5))
'type
[0] value(+;3;(+;4;5))
^
q)eval(+;3;(+;4;5))
12
Q3。那么一般来说,我们如何选择是使用value还是eval?
回答
简言之之间的差别eval,并value是,eval专门用来评估分析树,而value在它进行其它操作解析树的作品。例如 value 可用于查看字典的非键值或值字符串,例如:
q)value"3+4"
7
将此字符串放入 中eval,我们只需将字符串取回:
q)eval"3+4"
"3+4"
1在此之后,您问题的第一部分还不错,无法回答。该格式("+";3;4)在技术上不是 的解析形式3+4,我们可以通过以下方式看到:
q)parse"3+4"
+
3
4
value在这种情况下的好处是它将字符串赋值"+"为运算符+,然后赋值执行解析树。eval无法理解字符串,"+"因为它超出了函数的范围。这就是为什么 A、B 和 C 有效但 D 无效的原因。
2在第二部分中,您的解析树确实是正确的,我们可以再次通过parse函数看到这一点:
q)parse"3+(4+5)"
+
3
(+;4;5)
eval如果您的解析树表示一个有效的语句来获得您想要的结果,则始终可以使用它。value不适用于所有解析树的唯一“简单”解析树。因此,您在此处拥有的嵌套列表语句无法通过value.
3一般来说,eval如果您知道它们是正确的解析树格式,那么它可能是评估解析树的最佳选择,因为它可以正确地评估您的语句,即使它们是嵌套的。