kdb+q @与. 的使用

说起kdb中的符号, @与. 绝对是里面最重要的两个之一。关于这两个符号的使用,在天书里是成批出现,两个的含义基本相似只有小许的区别,可以类比使用。
本文的主要内容来源于官网链接:
https://code.kx.com/mediawiki/index.php/JB:QforMortals2/functions#Functional_Forms_of_Amend
https://code.kx.com/mediawiki/index.php/Reference/trap
本文主要包括下面内容:

 1. 作为动词使用
 2. @与 . 结合二元函数函数使用(Dyadic Functions) 
 3. @与 . 结合一元函数使用(Monadic Functions) 
 4. 作为Trap使用。也就是其他语言的Try Catch。 

1. 作为动词使用:

我们先要了解一个事情就是数组和函数其实本质上是一样的东西,例子如下:

       L:(1 2;3 4 5; 6)
        L[0]
1 2
        L[0 2]
1 2
6
        L 0 2
1 2
6
        L[1;2]
5
        f:{x*x}
        f[0]
0
        f[0 2] //传入的x是一个数组。
0 4
        f 0 2
0 4
        g:{x+y}
        g[1;2]
3

它们都是用[]传入参数而已。。。。
有了这样的认识,后面就好办了。
L@0 与L[0] 等价。
L@0 2 与 L[0 2] 等价。
f@0 与 f[0] 等。
f@0 4 与 f[0 4] 等价 。
同样的对于字典,表格,有键值表格也都是一样的,类比即可所以@ 与[]是一样的意思,更多例子如下:

     d:`a`b`c!10 20 30
        d@`b
20

        t:([]c1:1 2 3; c2:`a`b`c)
        t@1
c1| 2
c2| b

        kt:([k:`a`b`c]f:1.1 2.2 3.3)
        kt@`c
f| 3.3

但是点(.)就不同了。

L@0 2  //返回  
1 2
6

L . 1 2 //返回
5   //记住L:(1 2;3 4 5; 6) ,所以.的意思就是定位到索引[1;2]然后把那个元素拿出来。


g . 1 2        // 所以在这里.的意思是吧数组1 2 转为g的第一个参数和第二个参数分别穿进去。
3 

所以对于数组点的意思就是定位到索引[1;2]然后把那个元素拿出来。
对于函数,点的意思就是把数组转为参数穿进去。
更多例子见下面:

        L1:(1;2 3;(4; 5 6))
        L1 . 2 1 1
6

        L2:(1;2 3;`a`b!(4;5 6))
        L2 . (2;`b;1)
6
     dd:`a`b`c!(1 2;1.1 2.2 3.3;`aa`bb!10 20)
        dd . (`a;1)
2
        dd . (`c`bb)
20

    t:([]c1:1 2 3;c2:`a`b`c)
        t . (1;`c2)
`b

2. @与.结合二元函数函数使用(Dyadic Functions)

@函数格式如下:

 @[L;I;f;y]

第一个参数是一个类似list,数组,表格,字典啥的,表格包括物理表和内存表。。。
第二个参数是第一个参数的索引,如果是字典就是键值,
第三个参数是二元函数f;f的第一个参数是L[I] ;f的第二个参数是y。
所以这个形式也可以有如下的等价写法:

 L[I] f y   //把第一个参数写在左边,实际上应该不行。
f[L[I];y]
//或者: 记住@ 与[]是等价的。
(L@I) f y
f[L@I;y]

使用例子如下:

L:100 200 300 400
 I:1 2
@[L;I;+;42 43]
100 242 343 400
    @[L;I;:;42 43]                                        //这种情况下L没更新,返回的是更新后的。
100 42 43 400
   L
100 200 300 400
@[`L;I;:;42]                / update L 直接更新L
`L
        L
100 42 42 400

    d:`a`b`c!10 20 30
        @[d;`a`c;+;9]
a| 19
b| 20
c| 39
        t:([] c1:`a`b`c; c2:10 20 30)
        @[t;0;:;(`aa;100)]
c1 c2
------
aa 100
b  20
c  30

点函数格式如下:

.[L;I;f;y]

与上面一样,可比较。

(L . I) f y     / binary operator
f[L . I;y]      / dyadic function

使用方法结合之前所讲也很容易理解:

  L:(100 200;300 400 500)
        I1:1 2
        I2:(1;0 2)
        .[L;I1;+;42]
100 200
300 400 542
        .[L;I2;+;42 43]
100 200
342 400 543

  .[L;I2;:;42 43]                      //这种情况下L没更新,返回的是更新后的。
100 200
42 400 43

   L
100 200
300 400 500
     L:(100 200;300 400 500)
        .[`L;I1;:;42]                / update L 直接更新L
`L
        L
100 200
300 400 42

   d:`a`b`c!(100 200;300 400 500;600)
        .[d;(`b;1);+;42]
a| 100 200
b| 300 442 500
c| 600

3. @与. 结合一元函数使用(Monadic Functions)

@与一元函数结合的形式如下:
@[L;I;f]

跟上面一样,我们也可以用下面表示更接地气。只是把上面的f从二元函数换为1元函数而已。

 f L[I]                / written as unary verb
 f[L[I]]                / written as mondaic function
 f[L@I]

例子:

 L:101 102 103
        I:0 2
        @[L;I;neg]
-101 102 -103

  d:`a`b`c!10 20 30
    @[d;`a`c;neg]
a| -10
b| 20
c| -30

点(.)与一元函数结合的形式如下:
 .[L;I;f]

更通俗如下:

 f[L . I]

例子:

 L:(100 200;300 400 500)
        I:1 2
        .[L;I;neg]
100 200
300 400 -500

d:`a`b`c!(100 200;300 400 500;600)
        .[d;(`b;1 2);neg]
a| 100 200
b| 300 -400 -500
c| 600
4.作为Trap使用。也就是其他语言的Try Catch。

@与点(.)的第一个参数是函数,第二个参数是第一个函数的参数,第三个参数是如果执行该函数失败就返回后面的第三个参数,至于区别就是执行函数的参数传递方式是@还是点的方式,如果是@只能传一个参数(就是中间那个参数)
例子:

q)@[string;42;`err]
"42"
.[*;(42;42);`err]
1764
q)@[{x+1};`aa;`err]
`err
.[{x+y};(1;2);`err] //第一个参数传给x,第二个参数传给y
3
q)@[{x[0]+x[1]};(1;2);`err]       //如果想用@又想传多个参数只能这样写。
3
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容