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