【问题标题】:kdb: differences between value and evalkdb:值和评估之间的差异
【发布时间】:2021-02-22 16:41:18
【问题描述】:

来自 KX:https://code.kx.com/q/ref/value/ 说,当x 是一个列表时,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/


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

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

第三季度。那么一般情况下,我们如何选择是使用value还是eval呢?

【问题讨论】:

    标签: kdb


    【解决方案1】:

    简单地说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 可能是评估解析树的最佳选择函数,如果您知道它们是正确的解析树格式,因为它可以正确评估您的语句,即使它们是嵌套的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-02
      • 2015-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多