如何在单条qcon查询中切换namespace并定义对应命名空间下的函数
问题结论
这是kdb+的原生设计特性,并非3.6 32位版本的bug。
原因解释
kdb+的代码执行分为解析和执行两个独立阶段:
- 解析阶段会先确定整行所有表达式的命名空间绑定关系,此时还未执行任何代码逻辑
- 执行阶段才会运行
system "d .ns1"这类指令修改当前命名空间
你第一段代码中system语句和函数定义写在同一行,解析阶段f1的命名空间已经绑定为切换前的根命名空间.,执行阶段的命名空间切换不会回溯修改已经完成的绑定,因此f1实际被定义到了根空间,.ns1.f1不存在才会返回空结果。
加换行之后,第二行的函数定义是在第一行system语句执行完成后才启动解析的,此时当前命名空间已经是.ns1,所以绑定结果符合预期。
单条查询切换命名空间的解决方案
不需要换行也能实现目标的两种常用方案:
方案1:直接指定命名空间定义(推荐)
不需要修改当前命名空间,直接用set或者字典赋值方式指定目标命名空间:
\d . `$.ns1.f1 set {x+y}; get[.ns1.f1][3;0]~`ns1 / 返回1b // 或者字典赋值写法 .ns1[`f1]:{x+y}; get[.ns1.f1][3;0]~`ns1
方案2:用value动态解析后续代码
如果需要批量定义多个函数到目标命名空间,可以把后续代码作为字符串传给value,value会在执行阶段才解析传入的字符串内容,此时命名空间已经切换完成:
\d . system"d .ns1"; value "f1:{x+y}; f2:{x-y}; f3:{x*y}"; get[.ns1.f1][3;0]~`ns1 / 返回1b
内容的提问来源于stack exchange,提问作者egor7
相关产品推荐
相关产品推荐

