kdb:我可以使用set关键字来实现@​​[`.;`upd;:;.some.function]吗?

sam*_*sam 0 kdb

假设有一个现有的函数定义.my.func:{[tbl;data] ...},我想将该upd函数设置为此 lambda。

下面两行等价吗?

@[`.;`upd;:;.my.func]; / #1
`upd set .my.func; / #2
Run Code Online (Sandbox Code Playgroud)

之所以这么问,是因为我在我使用的代码库中看到了很多 #1,但 #2 似乎更简洁,所以想知道它们是否有某种不同。


我检查了https://code.kx.com/q/ref/amend/ “修改于”@[d; i; v; vy]

upd这似乎只是在全局命名空间中定义函数。

  • d =`.
  • 我=`upd
  • v =:
  • 维 =.my.func

我自己运行#1/#2 后,get`.似乎也表明#1/2 是等效的。

Tho*_*yth 5

\d这些行在用于更改命名空间的场景中并不等效。在上面的示例中,set在当前命名空间中创建变量,而这恰好是全局命名空间。@在全局命名空间中创建变量。

set使用.test命名空间创建的示例.test.upd

d).my.func:{x}
q)\d .test
q.test)`upd set .my.func;
q.test)upd
{x}
q.test)\d .
q)upd        / upd does not exist in global namespace
'upd
  [0]  upd
       ^
q).test.upd  / upd exists in .test namespace
{x}
Run Code Online (Sandbox Code Playgroud)

@用于upd2突出显示与上述示例的差异的示例updupd2在全局命名空间中创建。

q)\d .test
q.test)@[`.;`upd2;:;.my.func];
q.test)upd2  / upd2 does not exist in .test namespace
'upd2
  [0]  upd2
       ^
q.test)\d .
q)upd2       / upd2 exists in global namespace
{x}
Run Code Online (Sandbox Code Playgroud)