magic_plugin
TSL语言的跨平台实现的“魔法参数”插件。大家可以用“魔法参数”来丰富函数参数的设计以方便调用。“魔法参数”是以@开头的参数,在TSL语言中是一种特定的表达式类型,具体格式如下:
@参数名(变量或者简单的数值类型和函数调用, ...) -> "注解"
->
注解是可选的。
参数有以下约定:
- 如果是变量的话,必须是第一个参数。
- 数值类型支持整数、浮点数、字符串类型。其他类型可以先赋值给变量,再通过变量来传递。
- 函数调用的话,必须是无参数的调用。如果是带参数的,可以先赋值给变量,再通过变量来传递。
有这样的约定是为了尽量保证“魔法参数”写起来简洁明了。
例如:
client_call(c, @close(), @stock("SZ000001"), @time(20210101T), @cycle(cy_1m()));
寓意是调用close方法,分别设置stock参数、time参数、cycle参数,代码是自描述的,清晰明了。
dbi_exec(db, "select 1", @into_i32(x)) // x = 1
寓意是把查询结果输出到变量x中。
安装
(已集成到mytsl
发行版中)
动态库文件:Windows: magic_plugin.dll 或者 Linux: libmagic_plugin.so,把相关的动态库文件拷贝到执行服务器或者TSL目录的plugin目录。
(如果需要下载兼容正式版的Windows版本的动态库文件请访问这里)。
使用指南
提供的TSL函数:
magic_arg
magic_arg(param, [n])
: 解析魔法参数。
-
参数列表
参数 描述 param 魔法参数,或者参数数组,例如系统变量params。 n 如果是参数数组,指定的下标;如果不是数组,不需要这个参数。 -
返回值
数组类型:
下标 值 0 魔法参数名称 1 变量的索引 2 相关值数组 3 注解(如果有) -
例子
假设有变量x,值是100,它的变量索引值是1(变量索引值是编译器决定的,用户不能修改)。
- 对于@name(x),返回的内容是["name", 1, array(100)], 变量是x,索引值是1。
- 对于@name(1),返回的内容是["name", -1, array(1)], 因为参数不是变量,索引值是负数,可以通过是否负数来判断传递的参数是否变量类型。
- 可以多个参数,@name(x, "ok"),返回的内容是["name", 1, array(100,"ok")]。
- 包含注解:@name(x, "ok") -> "myname",返回的内容是["name", 1, array(100,"ok"), "myname"]。
magic_set
magic_set(n, value)
: 设置魔法变量的值。
-
参数列表
参数 描述 n 变量索引值,通过magic_arg得到。 value 要设置的值。 -
返回值
无
magic_get
magic_get(n)
: 返回魔法变量的值。
-
参数列表
参数 描述 n 变量索引值,通过magic_arg得到。 -
返回值
魔法参数的值
magic_defer
magic_defer(var, @defer)
: 在函数返回时调用相关函数,这样可以在这时释放资源。
-
参数列表
参数 描述 var 变量,用来保存调用方法。 defer 表达式类型,以@开头,必须是函数调用。 -
返回值
无
-
例子:
范例
基本用法
z := array(1,2,3);
y := my(1, 2, @name(x, "ok"), @table(z));
println("x={},y={}", x, y);
function my();
begin
x := magic_arg(params, 2);
z := magic_arg(params, 3);
magic_set(x[1], 200);
return magic_get(z[1]);
end;
打印:
x=200,y=array(1,2,3)
defer范例
x := "f$1";
magic_defer(guard, @fclose(x));
f1();
function f1();
begin
x := "f$2";
magic_defer(guard, @fclose(x));
end;
function fclose(f);
begin
println("fclose {}", f);
end;
打印:
fclose f$2
fclose f$1
附录
修改历史
- 2021-8-26 初始发布。