让我们将deparse
1 定义为对q的原生parse
的逆操作,以便以下保持:
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
函数应返回:
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"
动机/背景/使用案例 对于人眼(从左到右),内联表达式可以说比grok更快,而不是深度嵌套的解析树。虽然在后台我的代码是以编程方式编辑解析树,但它对于调试或呈现很方便,可以方便地将生成的解析树转换为内联表达式字符串。
1 此处描述的类似功能:http://adv-r.had.co.nz/Expressions.html#parsing-and-deparsing
答案 0 :(得分:0)
我认为这样做的唯一方法是递归地解析列表并构建一个字符串,例如对于一个二元的:
q)deparse:{a:-3!'x;a[1],a[0],a[2]}
q)deparse parse "3*3"
"3*3"
因此,您可以计算last x
以获得它的效价并相应地构建字符串
答案 1 :(得分:0)
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))))"