Что такое (!). в kdb и допустимы ли нижеприведенные варианты использования для его использования?

#kdb

#kdb

Вопрос:

  1. Что такое (!). called в kdb?

  2. и допустимы ли приведенные ниже варианты использования (!). для преобразования списка в словарь или есть лучшие способы и другие варианты использования (!). ?
    Пример:

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

Я не могу найти никакой документации по вариантам использования в (!). в руководствах kdb. Пожалуйста, поделитесь любой информацией о (!). и его использовании?

Ответ №1:

Это версия apply amp; да, ваш вариант использования допустим. Причина, по которой оператор заключен в круглые скобки, заключается в том, что он сам является диадическим инфиксным оператором, как и точка apply (.)

Если вы попытаетесь применить его как есть, ваше выражение будет похоже на so, что 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
  

При использовании apply с обозначением в скобках, как в вашем примере, нет необходимости переносить функцию

 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

Джейсон

Ответ №2:

Что касается вариантов использования, я нахожу это очень полезным при определении словарей / таблиц как конфигураций, особенно когда словари слишком широкие (по горизонтали) для экрана или когда более полезно видеть поля / сопоставления по вертикали в виде пар. С точки зрения кода / скрипта это так.

Например:

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

намного легче читать при сканировании через q-скрипт, чем

 mapping2:`one`two`three!1 2 3
  

когда последнее становится очень широким.

Конечно, это не имеет никакого значения для фактического словаря, потому что, как указал Джейсон, это одно и то же.