[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
我可以通过加载 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