提升变量、函数(Uplevel)语法
语法
- 提升变量 : uplevel#1 变量名1, 变量名2, ....;
home := "/opt/tinysoft";
println("home={}", uplevel_var());
function uplevel_var();
begin
uplevel#1 home;
return home;
end;
打印:
home=/opt/tinysoft
通过uplevel#1 home把这个变量变成了调用这个函数的上一层函数的对应变量。
目前只支持提升一级,不排除以后会支持提升更多层级。
特别支持:0级代表最顶层,例如uplevel#0。
home := "/opt/tinysoft";
uplevel_func() uplevel;
println("home={}", home);
eval(&"println('home2={}', home2)");
function uplevel_func();
begin
home := "c:\\tinysoft";
home2 := "ok";
end;
打印:
home=c:\tinysoft
home2=ok
通过把函数调用提升一级到调用者这级,可以访问调用者的所有变量,如果调用者没有定义这些变量,会在调用者自动加上这些变量。
被提升的函数必须是无调用参数的(是的,都可以访问调用者的全部变量了,还要什么参数啊)。
- 闭包:在匿名函数中使用uplevel可以实现闭包。
count := MyCount();
println("count={}", call(count));
println("count={}", call(count));
function MyCount();
begin
x := 1;
return function ()
begin
uplevel#1 x;
return x++;
end;
end;
打印:
count=1
count=2
安全
- 提升变量要求相关变量必须先在上一级函数定义,否则会报错,不会发生访问越界的问题,所以是安全的。
- 提升函数调用在函数调用前会在上一级先创建还没定义的变量,也不会发生访问越界的问题,所以也是安全。
用例
- 可以用来在子函数中共享变量,当脚本语言使用的时候特别有用(无须在子函数定义变量,可以在脚本最开始的地方定义相关变量,可以集中管理,不会散布在各个子函数中,查找不方便,修改起来更头大)。
- 可以用在调用回调函数时,这样无须传递大量变量。
- 数据的初始化。