2.8.1循环计算

循环计算序列时,在循环函数参数中可以引用序列成员:~ 表示当前序列成员,也称为基成员# 表示当前成员的序号。

循环计算序表或排列时,可以用字段名F直接引用当前记录的字段值,需要注意的是,如果在排列中 引用字段值,排列中的所有记录都需要存在字段F。在引用时,也可以用~.F, r.F A.F,表明引用的字段属于哪个记录r,或者哪个排列(序表) A

特别强调:如果内存中有与字段同名的变量,则不可以在循环函数中使用该字段的省略写法,必须写全~.FA.F,仅写F将被解释为同名的变量。

由结果构成序列

对序列A中的每个成员循环计算,并返回由结果构成的新序列,可以用函数A.(x) 实现。如:

 

A

1

[2,5,-3,8]

2

=A1.()

3

=A1.(#*#)

4

=A1.(power(~,3))

A2函数中没有循环表达式,直接返回A1中的序表,A3中计算序号的平方值构成的序列, A4中计算成员的立方构成的序列。A1,A2,A3,A4中的数据如下:

    

其中,A1A2中显示的其实是同一个序列,A3A4都是由计算结果新生成的序列。

 

在序表或排列中,同样可以用函数A.(x) 循环计算,此时表达式中可以引用记录的字段。如:

 

A

1

=demo.query("select EID,NAME,SURNAME,GENDER, BIRTHDAY,STATE from EMPLOYEE")

2

=A1.(STATE)

3

=A1.(age(BIRTHDAY))

A1中是从数据库获得的序表:

A2计算出每位员工所在的州,A3计算出每位员工的年龄,A2A3中的数据如下:

 

可以发现,在序表或序列中,A.(x) 返回的结果是序列而不是序表,结果中是没有字段名的。

循环后返回原序列

循环序列A中的每个成员,还可以使用A.run(x) 函数,此时也会循环执行表达式x,但是会返回原序列A。如:

 

A

1

[2,5,-3,8]

2

=A1.run(~=~*2)

程序执行后,A1A2中的序列是相同的:

 

由于run函数返回原序列而不是结果序列,因此通常用来修改序列中的成员,如本例中将原序列成员增大为2倍。

 

在序表或序列中经常使用A.run(x) 函数来循环修改记录,如:

 

A

1

=demo.query("select EID,NAME,SURNAME,GENDER, BIRTHDAY,STATE from EMPLOYEE")

2

>A1.run(GENDER=case(GENDER,"F":"Female","M":"Male"),BIRTHDAY= string(BIRTHDAY,"dd/MM/yyyy"))

A2中,用run函数将GENDER字段的值改为MaleFemale,同时将BIRTHDAY字段更改格式,执行后,A1中的序表被修改为如下结果:

相对引用

在循环计算时,可以用A[i]~[i]根据来引用序列中当前成员之后序号相差i的成员,i可以是负数。如:

 

A

1

[2,5,-3,8]

2

=A1.(~[1]-~)

3

>A1.run(~=~+~[-1])

A2中计算的是原序列A1中,后一个成员与当前成员的差值序列:

A3中的表达式以>开头,调用run函数时只修改原序列而不返回,执行后A1中的序列变为了原来成员的累加值序列:

在序列或排列中,除了用~[i]相对引用1条记录,还可以用F[i]相对引用1条记录的F字段,相当于A[i].F。如:

 

A

1

=demo.query("select EID,NAME,SURNAME,GENDER, BIRTHDAY,STATE from EMPLOYEE")

2

=A1.sort(BIRTHDAY)

3

=A2.(interval(BIRTHDAY[-1],BIRTHDAY))

4

=A2.(interval(~[-1].BIRTHDAY,BIRTHDAY))

A2中将序表中的数据按生日排序:

A3A4中的表达式是等价的,计算出每位员工比年龄排在他前面1位的员工,生日差多少天:

如果A3中表达式改用BIRTHDAY[1]则表示年龄排在他后面1位员工的生日。

 

除了相对引用1条记录,类似的,也可以引用多条记录。此时可以用A[a:b], ~[a:b],引用当前成员后的第a个到第b个成员组成的序列或排列。如:

 

A

1

=demo.query("select EID,NAME,SURNAME,GENDER, BIRTHDAY,STATE from EMPLOYEE")

2

=A1.groups(year(BIRTHDAY);count(~):Count)

3

=A2.(~[-1,1])

4

=A2.(Count[-1,1])

A2中统计出每年出生的员工总数:

A3中则选出每年的前后1年区间内的统计数据:

类似的,也可以用F[…]来相对引用多条记录的字段,如A4中选出每年前后1年区间内的员工总数: