- 类型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
ab
c11hq)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 (a
bc!10 20 30)99hq)type ([k:
ab
c] v:10 20 30)99h任何表的类型都是98h。q)type ([] c1:a
bc; 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)
shortint
long$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#0
long$()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:
gaapl
msftibmq)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$
msftaapl
aaplibm
ibmaapl
gg
gibm
gmsft
msftaapl
msft..可以通过强制转换为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:
gaapl
msftibmq)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:
gaapl
msftibmq)type
sym1$1000000?sym121hq)sym2:a
bcq)type
sym2$c-22h从不同域创建的枚举是不同的,即使他们的组成都相同q)sym1:
cb
aq)sym2:c
baq)ev1:
sym1$a
ba
caq)ev2:
sym2$a
ba
caq)ev1=ev211111bq)ev1~ev20b6. 更新一个枚举的列表一个对u简单的改变,可以改变枚举v中对应的所有内容q)sym:
gaapl
msftibmq)ev:
sym$g
gmsft
ibmaapl
aaplmsft
ibmmsft
gibm
g..q)sym[0]:twitq)sym
twitaapl
msftibmq)ev
sym$twit
twitmsft
ibmaapl
aaplmsft
ibmmsft
twitibm
twit..相反,则需要对v的每一处进行更新q)vg
gmsft
ibmaapl
aaplmsft
ibmmsft
gibm
g…q)@[v; where v=g; :;
twit]7. 动态向枚举域添加直接向枚举append一个域中没出现过的元素时会报错q)sym:g
aaplmsft
ibmq)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?g
sym$gq)sym,
gq)sym?
ibmaapl
sym$ibm
aaplq)symg
ibmaaplq)
sym?g
msftsym$
gmsftq)sym
gibm
aaplmsft8. 恢复一个枚举可以通过value来恢复一个枚举对应的源symbol列表q)sym:
gaapl
msftibmq)v:1000000?symq)ev:
sym$vq)value evaapl
gmsft
msftibm
msftmsft
msftmsft
msftg
ibmibm
ibm..q)v~value ev1b