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

时间:2017-04-25 18:36:22

标签: kdb q-lang

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

E.g。给定功能

pair:{` sv x,y}'

我希望到达"反向"使用名为inverse的组合子的版本,以便后面的调用返回(注意现在交换的xy的顺序):

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

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

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})"

由于

2 个答案:

答案 0 :(得分:3)

这是你的意思还是我错过了什么?

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

答案 1 :(得分:2)

对于常规函数/ 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的类型,所以不会表现相同