是否可以在 q 脚本中编写 k 代码?

Is it possible to write k code within q script?

我尝试从 q 函数调用 k 的计数函数,但出现错误。

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

所以,我有以下问题:
1.q脚本里面可以写k代码吗?
2、如果是,那么q脚本中怎么写k代码呢?在 q script/function 中使用 k 代码是否使 script/function 更高效和优化?

  1. 是的,这是可能的。我想你要找的是
{
 (#:) 1 2 3 4 5
}[]

这将对列表进行计数

  1. 在速度方面,对于像count这样的函数,影响似乎可以忽略不计。
q)\t:100000 {(#:) 1 2 3 4 5}[]
29
q)\t:100000 {count 1 2 3 4 5}[]
25

希望这能回答您的问题

可以。一种方法是在 k:

中定义整个函数
q)k)f:{# 1 2 3}
q)f
k){# 1 2 3}
q)f[]
3

除了 Eoins 和 pamphlets 方法,还可以将字符串执行为 k 代码:

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

然而,将代码编写为 k 代码实际上没有任何优势 - 最好坚持使用 q

A k 函数可以通过 Terry 布局的方法在 lambda 中定义,或者通常通过 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