Использование над наречи для работы на столе - PullRequest
0 голосов
/ 25 ноября 2018

Учитывая двоичную функцию f, которая принимает в качестве аргументов:

x: таблица с ключамиy: значение ключа, которое указывает на строку, которая будет создана

. При условии, что операции обновления должны выполняться последовательно (а не массовая операция), и как только этот ключ будет заполнен, мы будем игнорировать дальнейшие обновления для него:

q)tbl:([col1:()];col2:())
q)kv:10?`a`b`c`d
q)f:{[x;y]if[y in key[x];:x];x upsert (y;1?10)}

q)(f/)[enlist[tbl],kv]
col1| col2
----| ----
a   | 9
b   | 2
c   | 1
d   | 8

Есть ли более правильный способ построения вызова?Смешивание двух входов в один список ввода выглядит как хакерство и вызывает вопросы о том, как разместить функции, которые принимают более 2 аргументов.

Ответы [ 2 ]

0 голосов
/ 23 декабря 2018

Возможно, запуск upsert на отдельном входе более эффективен?

(tbl upsert)/[flip(d;(count d:distinct kv)?10)]
0 голосов
/ 25 ноября 2018

Для этого нужен небольшой твик:

q)(f/)[tbl;kv]

это описано в вики KX (https://code.kx.com/wiki/Reference/Slash)

/ -  f/[y] is equivalent to f[f[..f[f[y0;y1];y2];..yn-1];yn]
q)+/[1 2 3]
6
q)(f/)[enlist[tbl],kv]  /joining both arguments to a single list

/ - f/[x;y] is equivalent to f[f[..f[f[x;y0];y1];..yn-1];yn] 
q)+/[10;1 2 3]
16
q)(f/)[tbl;kv]    / here we are passing the table as first argument 
...