kdb:值和评估之间的区别

kdb: differences between value and eval

来自 KX:https://code.kx.com/q/ref/value/ 说,当 x 是列表时,value[x] 将作为 解析树 评估列表的结果.


Q1。在下面的代码中,我理解 (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)

Any other parse tree takes a form of a list, of which the first item is a function and the remaining items are its arguments. Any of these items can be parse trees. https://code.kx.com/q/basics/parsetrees/


Q2。在下面的代码中,value 未能 return 我认为是有效解析树的结果,但 eval 工作正常,递归评估树。这是否意味着最上面的描述是错误的?

q)value(+;3;(+;4;5))
'type
  [0]  value(+;3;(+;4;5))
       ^
q)eval(+;3;(+;4;5))
12

Q3。那么一般来说,我们如何选择是使用value还是eval呢?

简而言之,evalvalue 之间的区别在于 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 可能是评估解析树的最佳选择函数,因为它可以正确评估您的陈述,即使它们是嵌套的。