5.3.2eval函数

集算器中的eval(x, …)函数,可以将x计算出的字符串转为表达式,并计算出它的值。函数eval和宏的使用有类似之处,它们都会生成一个表达式,不同的是,宏只改变部分表达式,而eval是一个函数,在计算它时会生成一个新的表达式并返回其计算结果,而且可以在这个表达式中使用参数。

既然eval函数在计算时需要生成一个表达式,所以在使用时,表达式x的计算结果必须是字符串,如:

 

A

B

1

[+,-,*,/]

=A1(rand(4)+1)

2

=rand(1000)

=rand(1000)

3

=eval("A2"+B1+"B2")

 

仍然是随机生成一个四则运算表达式,在A3中计算结果。

B1A2B2中的结果如下:

  

A3中可以看到eval()函数与前面使用宏时的不同,此时A3中即为计算893+466的结果:

 

eval函数的功能比宏更为强大,在生成的表达式中使用参数时,可以实现类似自定义函数的功能,如:

 

A

1

=eval("?.count(~>5)",[2,3,4,5,6,7,8])

2

=eval("if (?1>0 && ?2>0 && ?3>0 && ?1+?2>?3 && ?1+?3>?2 && ?2+?3>?1)",3,2,5)

A1中,用eval函数计算一个系列中大于5的成员个数,eval生成的表达式中?代表使用的参数。A2中判断3个参数能否构成一个三角形的三边长,其中?1?2?3分别代表第1个,第2个和第3个参数。A1A2中的计算结果如下:

 

 

在使用eval函数时,生成的表达式会在每一次运算时解析,因此,它可以循环使用,如:

 

A

B

1

4779736

AL

2

710231

AK

3

6392017

AZ

4

2915918

AR

5

37253956

CA

6

=[A1:A5].pselect@a(~>5000000)

 

7

=A6.(eval("B"+string(A6.~)))

 

此时,A7中的结果正是我们想要的: