如何提取和操作lambda /函数的解析树?
E.g。给定功能
pair:{` sv x,y}'
我希望到达"反向"使用名为inverse
的组合子的版本,以便后面的调用返回(注意现在交换的x
和y
的顺序):
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})"
由于
答案 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的类型,所以不会表现相同