摘要:可以通過(guò)命令來(lái)查看全局變量和對(duì)應(yīng)的值,也可以通過(guò)操作符來(lái)查看轉(zhuǎn)換使用操作符,右邊的運(yùn)算元是原始值,而左邊的運(yùn)算元是目標(biāo)類型。從中解析數(shù)據(jù)使用大寫的目標(biāo)類型作為左運(yùn)算元,作為右運(yùn)算元。
1. 類型
1. 基礎(chǔ)數(shù)據(jù)類型
2. type操作符
type操作符返回一個(gè)short,并且如果對(duì)象是一個(gè)atom,則返回負(fù)數(shù);是一個(gè)list則返回正數(shù)。
q)type 42 -7h q)type 10 20 30 7h q)type 98.6 -9h q)type 1.1 2.2 3.3 9h q)type `a -11h q)type `a`b`c 11h q)type "z" -10h q)type "abc" 10h
任何常規(guī)列表(general list)的類型都是0h。
q)type (42h; 42i; 42j) 0h q)type (1 2 3; 10 20 30) 0h q)type () 0h
任何字典(包括鍵表)的類型,都是99h。
q)type (`a`b`c!10 20 30) 99h q)type ([k:`a`b`c] v:10 20 30) 99h
任何表的類型都是98h。
q)type ([] c1:`a`b`c; c2:10 20 30) 98h
3. 變量的類型
q語(yǔ)言是動(dòng)態(tài)類型語(yǔ)言,所以變量的類型也會(huì)隨著其被賦的值而改變。
全局變量會(huì)被儲(chǔ)存在一個(gè)一般的q字典中。可以通過(guò)命令get `. 來(lái)查看全局變量和對(duì)應(yīng)的值,也可以通過(guò)操作符value來(lái)查看
q)value `. q)a:42 q)value `. a| 42 q)f:{x*x} q)value `. a| 42 f| {x*x} ..2. Cast
轉(zhuǎn)換使用dyadic操作符$,右邊的運(yùn)算元是原始值,而左邊的運(yùn)算元是目標(biāo)類型。有三種方式指定目標(biāo)類型:
數(shù)值的short類型
char類型值
類型的symbol名稱
1. Casts that Widen
因?yàn)槟繕?biāo)類型比原始類型要寬,所以在這種情況下沒(méi)有信息丟失。
q)7h$42i / int to long 42 q)6h$42 / long to int 42i q)9h$42 / long to float 42f
q)"j"$42i 42 q)"i"$42 42i q)"f"$42 42f
more readable:
q)`int$42 42i q)`long$42i 42 q)`float$42 42f
2. 不同類型之間的轉(zhuǎn)換
char類型的underlying value是ASCII碼,所以我們可以將char與integer互相轉(zhuǎn)換。
q)`char$42 "*" q)`long$" " 10
同樣,也可以將日期與integer互相轉(zhuǎn)換
q)`date$0 2000.01.01 q)`int$2001.01.01 / millennium occurred on leap year 366i
3. Casts that Narrow
q)`long$12.345 12 q)`short$123456789 32767h
將數(shù)值類型轉(zhuǎn)換為boolean類型,任何0值都是0b,其余的值都是1b。
q)`boolean$0 0b q)`boolean$0.0 0b q)`boolean$123 1b q)`boolean$-12.345 1b
也可以從復(fù)雜類型中提取成分
q)`date$2015.01.02D10:20:30.123456789 2015.01.02 q)`year$2015.01.02 2015i q)`month$2015.01.02 2015.01m q)`mm$2015.01.02 1i q)`dd$2015.01.02 2i q)`hh$10:20:30.123456789 10i q)`minute$10:20:30.123456789 10:20 q)`uu$10:20:30.123456789 20i q)`second$10:20:30.123456789 10:20:30 q)`ss$10:20:30.123456789 30i
4. Casting Integral Inf
q)`int$0Wh 32767i q)`int$-0Wh -32767i q)`long$0Wi 2147483647 q)`long$-0Wi -2147483647
5. 強(qiáng)制類型
回想在向一個(gè)簡(jiǎn)單列表中賦值的時(shí)候需要嚴(yán)格match列表的類型
q)L:10 20 30 40 q)L[1]:42h "type q)L,:43h "type
這種情況可以通過(guò)強(qiáng)制類型轉(zhuǎn)換來(lái)實(shí)現(xiàn):
q)L[1]:(type L)$42h q)L,:(type L)$43h
6. Cast is Atomic
cast對(duì)其右運(yùn)算元是atomic的:
q)"i"$10 20 30 10 20 30i q)`float$(42j; 42i; 42j) 42 42 42f
cast對(duì)其左運(yùn)算元也是atomic的:
q)`short`int`long$42 42h 42i 42 q)"ijf"$98.6 99i 99 98.6
Cast對(duì)左右運(yùn)算元同步的atomic:
q)"ijf"$10 20 30 10i 20 30f3. 數(shù)據(jù)和文本的轉(zhuǎn)換
1. 數(shù)據(jù)轉(zhuǎn)換為string
使用函數(shù)string可以將任何q元素轉(zhuǎn)換為一個(gè)合適的文本表示。string的一些特征:
轉(zhuǎn)換結(jié)果是一個(gè)char的列表,不會(huì)是單個(gè)的char。
轉(zhuǎn)換結(jié)果不會(huì)包含任何q類型提示符或者其它裝飾符。
string作用在一個(gè)真正的string(list of char)上可能不會(huì)得到你想要的結(jié)果
q)string 42 "42" q)string 4 ,"4" q)string 42i "42" q)a:2.0 q)string a ,"2" q)f:{x*x} q)string f "{x*x}"
string是偽atomic的,它會(huì)作用在運(yùn)算元的每個(gè)atom數(shù)據(jù)上,但對(duì)每個(gè)atom元素的運(yùn)算結(jié)果都返回一個(gè)list
q)string 1 2 3 ,"1" ,"2" ,"3" q)string "string" ,"s" ,"t" ,"r" ,"i" ,"n" ,"g" q)string (1 2 3; 10 20 30) ,"1" ,"2" ,"3" "10" "20" "30"
2. 從String構(gòu)建Symbol
從string去創(chuàng)建symbol是一個(gè)foolproof的做法。 但是也是唯一的去創(chuàng)建帶有空格或者其它特殊符號(hào)symbol的方法。其轉(zhuǎn)換使用 `$ 。
q)`$"abc" `abc q q)`$"Hello World" `Hello World
注意帶有轉(zhuǎn)義符的轉(zhuǎn)換:
q)`$"Zaphod "Z"" `Zaphod "Z" q)`$"Zaphod " `Zaphod
Note: 左右去空格。
q)string `$" abc " "abc"
3. 從String中解析數(shù)據(jù)
使用大寫的目標(biāo)類型作為左運(yùn)算元,string作為右運(yùn)算元。
q)"J"$"42" 42 q)"F"$"42" 42f q)"F"$"42.0" 42f q)"I"$"42.0" 0Ni q)"I"$" " 0Ni
日期轉(zhuǎn)換:
q)"D"$"12.31.2014" 2014.12.31 q)"D"$"12-31-2014" 2014.12.31 q)"D"$"12/31/2014" 2014.12.31 q)"D"$"12/1/2014" 2014.12.31 q)"D"$"2014/12/31" 2014.12.31
可以從字符串中解析一個(gè)函數(shù),使用內(nèi)置的函數(shù)value或者parse
q)value "{x*x}" {x*x} q)parse "{x*x}" {x*x}4. 創(chuàng)建帶類型的空l(shuí)ist
空的list的類型是0h,但是當(dāng)append一個(gè)元素之后,得到的sigleton列表就是該元素類型的簡(jiǎn)單列表。
q)L:() q)type L 0h q)L,:42 q)type L 7h
如果想規(guī)定空l(shuí)ist的類型,可以使用類似如下語(yǔ)法
q)c1:`float$() q)c1,:42 "type q)c1:98.6
同樣,下面的操作也能產(chǎn)生帶類型的空l(shuí)ist
q)0#0 `long$() q)0#0.0 `float$() q)0#` `symbol$()5. Enumerations
1. 傳統(tǒng)的枚舉
In traditional languages, an enumerated type is a way of associating a series of names with a corresponding set of integral values.
2. 數(shù)據(jù)標(biāo)準(zhǔn)化
q)u:`g`aapl`msft`ibm q)v:1000000?u q)k:u?v q)k 2 1 1 3 3 1 0 0 0 3 0 2 2 1 2 3 1 0 1 1 2 1 2 0 2 1 1 0 1 1 3 0..
上述關(guān)系滿足映射:v=u*k,使用u和索引k來(lái)儲(chǔ)存v可以大大節(jié)省儲(chǔ)存空間,并且提高查找效率。
3. Enumerating Symbols
將一個(gè)symbols列表轉(zhuǎn)換為對(duì)應(yīng)的索引列表的操作稱為q中的枚舉。它以$(又一重載)作為運(yùn)算符,使用unique的symbols變量作為左運(yùn)算元,在變量域的symbol的列表作為右運(yùn)算元。
q)`u$v `u$`msft`aapl`aapl`ibm`ibm`aapl`g`g`g`ibm`g`msft`msft`aapl`msft..
可以通過(guò)強(qiáng)制轉(zhuǎn)換為int來(lái)恢復(fù)上述的索引結(jié)果
q)ev:`u$v q)`int$ev 2 1 1 3 3 1 0 0 0 3 0 2 2 1 2 3 1 0 1 1 2 1 2 0 2 1 1 0 1 1 3 ..
枚舉symbol的基本形式為: `u$v
其中u是unique symbol的簡(jiǎn)單列表,v是在u中出現(xiàn)的atom或者對(duì)應(yīng)的列表。我們稱u為枚舉的域(domain),投影 `u$ 為在u上的枚舉。 應(yīng)用枚舉 `u$ 在向量v上可以得到索引列表k。
4. 使用枚舉的symbol
q)sym:`g`aapl`msft`ibm q)v:1000000?sym q)ev:`sym$v
枚舉的ev可以在幾乎所有的場(chǎng)景中代替v。
q)v[3] `aapl q)ev[3] `u$`aapl q)v[3]:`ibm q)ev[3]:`ibm q)v=`ibm 000100010010011101000010010100000000100100000001000000001100001001011.. q)ev=`ibm 000100010010011101000010010100000000100100000001000000001100001001011.. q)where v=`aapl 4 5 19 20 21 31 33 34 41 42 43 49 58 59 61 74 81 83 90 94 95 98 114.. q)where ev=`aapl 4 5 19 20 21 31 33 34 41 42 43 49 58 59 61 74 81 83 90 94 95 98 114.. q)v?`aapl 4 q)ev?`aapl 4 q)v in `ibm`aapl 000111010010011101011110010100010110100101110001010000001111011001011.. q)ev in `ibm`aapl 000111010010011101011110010100010110100101110001010000001111011001011..
盡管枚舉和原始列表是item-wise的相等,但是他們并不identical(不match)
q)all v=ev 1b q)v~ev 0b
5. 枚舉的類型
每一個(gè)枚舉都會(huì)被賦予一個(gè)新的數(shù)值類的數(shù)據(jù)類型,從20h開(kāi)始。20h是留給系統(tǒng)的枚舉域的,你自己定義的枚舉類型則從21h開(kāi)始,并且逐個(gè)增加。類型的正號(hào)為simple list,負(fù)號(hào)為atom的性質(zhì)依舊保持。
q)sym1:`g`aapl`msft`ibm q)type `sym1$1000000?sym1 21h q)sym2:`a`b`c q)type `sym2$`c -22h
從不同域創(chuàng)建的枚舉是不同的,即使他們的組成都相同
q)sym1:`c`b`a q)sym2:`c`b`a q)ev1:`sym1$`a`b`a`c`a q)ev2:`sym2$`a`b`a`c`a q)ev1=ev2 11111b q)ev1~ev2 0b
6. 更新一個(gè)枚舉的列表
一個(gè)對(duì)u簡(jiǎn)單的改變,可以改變枚舉v中對(duì)應(yīng)的所有內(nèi)容
q)sym:`g`aapl`msft`ibm q)ev:`sym$`g`g`msft`ibm`aapl`aapl`msft`ibm`msft`g`ibm`g.. q)sym[0]:`twit q)sym `twit`aapl`msft`ibm q)ev `sym$`twit`twit`msft`ibm`aapl`aapl`msft`ibm`msft`twit`ibm`twit..
相反,則需要對(duì)v的每一處進(jìn)行更新
q)v `g`g`msft`ibm`aapl`aapl`msft`ibm`msft`g`ibm`g… q)@[v; where v=`g; :; `twit]
7. 動(dòng)態(tài)向枚舉域添加
直接向枚舉append一個(gè)域中沒(méi)出現(xiàn)過(guò)的元素時(shí)會(huì)報(bào)錯(cuò)
q)sym:`g`aapl`msft`ibm q)v:1000000?sym q)ev:`sym$v q)v,:`twtr q)ev,:`twtr "cast
正確做法是這個(gè)新值必須要先添加進(jìn)域中
q)sym,:`twtr q)ev,:`twtr
如果提前不知道域中的全部值,可以使用?(又一重載)來(lái)創(chuàng)建一個(gè)動(dòng)態(tài)的域。?的語(yǔ)法與枚舉重載符$的語(yǔ)法一樣。unique的symbol list的名字作為左運(yùn)算元,源symbol列表作為右運(yùn)算元。
q)sym:() q)`sym$`g "cast q)`sym?`g `sym$`g q)sym ,`g q)`sym?`ibm`aapl `sym$`ibm`aapl q)sym `g`ibm`aapl q)`sym?`g`msft `sym$`g`msft q)sym `g`ibm`aapl`msft
8. 恢復(fù)一個(gè)枚舉
可以通過(guò)value來(lái)恢復(fù)一個(gè)枚舉對(duì)應(yīng)的源symbol列表
q)sym:`g`aapl`msft`ibm q)v:1000000?sym q)ev:`sym$v q)value ev `aapl`g`msft`msft`ibm`msft`msft`msft`msft`msft`g`ibm`ibm`ibm.. q)v~value ev 1b
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/17989.html
摘要:概述所有的數(shù)據(jù)都是通過(guò)最小單位構(gòu)造。語(yǔ)言中大部分?jǐn)?shù)據(jù)類型與傳統(tǒng)語(yǔ)言類似,但是多出了和相關(guān)的類型,用來(lái)加速時(shí)間序列運(yùn)算。適用的運(yùn)算符僅有數(shù)據(jù)中共有兩種類型數(shù)據(jù),更類似于中的和。其表示值為從千禧年計(jì)數(shù)的納秒數(shù),之前為負(fù)數(shù),之后為正數(shù)。 概述 所有的數(shù)據(jù)都是通過(guò)最小單位atom構(gòu)造。q語(yǔ)言中大部分?jǐn)?shù)據(jù)類型與傳統(tǒng)語(yǔ)言類似,但是多出了date和time相關(guān)的類型,用來(lái)加速時(shí)間序列運(yùn)算。下表給出了...
閱讀 2664·2021-11-24 09:39
閱讀 3510·2021-11-15 11:37
閱讀 2469·2021-10-08 10:04
閱讀 4088·2021-09-09 11:54
閱讀 1948·2021-08-18 10:24
閱讀 1180·2019-08-30 11:02
閱讀 1866·2019-08-29 18:45
閱讀 1766·2019-08-29 16:33