简而言之,它是一个解析树签名 'type' 构造,非常类似于 lambda(类型 64)。 k 在对象到达调用堆栈时识别并评估解析树中的表达式,取消引用符号 - 这就像一个指针。
TL;DR - 逐步细分
- 基本评估结构
"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),实际元素紧随其后 - 其中符号 - 是引用。取而代之的是普通的混合列表结构,所有长度和类型都在以后定义
- 查看序列化的 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 "}"
- 最后是 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