Я думаю, что проблема возникает из-за отсутствия так называемого «лексического определения» в q / kdb.По сути, это означает, что локальная переменная не видна в теле локальной функции, определенной в той же области видимости.Внутренняя функция здесь не может «видеть» N там, где вы ее определили.
Возможно, более кратким подходом будет следующий
{(floor acos -1)#'x}[7 8 9]
В противном случае ваш обходной путь работает просто отлично, когда вы передаете локальную переменную в качестве аргумента.Это можно немного ускорить, заметив, что вы пытаетесь применить оператор «take» к каждому из аргументов справа, поэтому вы можете применить оператор «каждое право» /:...
q)\t:1000000 N:floor acos -1;f:{[N;x] N#/:x};f[N;7 8 9]
1308
q)\t:1000000 N:floor acos -1;{y#x}[;N]each 7 8 9
1835
Это может быть дополнительно оптимизировано с помощью оператора «each both», который будет оценивать оба аргумента оператора take попарно, расширяя аргумент atom для соответствия длине списка.
Это то, чтов примере с Рахулсом:
q)\t:1000000 foo:{#'[floor acos -1;x]};foo 7 8 9
1012
Надеюсь, это поможет.