使用 KDB 时有时需要副作用吗?

Are side-effects sometimes necessary when using KDB?

假设我有一个状态变量 s

我有一个 .z.ws 钩子可以响应 websocket 消息并运行:

.z.ws: {handleMsg x}

我是否必须将 s 声明为全局 handleMsg 才能更新 s

理想情况下,我想要的是:

s: handleMsg[s;x]

其中 handleMsg 是一个纯函数(它不影响内部的任何全局变量)。

我是否应该将 s 声明为全局,然后尝试在 websocket 回调中执行此分配?

您不会 pre-declare 变量在 kdb 中作为全局变量,如果您在任何时候将它们设为全局变量(并且如果您将它们作为全局引用),它们就是全局变量。

q)func:{x+1}

/s is local and treated as such
q){s:func[1]}[]
2

/it is not a global
q)s
's

/this would make it global
q){`s set func[1]}[]
`s
/or
q){s::func[1]}[]

/now it's global
q)s
2

/but a local of the same name would take preference
q){s:func[100];s}[]
101
q)s
2

/you can force-reference the global if required
q){s:func[100];value `s}[]
2

所以您可以完全控制什么是全局的,什么不是全局的,什么时候引用本地的,什么时候引用全局的。