вызов функции и ее аргументов из таблицы в q - PullRequest
0 голосов
/ 06 февраля 2019

Я пытаюсь вызвать функцию и ее аргументы из таблицы.Поэтому я вызываю функцию следующим образом:

(first exec function from table where id=jobId)

В этом примере я получаю: +

Затем я вызываю аргументы как:

[first exec args from table where id=jobId]

и получаю какпример [2 2]

Запуск двух строк друг за другом как:

`(first exec func from table where id=jobId)[first exec args from .table where id=jobId]`

Даст мне: + [2 2]

Но мне нужно: + [2; 2].

Я читаю это утверждение из документации, но я не смог его реализовать.

"Аргументы функциональной формы exec (? [;;;]) должны передаваться в разобранном виде и, в зависимости от желаемых результатов, в конкретной структуре данных."

Iпопытался преобразовать передачу части аргументов в функциональный вызов, подобный этому:

?[table;jobId=id;args;()]

Ответы [ 4 ]

0 голосов
/ 06 февраля 2019

Чтобы охватить общий случай функций с одним входом, несколькими входами и т. Д., Вам понадобится что-то вроде:

q)t:([]func:({x+1};floor;{x+y};first;{x+100});args:(12;1.5;2 2;"abc";`foo))

q)t
func    args
-------------
{x+1}   12
_:      1.5
{x+y}   2 2
*:      "abc"
{x+100} `foo

q)update res:{.[x;(),y;@[x;y;]`$]}'[func;args] from t
func    args  res
-------------------
{x+1}   12    13
_:      1.5   1
{x+y}   2 2   4
*:      "abc" "a"
{x+100} `foo  `type
0 голосов
/ 06 февраля 2019

Если вы пытаетесь выполнить функцию с аргументами, вы можете напрямую сделать это внутри оператора select / exec.

q) exec function .' args from table where id=1 
0 голосов
/ 06 февраля 2019

Я полагаю, что ваша таблица выглядит примерно так

q)show table:([] function:(+;*;{x+2*y}); args:(2 2;9 7;1 3); id:0 1 2)
function args id
----------------
+        2 2  0
*        9 7  1
{x+2*y}  1 3  2

Когда у вас есть функция и аргументы, вы можете применить, используя . (Применить) :

* 1007.*

Вы можете упростить приведенный выше запрос, чтобы он выполнялся только один раз, если вы используете '(каждый-оба) наречие:

q)first exec function .' args from table where id=1
63

И если вы опустите предложение where над вамиможно получить результат от применения каждой функции к каждому из ее аргументов:

q)update result:function .' args from table
function args id result
-----------------------
+        2 2  0  4
*        9 7  1  63
{x+2*y}  1 3  2  7
0 голосов
/ 06 февраля 2019

Чтобы вызвать вашу функцию и аргументы из таблицы, вы можете использовать . apply, например, так:

    q)table:([] function:+;args:enlist 2 2;id:1)

    q)table
    function args id
    ----------------
    +        2 2  1
    q)exec .[first function;first args] from table where id=1
    4

Надеюсь, это поможет.

...