【问题标题】:kdb: what is the type of parse"x[y]"?kdb:解析“x[y]”的类型是什么?
【发布时间】:2021-02-21 17:01:53
【问题描述】:

对于表达式parse"x[y]",我认为这意味着x 在参数y 上的函数/映射/列表应用程序,可能是投影。如果我错了,请纠正我。

现在进入 Q 控制台,我得到以下输出。

q)parse"x[y]"
x
y
q)l:parse"x[y]"
q)count l
2
q)type l
0h
q)l[0]
`x
q)l[1]
`y
q)type l[0]
-11h
q)type l[1]
-11h

我们看到l 的类型为0h。它的长度为 2。两个元素的类型均为 -11h。那为什么列表不是11h类型的呢?

【问题讨论】:

  • 仅供参考 - 与此问题相关:stackoverflow.com/questions/66304637/…
  • @terrylynch 一般而言,列表是否可以包含相同类型的原子(例如符号),但列表仍然具有0h 类型?
  • 一般不,它通常会折叠成一个统一的列表,但总是有奇怪的边缘情况和灰色区域!虽然我不认为这个问题很奇怪或边缘情况,但它是解析树生成的预期行为

标签: kdb


【解决方案1】:

简而言之,它是一个解析树签名 'type' 构造,非常类似于 lambda(类型 64)。 k 在对象到达调用堆栈时识别并评估解析树中的表达式,取消引用符号 - 这就像一个指针。

TL;DR - 逐步细分

  1. 基本评估结构

"x[y]" ~ "x y"

q)x:count
q)y: 1 2 3
q)parse "x y"  
x
y
q)x y
3
q)`x y
3
q)eval parse "x y"
3

简单的索引,'simplified'第二个参数 -> int atom:

q)parse "y 2"  //this nicely shows parse tree
`y
2
q)eval parse "y 2" 
3 
q)eval (`y;2)
3 
q)`y 2
3
q)y 2
3

以上两个示例都是混合列表 (0h),实际元素紧随其后 - 其中符号 - 是引用。取而代之的是普通的混合列表结构,所有长度和类型都在以后定义

  1. 查看序列化的 IPC 帧有助于理解这个结构

Establish what expressions are the same

q)parse["x[y]"] ~ parse "x y"
1b
q)parse["x[y]"] ~ parse "x@y"
0b
q)parse["x[y]"] ~ parse "{x y}" 
0b

Compare byte frames

q)-8!parse "x[y]" 
0x0100000014000000000002000000f57800f57900
q)-8!parse "x y"  
0x0100000014000000000002000000f57800f57900  
q)-8!`x`y 
0x01000000120000000b000200000078007900 
q)-8!enlist `x`y
0x01000000180000000000010000000b000200000078007900 
                                                                                                                 

Compare parse tree output from 1st paragraph with actual obj instead of reference

q)-8!parse "x y"
0x0100000014000000000002000000f57800f57900 
q)-8!parse "x 2"
0x010000001a000000000002000000f57800f90200000000000000

Lambda structure to complete the list for reference

q)-8!{x y}
0x010000001500000064000a00050000007b7820797d
/0x7b "{" ; 0x7d "}"
  1. 最后是 IPC 框架分解

`x`y (symbol list)

q)symlist:`endian`isync`x`y`length`type`attr`msg!sums[0 1 1 1 1 4 1 1] _ -8!`x`y
q)symlist
 endian| ,0x01     (little endian)    
 isync | ,0x00 
 x     | ,0x00   
 y     | ,0x00 
 length| 0x12000000 
 type  | ,0x0b     (11h - symbol list - 1st difference)
 attr  | ,0x00  
 msg   | 0x0200000078007900   

深入研究符号列表:

  q)msg:`lenght`msg!sums[0 4] _ symlist`msg 
  q)msg
   lenght| 0x02000000
   msg   | 0x78007900
                                                                                                                 

在这里我们可以清楚地看到,由于显式类型:0x0b - 11h - 符号列表,空终止符号如何立即跟随向量的长度

  q)`char$msg`msg
   "x\000y\000"

parse "x[y]" - 解析树分解

q)o1:`endian`isync`x`y`length`type`attr`msg!sums[0 1 1 1 1 4 1 1]_ -8!parse"x[y]"
q)o1   
 endian| ,0x01            
 isync | ,0x00   
 x     | ,0x00 
 y     | ,0x00   
 length| 0x14000000    
 type  | ,0x00   (could expect 64 - 100h lambda)
 attr  | ,0x00    
 msg   | 0x02000000f57800f57900   

与简单列表的区别:

   q)`lenght`type1`msg1`type2`msg2!sums[0 4 1 2 1 ] _ o1`msg
    lenght| 0x02000000
    type1 | ,0xf5        (-11h - symbol atom) - acts as a reference
    msg1  | 0x7800       null terminated "x" 
    type2 | ,0xf5        (-11h - symbol atom)
    msg2  | 0x7900       null terminated "y"  - acts as a reference

【讨论】:

    猜你喜欢
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    • 2017-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多