什么是 (!)。在 kdb 中,下面的用例是否有效?

What is (!). in kdb and are below usecases valid to use it?

  1. 什么是 (!)。在 kdb 中调用?

  2. 并且以下用例有效使用 (!)。将列表转换为字典,或者是否有更好的方法和 (!) 的其他用途。 ?
    示例:

    q)(!). (`A`B;(`C`D`E;`F`G`H));
    q).[(!);flip (`A`B;`C`D;`E`F)]
    

我找不到关于 (!) 用例的任何文档。在 kdb 教程中。请分享有关 (!) 的任何信息。及其用途?

这是应用的一个版本,是的,您的用例是有效的。运算符被括在括号中的原因是因为它本身是一个二元中缀运算符,点应用 (.)

如果你试图按原样应用它,你的表达就像这样,Q 不喜欢

// infixOp infixOp operand
q)+ . 4 5
'
  [0]  + . 4 5
        ^

将运算符括在括号中可以有效地对其进行转换,因此表达式现在变为

// operand infixOp operand
q)(+). 4 5
9

如果你定义了一个不能使用中缀的函数,那么就不需要包装它

q)f:+
q)4 f 5
'type
  [0]  4 f 5
       ^
q)f . 4 5
9

如果在您的示例中使用带有括号表示法的应用程序,则无需包装函数

q).[+;4 5]
9

https://code.kx.com/q/ref/apply/#apply-index

https://code.kx.com/q/basics/syntax/#parentheses-around-a-function-with-infix-syntax

贾森

就 use-cases 而言,我发现它在将 dictionaries/tables 定义为配置时非常有用,尤其是当词典对于屏幕来说太宽(水平)时,或者当看到 [=23] 更有用时=] 垂直成对。从code/script的角度来看就是。

例如:

mapping:(!) . flip(
 (`one;   1);
 (`two;   2);
 (`three; 3));

扫描 q 脚本比

更容易阅读
mapping2:`one`two`three!1 2 3

当后者变得很宽时。

当然,这对实际词典没有影响,因为正如 Jason 指出的那样。