集算器中的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中计算结果。
如B1、A2、B2中的结果如下:
在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个参数。A1和A2中的计算结果如下:
在使用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中的结果正是我们想要的: