[KDB+/Q]:操作函数的解析树(`inverse` 组合子)

[KDB+/Q]: Manipulate parse tree of a function (`inverse` combinator)

如何提取和操作 lambda/function 的解析树?

例如给定函数

pair:{` sv x,y}'

我想使用一个名为 inverse 的组合器得到 "inverse" 版本,这样下面的调用 returns (注意现在 x 的交换顺序和 y):

q)inverse pair
{` sv y,x}'

以下适用于嵌入式 q 函数和 qsql,但不适用于用户定义的 lambda:

q)-3!parse "mavg"
"k){msum[x;0.0^y]%mcount[x;y]}"
q)-3!parse "select avg foo,sum bar by blah from myTable"
"(?;`myTable;();(,`blah)!,`blah;`foo`bar!((avg;`foo);(sum;`bar)))"
q) parse "pair"
`pair
q)-3!parse string pair
"(';{` sv x,y})"

谢谢

对于常规 function/lambda(类型 100h),您可以使用 "value" 提取有关函数的有用信息,包括定义的字符串。

q)value[mavg]
0x7978820a0279a04778810a02440004
`x`y
`symbol$()
`q`msum`mcount
0f
"k){msum[x;0.0^y]%mcount[x;y]}"

q)pair2:{` sv x,y}
q)value pair2
0x79784c0fa00a020003
`x`y
`symbol$()
,`
k){x/:y}
"{` sv x,y}"

q)last value pair2
"{` sv x,y}"

q)last value {x+y}
"{x+y}"

虽然你的对是 106h 类型,所以表现不一样

这是你的意思还是我遗漏了什么?

q)inverse:{x[z;y]}
q)pair:{` sv x,y}'
q)pair[`b;`a]
`b.a
q)pair[`a;`b]
`a.b
q)inverse[pair][`a;`b]
`b.a
q)pair[`b`gg;`a`ff]
`b.a`gg.ff
q)inverse[pair][`b`gg;`a`ff]
`a.b`ff.gg

使用将函数作为参数应用于列表的能力,然后使用内置列表操纵器对参数重新排序,可能被认为更符合习惯,如下所示:

q)f . 2 3
0.6666667
q)f . reverse 2 3
1.5
q)g:{x+y%z}
q)g . 1 2 3
1.666667
q)g . reverse 1 2 3
5f
q)g . 1 rotate reverse 1 2 3
2.333333