摘要:作用于任意兩個(gè)元素,當(dāng)兩個(gè)元素相同時(shí)返回不同時(shí)返回。但對(duì)于日期類(lèi)型,比較的是時(shí)間上的先后關(guān)系,而不是其值對(duì)于元素的對(duì)比,語(yǔ)言的容限是。
0. "Operators and Verbs Are Functions"
在q中,操作符(Operators)又稱(chēng)為動(dòng)詞(Verbs), 讀表達(dá)式3+2按照從右到左的順序:3 被加到 2,其中3是一個(gè)名詞(主語(yǔ)),操作符+是一個(gè)動(dòng)詞,2是一個(gè)名詞(賓語(yǔ))。
1. 函數(shù)標(biāo)識(shí)
下面介紹三種以后常見(jiàn)的函數(shù)分類(lèi):
monadic函數(shù): f[x] 或者 f x
dyadic函數(shù): g[x;y] 或者 x g y
atomic函數(shù): 作用于數(shù)據(jù)結(jié)構(gòu)的那個(gè)元素
例如+是一個(gè)dyadic函數(shù),它有如下兩種表達(dá)方法,都是等價(jià)的:
q) 2+3 q) +[2;3]
第二個(gè)式子很神奇,類(lèi)似的表達(dá)方式還有:
q)=[2;3] 0b
更神奇的是,可以將二元運(yùn)算符的前綴和中綴組合在一起:
q)(2+)[3]
5
q)(2+)3
5
2. atomic函數(shù)的拓展
用法見(jiàn)如下幾個(gè)例子, 比較容易理解:
q)neg 1 2 3 -1 -2 -3 q)1 2 3+10 20 30 11 22 33 q)1 2 3+10 20 30 40 "length
q)100+1 2 3 101 102 103 q)1 2 3+100 101 102 1031. 運(yùn)算符優(yōu)先級(jí)
沒(méi)有運(yùn)算符優(yōu)先級(jí)!
1. Left-of-Right解讀方法
由于q語(yǔ)言沒(méi)有運(yùn)算符優(yōu)先級(jí),但是有一個(gè)簡(jiǎn)單的法則來(lái)解讀任何表達(dá)式:
Expressions are evaluated left-of-right
which equates to
Expressions are evaluated right-to-left
類(lèi)似于解讀復(fù)合函數(shù)f(g(x)), 可以被解讀為f of g of x, 同樣可以被解讀為x to g to f。
注意: 當(dāng)表達(dá)式的結(jié)果是中綴運(yùn)算符的左操作元時(shí),必須對(duì)該表達(dá)式加括號(hào),否則中綴運(yùn)算符會(huì)作用在表達(dá)式最右邊的一個(gè)元素上。如下例所示:
q)2*3+4 14 q)(2*3)+4 10 q)4+2*3 10
2. 沒(méi)有運(yùn)算符優(yōu)先級(jí)的原因
運(yùn)算符優(yōu)先級(jí)的開(kāi)銷(xiāo)較大,只有當(dāng)解析完整個(gè)表達(dá)式后才能開(kāi)始計(jì)算
操作符的優(yōu)先級(jí)往往會(huì)被括號(hào)所覆蓋
一些編程語(yǔ)言允許用戶自定義dyadic運(yùn)算符,這就需要拓展運(yùn)算符的優(yōu)先級(jí)別來(lái)cover用戶定義的運(yùn)算符,這就導(dǎo)致了復(fù)雜性。
2. Match ~作用于任意兩個(gè)q元素,當(dāng)兩個(gè)元素相同(identical)時(shí)返回1b, 不同時(shí)返回0b。對(duì)于相互match的兩個(gè)元素,它們需要同樣的類(lèi)型,同樣的大小,同樣的值, 但也可能占據(jù)不同的儲(chǔ)存空間,這也意味著,拷貝項(xiàng)在q中被認(rèn)為是相同的。
q)42~40+2 1b q)42~42h 0b q)42f~42.0 1b q)42~`42 0b q)`42~"42" 0b q)4 2~2 4 0b q)42~(4 2;(1 0)) 0b q)(4 2)~(4;2*1) 1b q)(())~enlist () 0b q)(1; 2 3 4)~(1; (2; 3; 4)) 1b q)(1 2;3 4)~(1;2 3 4) 0b3. 相等和關(guān)系運(yùn)算符
1. 相等=和不等<>
相等運(yùn)算符=和Match運(yùn)算符~不同之處在于,相等運(yùn)算符=是atom-wise的,即atomic函數(shù)。
相等運(yùn)算符校驗(yàn)的是兩個(gè)元素是否是值相等的,并不管元素的類(lèi)型:
q)42=42i 1b q)42=42.0 1b q)42=0x42 0b q)42="*" 1b
最后一項(xiàng)說(shuō)明了,char "*"的underlying值和42的underlying值是一樣的。
但對(duì)于日期類(lèi)型,比較的是時(shí)間上的先后關(guān)系,而不是其underlying值
q)2000.01.01=2000.01.01D00:00:00.000000000 1b q)2015.01.01<2015.02m 1b q)12:00:00=12:00:00.000 1b
對(duì)于float元素的對(duì)比,q語(yǔ)言的容限是10^-14。
2. 非零 not
如果對(duì)應(yīng)元素的underlying值是0,則返回1b;否則返回0b。
對(duì)于char類(lèi)型,"