Можно ли написать код в сценарии q? - PullRequest
2 голосов
/ 15 октября 2019

Я пытался вызвать функцию подсчета k из функции q, но это дает ошибку.

{
  "k)"# 1 2 3 4 5 //~ count 1 2 3 4 5
 }[]

Итак, у меня есть следующие вопросы:
1. Можно ли написать k-код в сценарии q?
2. Если да, то как мы можем написать k-код в q-скрипте? и делает ли использование k-кода в q script / function сделать скрипт / функцию более эффективным и оптимизированным?

Ответы [ 4 ]

6 голосов
/ 15 октября 2019
  1. Да, это возможно. Я думаю, что вы ищете это
{
 (#:) 1 2 3 4 5
}[]

Это будет выполнять подсчет в списке

С точки зрения скорости, для таких функций, как count, эффект кажется незначительным.
q)\t:100000 {(#:) 1 2 3 4 5}[]
29
q)\t:100000 {count 1 2 3 4 5}[]
25

Надеюсь, что это ответ на ваш вопрос

2 голосов
/ 16 октября 2019
Функция

A k может быть определена в лямбде с помощью метода, который выложил Терри, или вообще, вызывая определение через value, например, так:

q)mins
&\
q)foo:{[x] value "k)minner:&\\";minner x}
q)foo 1 2 3
1 1 1

Фактически вы можете легкосоздать аккуратную маленькую функцию для создания k функций

q)makeK:{[x;y]value "k)",string[x],"::",string[y]}
q)makeK[`minfoo;&\]
q)minfoo
&\
q)minfoo 1 2 3
1 1 1

Eoins answer - это более удобный способ вызова функциональности k примитивов. Как правило, перенос примитивов в круглых скобках вызовет функциональность k

q)dict:`a`b`c!(1 2 3;1 2 3;1 2 3)
q)flip dict
a b c
-----
1 1 1
2 2 2
3 3 3
q)(+:) dict
a b c
-----
1 1 1
2 2 2
3 3 3
q)(+:)~flip
1b
2 голосов
/ 16 октября 2019

В дополнение к подходам Eoins и pamphlets также возможно выполнять строки в виде k-кода:

q){a:"k" "|1 2 3";a}[]
3 2 1
q)
q){b:("k" "#:")1 2 3;b}[]
3

Однако практически нет никакого преимущества в написании кода в виде k-кода - лучше придерживаться q

1 голос
/ 15 октября 2019

Можно. Одним из подходов является определение всей функции в k:

q)k)f:{# 1 2 3}
q)f
k){# 1 2 3}
q)f[]
3
...