跳转至

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 表达式类型,以@开头,必须是函数调用。
  • 返回值

  • 例子:

db := db_session(...);
magic_defer(guard, @db_close(db)); 
这样在调用结束时(也就是guard这个变量释放的时候)调用db_close(db)来释放db变量的资源。 这样可以避免因为遗漏相关db_close而导致的资源泄露。

范例

基本用法

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 初始发布。

技术支持

有任何问题或建议请发送电子邮件到support@mytsl.cn