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