1. 类型1. 基础数据类型2. type操作符type操作符返回一个short,并且如果对象是一个atom,则返回负数;是一个list则返回正数。q)type 42-7hq)type 10 20 307hq)type 98.6-9hq)type 1.1 2.2 3.39hq)type a-11hq)type abc11hq)type “z”-10hq)type “abc"10h任何常规列表(general list)的类型都是0h。q)type (42h; 42i; 42j)0hq)type (1 2 3; 10 20 30)0hq)type ()0h任何字典(包括键表)的类型,都是99h。q)type (abc!10 20 30)99hq)type ([k:abc] v:10 20 30)99h任何表的类型都是98h。q)type ([] c1:abc; c2:10 20 30)98h3. 变量的类型q语言是动态类型语言,所以变量的类型也会随着其被赋的值而改变。全局变量会被储存在一个一般的q字典中。可以通过命令get . 来查看全局变量和对应的值,也可以通过操作符value来查看q)value .q)a:42q)value .a| 42q)f:{xx}q)value .a| 42f| {x*x}..2. Cast转换使用dyadic操作符$,右边的运算元是原始值,而左边的运算元是目标类型。有三种方式指定目标类型:数值的short类型char类型值类型的symbol名称1. Casts that Widen因为目标类型比原始类型要宽,所以在这种情况下没有信息丢失。q)7h$42i / int to long42q)6h$42 / long to int42iq)9h$42 / long to float42fq)"j"$42i42q)"i"$4242iq)"f"$4242fmore readable:q)int$4242iq)long$42i42q)float$4242f2. 不同类型之间的转换 char类型的underlying value是ASCII码,所以我们可以将char与integer互相转换。q)char$42"*"q)long$"\n"10同样,也可以将日期与integer互相转换q)date$02000.01.01q)int$2001.01.01 / millennium occurred on leap year366i3. Casts that Narrowq)long$12.34512q)short$12345678932767h将数值类型转换为boolean类型,任何0值都是0b,其余的值都是1b。q)boolean$00bq)boolean$0.00bq)boolean$1231bq)boolean$-12.3451b也可以从复杂类型中提取成分q)date$2015.01.02D10:20:30.1234567892015.01.02q)year$2015.01.022015iq)month$2015.01.022015.01mq)mm$2015.01.021iq)dd$2015.01.022iq)hh$10:20:30.12345678910iq)minute$10:20:30.12345678910:20q)uu$10:20:30.12345678920iq)second$10:20:30.12345678910:20:30q)ss$10:20:30.12345678930i4. Casting Integral Infq)int$0Wh32767iq)int$-0Wh-32767iq)long$0Wi2147483647q)long$-0Wi-21474836475. 强制类型回想在向一个简单列表中赋值的时候需要严格match列表的类型q)L:10 20 30 40q)L[1]:42h’typeq)L,:43h’type这种情况可以通过强制类型转换来实现:q)L[1]:(type L)$42hq)L,:(type L)$43h6. Cast is Atomiccast对其右运算元是atomic的:q)“i”$10 20 3010 20 30iq)float$(42j; 42i; 42j)42 42 42fcast对其左运算元也是atomic的:q)shortintlong$4242h42i42q)“ijf”$98.699i9998.6Cast对左右运算元同步的atomic:q)“ijf”$10 20 3010i2030f3. 数据和文本的转换1. 数据转换为string使用函数string可以将任何q元素转换为一个合适的文本表示。string的一些特征:转换结果是一个char的列表,不会是单个的char。转换结果不会包含任何q类型提示符或者其它装饰符。string作用在一个真正的string(list of char)上可能不会得到你想要的结果q)string 42"42"q)string 4,“4"q)string 42i"42"q)a:2.0q)string a,“2"q)f:{xx}q)string f”{xx}“string是伪atomic的,它会作用在运算元的每个atom数据上,但对每个atom元素的运算结果都返回一个listq)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构建Symbol从string去创建symbol是一个foolproof的做法。 但是也是唯一的去创建带有空格或者其它特殊符号symbol的方法。其转换使用 $ 。q)$“abc”abcqq)$“Hello World”Hello World注意带有转义符的转换:q)$“Zaphod "Z""Zaphod "Z"q)$“Zaphod \n”ZaphodNote: 左右去空格。q)string $” abc ““abc"3. 从String中解析数据使用大写的目标类型作为左运算元,string作为右运算元。q)“J”$“42"42q)“F”$“42"42fq)“F”$“42.0"42fq)“I”$“42.0"0Niq)“I”$” “0Ni日期转换:q)“D”$“12.31.2014"2014.12.31q)“D”$“12-31-2014"2014.12.31q)“D”$“12/31/2014"2014.12.31q)“D”$“12/1/2014"2014.12.31q)“D”$“2014/12/31"2014.12.31可以从字符串中解析一个函数,使用内置的函数value或者parseq)value “{xx}"{xx}q)parse “{xx}"{x*x}4. 创建带类型的空list空的list的类型是0h,但是当append一个元素之后,得到的sigleton列表就是该元素类型的简单列表。q)L:()q)type L0hq)L,:42q)type L7h如果想规定空list的类型,可以使用类似如下语法q)c1:float$()q)c1,:42'typeq)c1:98.6同样,下面的操作也能产生带类型的空listq)0#0long$()q)0#0.0float$()q)0#``symbol$()5. Enumerations1. 传统的枚举In traditional languages, an enumerated type is a way of associating a series of names with a corresponding set of integral values.2. 数据标准化q)u:gaaplmsftibmq)v:1000000?uq)k:u?vq)k2 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..上述关系满足映射:v=u*k,使用u和索引k来储存v可以大大节省储存空间,并且提高查找效率。3. Enumerating Symbols将一个symbols列表转换为对应的索引列表的操作称为q中的枚举。它以$(又一重载)作为运算符,使用unique的symbols变量作为左运算元,在变量域的symbol的列表作为右运算元。q)u$vu$msftaaplaaplibmibmaaplgggibmgmsftmsftaaplmsft..可以通过强制转换为int来恢复上述的索引结果q)ev:u$vq)int$ev2 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的简单列表,v是在u中出现的atom或者对应的列表。我们称u为枚举的域(domain),投影 u$ 为在u上的枚举。 应用枚举 u$ 在向量v上可以得到索引列表k。4. 使用枚举的symbolq)sym:gaaplmsftibmq)v:1000000?symq)ev:sym$v枚举的ev可以在几乎所有的场景中代替v。q)v[3]aaplq)ev[3]u$aaplq)v[3]:ibmq)ev[3]:ibmq)v=ibm000100010010011101000010010100000000100100000001000000001100001001011..q)ev=ibm000100010010011101000010010100000000100100000001000000001100001001011..q)where v=aapl4 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=aapl4 5 19 20 21 31 33 34 41 42 43 49 58 59 61 74 81 83 90 94 95 98 114..q)v?aapl4q)ev?aapl4q)v in ibmaapl000111010010011101011110010100010110100101110001010000001111011001011..q)ev in ibmaapl000111010010011101011110010100010110100101110001010000001111011001011..尽管枚举和原始列表是item-wise的相等,但是他们并不identical(不match)q)all v=ev1bq)v~ev0b5. 枚举的类型每一个枚举都会被赋予一个新的数值类的数据类型,从20h开始。20h是留给系统的枚举域的,你自己定义的枚举类型则从21h开始,并且逐个增加。类型的正号为simple list,负号为atom的性质依旧保持。q)sym1:gaaplmsftibmq)type sym1$1000000?sym121hq)sym2:abcq)type sym2$c-22h从不同域创建的枚举是不同的,即使他们的组成都相同q)sym1:cbaq)sym2:cbaq)ev1:sym1$abacaq)ev2:sym2$abacaq)ev1=ev211111bq)ev1~ev20b6. 更新一个枚举的列表一个对u简单的改变,可以改变枚举v中对应的所有内容q)sym:gaaplmsftibmq)ev:sym$ggmsftibmaaplaaplmsftibmmsftgibmg..q)sym[0]:twitq)symtwitaaplmsftibmq)evsym$twittwitmsftibmaaplaaplmsftibmmsfttwitibmtwit..相反,则需要对v的每一处进行更新q)vggmsftibmaaplaaplmsftibmmsftgibmg…q)@[v; where v=g; :; twit]7. 动态向枚举域添加直接向枚举append一个域中没出现过的元素时会报错q)sym:gaaplmsftibmq)v:1000000?symq)ev:sym$vq)v,:twtrq)ev,:twtr'cast正确做法是这个新值必须要先添加进域中q)sym,:twtrq)ev,:twtr如果提前不知道域中的全部值,可以使用?(又一重载)来创建一个动态的域。?的语法与枚举重载符$的语法一样。unique的symbol list的名字作为左运算元,源symbol列表作为右运算元。q)sym:()q)sym$g'castq)sym?gsym$gq)sym,gq)sym?ibmaaplsym$ibmaaplq)symgibmaaplq)sym?gmsftsym$gmsftq)symgibmaaplmsft8. 恢复一个枚举可以通过value来恢复一个枚举对应的源symbol列表q)sym:gaaplmsftibmq)v:1000000?symq)ev:sym$vq)value evaaplgmsftmsftibmmsftmsftmsftmsftmsftgibmibmibm..q)v~value ev1b