kdb+q 中的函数和右解析
在其他的文章里要花专门的的一段去讲什么是函数和解析语法的优先级我觉得是没有必要的,因为只要稍有编程基础的都会显而易见的理解和快速跳过。但是我觉得对于刚开始学习kdb的人如果对本节的内容没有了解,此后一定会处处踩坑,苦不堪言。解析优先级一般很少提及,或者一般语言默认都是左解析,但是KDB的右解析是它的一大特色,故专门花些笔墨。
1.函数。
(1) 定义函数:
f1:{[a;b]a+b}
f2:{[a;b]show "a+b=",(string a+b);a+b}
f3:{x+y}
这里是定义了一个加法的函数, 输入参数a,参数b返回它们的和。
函数中如果有多句就要用; 隔开,返回的那个不能加;否则返回为空。如f2.
如果形参是x,y, z就不需要强调是参数了,kdb会自动当做第一个,第二个,第三个参数,如f3
(2)函数的调用:
kdb的世界里写法飘逸,随心所欲。
你可以写 f1[1;2]
非常正规标准,就像楷书。
你可以写 f1[1] 2
不走寻常路,也可以执行。 先把1给了第一个参数之后的偏函数再传入2.
你可以写 f1[1][2]
如上所述既然是偏函数,也是函数,自然可以中括号传参数,也可以省掉中括号。
你还可以写 f1[;2] 1
先把第二个参数传入变成偏函数, 再传入第一个参数。
你还可以写 f1 . 1 2
装逼装到家。。。 关于点的操作以后有专门章节详细讲解。f1 . (1;2)与之等价。
你还可以写f1@1;2
怎么让人看不懂怎么写。 关于@的操作以后会有专门章节讲解。
你还可以写 (value `f1)[1;2]
这句话的意思是 从f1的函数名取得f1的函数内容然后传入参数 1 和 2.
对于kdb内置的一些函数还可以左右开弓的写(.q命名空间里的函数可以这样写)如 mod 求余数。
你可以写
mod[10;3]
返回1 。
你可以写
10 mod 3
返回1 。 这就像是其他语言的关键字了,不像函数了,其实也是函数。
它会把左边的当做第一个参数,右边的当做第二个参数。
符号其实也可以当做函数:如 +
你可以写
1+1
也可以写
+[1;2]
或者
+[;4] 1
任意发挥。。。
如 in 也是函数:
in (1;2)
返回 1b ; 1b是bool True的意思。
你可以写
in[1;(1;2)]
或者
in[;(1;2;3)] 1
或者:
in[1;] (1;2;3)
都是一个意思。
2.右解析。
如上大家已经知道写q语言可以任意挥毫,不求拘束。但是太乱kdb 解析器也看不懂就 更比天书还难读了,kdb+的解析器只有个一个原则就是右解析。。。它从右往左读,除了括号(大,中 ,小) 可以改变优先级,其他风雨无阻。
代码1:
3-1+2
返回几? 不是4 是0!!!!
右解析不是吃素的。。。 先算1+2 然后拿3减之。。
代码2:
-1+2
等于几? 不是负3.是1 为啥这次不是右解析? 单独一个减号不是一元函数,所以 这里会把-1当一个整体。
如果是neg 1+2 就是 -3 因为neg单独是一个一元函数。
代码3:
{x-y*x +y}[10;3]
等于多少? -29. 从右往左一点点算。。。
mod:{x-y*x div y} 这是刚提到的mod函数的kdb源码。 div是除法取整。
代码4:
"Hello",string `kdb,"Do you like me?"
并不是我们想要的。
"Hello",(string `kdb),"Do you like me?"
改变了优先级,看起来顺眼了
如果不想打(),写到中间才意识到要打()但是不想把光标移回去了。就这样:
"Hello",string [`kdb],"Do you like me?"
到这里知道kdb+为啥可以这么潇洒了吧,专为懒人服务。。。
没有比写kdb的人更懒的啦。