【问题标题】:[KDB+/Q]: Manipulate parse tree of a function (`inverse` combinator)[KDB+/Q]:操作函数的解析树(`inverse` 组合子)
【发布时间】:2017-04-29 15:05:39
【问题描述】:

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

例如给定函数

pair:{` sv x,y}'

我想使用名为inverse 的组合子来获得“逆”版本,以便返回以下调用(注意现在交换的xy 的顺序):

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

谢谢

【问题讨论】:

    标签: kdb q-lang


    【解决方案1】:

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

    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
    

    【讨论】:

    • 是的!比我想象的要简单
    • 在表单中也有很好的 DSLy 感觉:(inverse pair) [`b`gg;`a`ff]
    【解决方案2】:

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

    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 类型,所以行为不一样

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-11
      • 1970-01-01
      相关资源
      最近更新 更多