[KDB+/Q]:(重新)以编程方式(动态地)定义视图

[KDB+/Q]: (Re-)define view programmatically (dynamically)

我可以通过加载 q 脚本或从控制台以交互方式定义 view

q)myview::a+b                / even semi-programmatically using ugly strings: value"myview::a+b"

一些探索:

q)value `. `myview
::
(+;`a;`b)
`a`b
"a+b"

我可以看到我新设计的视图现在是全局环境字典的一部分:

q)select myview from `.
myview| a+b

该键值对的值部分是一个 lambda 类型列表:

q)-3!value select myview from `.
",a+b"
q) type first value select myview from `.
100h

虽然{a+b}也是lambda类型...

q)type {a+b}
100h

... a+b{a+b} 不是一回事:

q){a+b} ~ first value select myview from `.
0b

问题: 现在 myview 已在全局环境中定义,我如何以编程方式更改其定义,例如 a+c lambda 表达式,通过按名称引用该视图,即 `myview

例如,我可能要处理这个输入:

q)config:()!(); config[`myview]:"a+c"

这样的东西能达到您的要求吗?

q)f:{value "::" sv (string x;y)}
q)f[`myview;"a+b"]
q)select myview from `.
myview| a+b

视图不可解析(请参阅 http://code.kx.com/q/tutorials/views/ 的最后一行)因此 "using ugly strings" 似乎是您唯一的选择:

q)show config:`view1`view2!("a+b"; "c+d")
view1| "a+b"
view2| "c+d"
q)defView:{value string[x],"::",y}
q)defView'[key config; value config]
q)\b
`s#`view1`view2
q)view1
'b
q)a:1;b:2
q)view1
3