[KDB+/Q]: Deparse q parse tree into q expression(string)

[KDB+/Q]: Deparse q parse tree into q expression (string)

让我们将deparse1定义为对q的原生parseinverse操作,使得以下成立:

q)aStringQExpression~deparse parse aStringQExpression
1b

问题

deparse 函数的定义是什么,上面的代码确实有效?

例如,在下面的更新表达式中,我们知道 "a*0^b+c-d" 表达式对应 (*;`a;(^;0;(+;`b;(-;`c;`d)))) 解析树:

q)-3!parse "update col:a*0^b+c-d from t"
"(!;`t;();0b;(,`col)!,(*;`a;(^;0;(+;`b;(-;`c;`d)))))"

所以设想的deparse函数应该return:

q)deparse "(*;`a;(^;0;(+;`b;(-;`c;`d))))"
"a*0^b+c-d"
q)deparse "(!;`t;();0b;(,`col)!,(*;`a;(^;0;(+;`b;(-;`c;`d)))))"
"update col:a*0^b+c-d from t"

Motivation/Background/Use 案例: 与深度嵌套的解析树相比,内联表达式可以说比人眼(从左到右)更快 grok 。尽管我的代码在后台以编程方式编辑解析树,但将生成的解析树方便地转换为内联表达式字符串对于调试或演示很有用。


1 此处描述的类似功能:http://adv-r.had.co.nz/Expressions.html#parsing-and-deparsing

我认为唯一的方法是递归地解析列表并构建一个字符串,例如对于二元:

q)deparse:{a:-3!'x;a[1],a[0],a[2]}
q)deparse parse "3*3"
"3*3"

所以你可以计算 last x 来得到它的化合价并相应地构建字符串

This unparse repository from Github 解决问题。惊人:

q).unparse.unparse parse "update col:a*0^b+c-d from t"
"update col:(a*(0^(b+(c-d)))) from t"

q).unparse.unparse parse "a*0^b+c-d"
"(a*(0^(b+(c-d))))"