#### 系统相关函数

##### 内容

- 数据类型函数
- 数据类型转换函数
- 复制函数
- 随机函数
- 条件选择函数
- 表达式相关函数
- 性能优化相关函数
- 函数库路径
- 调用堆栈

##### 数据类型函数

###### 内容

- DataType
- ifInt
- ifInt64
- ifReal
- ifNumber
- ifString
- ifArray
- ifNil
- ifExp
- ifGraph
- ifGraphGroup
- ifBinary
- ifMatrix
- ifObj
- GetOleObject
- CreateComObject
- CreateMatrix
- MatrixToArray
- GetMatrixFields
- CreateBinary
- ConvertDataToBuf
- ConvertBufToData
- None类型

###### DataType

用途：返回数据类型编号，支持数组遍历模式。
参数：

- value：输入数据
- mode：遍历模式（可选；-1 对第一维逐项判断；1 对每个元素判断）
  返回：类型编号或类型数组。

范例

```tsl
// 当参数为数组型变量时，返回数组类型对应的整数5。
a := array(34, 12); // 定义a为一个数组
result := DataType(a);
return result; // 5

// 当参数为整数型变量时，返回整数类型对应的整数0。
a := 23; // 定义a为一个整数
result := DataType(a);
return result; // 0

// 对数组第一维度数据进行类型判断
t := array(1, 3.14, "A", (1, 2, 3), nil);
return DataType(t, -1);

// 对数组中每一数据进行类型判断
t := array(1, 3.14, "A", (1, 2, 3), nil);
return DataType(t, 1);
```

###### ifInt

用途：判断是否为 32 位整数类型。
参数：

- value：输入数据
- mode：遍历模式（可选；-1 对第一维逐项判断；1 对每个元素判断）
  返回：布尔值或布尔数组。

范例

范例一：

```tsl
// 判断是否为32位整数类型
r1 := ifInt(1);
r2 := ifInt(3.14);
r3 := ifInt("A");
r4 := ifInt(array(1, 2, 3));
return array(r1, r2, r3, r4);
// 结果：array(1,0,0,0)
```

范例二：

```tsl
// 对数组第一维度数据进行类型判断
t := array(1, 3.14, "A", (1, 2, 3), nil);
return ifInt(t, -1);
// 结果：array(1,0,0,0,0)
```

范例三：

```tsl
// 对数组中每一数据进行类型判断
t := array(1, 3.14, "A", (1, 2.1, 3), nil);
return ifInt(t, 1);
// 结果：array(1,0,0,(1,0,1),0)
```

###### ifInt64

用途：判断是否为 64 位整数类型。
参数：

- value：输入数据
- mode：遍历模式（可选；-1 对第一维逐项判断；1 对每个元素判断）
  返回：布尔值或布尔数组。

范例

```tsl
// 当参数为整数类型变量时，返回true。
a := 23L; // 定义a为一个64位整数
return ifInt64(a);

// 当参数为非整数型变量时，返回false。
a := 2.3; // 定义a为一个非64位整数
return ifInt64(a);

// 对数组第一维度数据进行类型判断
t := array(1, 3L, "A", (1, 2, 3), nil);
return ifInt64(t, -1);
// 结果：array(0,1,0,0,0)

// 对数组中每一数据进行类型判断
t := array(1, 3L, "A", (1, 2L, 3), nil);
return ifInt64(t, 1);
// 结果：array(0,1,0,(0,1,0),0)
```

###### ifReal

用途：判断是否为 实数类型。
参数：

- value：输入数据
- mode：遍历模式（可选；-1 对第一维逐项判断；1 对每个元素判断）
  返回：布尔值或布尔数组。

范例

```tsl
// 当参数为实数类型变量时，返回true。
a := 2.233; // 定义a为一个实数
result := ifReal(a);
return result;

// 当参数为非整数型变量时，返回false。
a := array(23, 54, 67); // 定义a为一个非实数
result := ifReal(a);
return result;

// 对数组第一维度数据进行类型判断
t := array(1, 3.56, "A", (1, 2, 3), nil);
return ifReal(t, -1);
// 结果：array(0,1,0,0,0)

// 对数组中每一数据进行类型判断
t := array(1, 3.56, "A", (1, 2.14, 3), nil);
return ifReal(t, 1);
// 结果：array(0,1,0,(0,1,0),0)
```

###### ifNumber

用途：判断是否为 数字（整数或实数）类型。
参数：

- value：输入数据
- mode：遍历模式（可选；-1 对第一维逐项判断；1 对每个元素判断）
  返回：布尔值或布尔数组。

范例

```tsl
// 当参数为数字类型(整数或者实数)变量时，返回true。
a := 2.233; // 定义a为一个实数
result := ifNumber(a);
return result;

// 当参数为非数字类型(整数或者实数)变量时，返回false。
a := array(23, 54, 67); // 定义a为一个非数字类型
result := ifNumber(a);
return result;

// 对数组第一维度数据进行类型判断
t := array(1, 3.56, "A", (1, 2, 3), nil);
return ifNumber(t, -1);
// 结果：array(1,1,0,0,0)

// 对数组中每一数据进行类型判断,nan也为数字类型
t := array(1, 3.56, "A", (nan, 2.14, "C"), nil);
return ifNumber(t, 1);
// 结果：array(1,1,0,(1,1,0),0)
```

###### ifString

用途：判断是否为 字符串类型。
参数：

- value：输入数据
- mode：遍历模式（可选；-1 对第一维逐项判断；1 对每个元素判断）
  返回：布尔值或布尔数组。

范例

```tsl
// 当参数为字符串类型变量时，返回true。
a := 'test'; // 定义a为一个字符串
result := ifString(a);
return result;

// 当参数为非字符串类型变量时，返回false。
a := array(23, 54, 67); // 定义a为一个非字符串
result := ifString(a);
return result;

// 对数组第一维度数据进行类型判断
t := array(1, 3.56, "A", (1, 2, 3), nil);
return ifString(t, -1);
// 结果：array(0,0,1,0,0)

// 对数组中每一数据进行类型判断
t := array(1, 3.56, "A", (nan, 2.14, "C"), nil);
return ifString(t, 1);
// 结果：array(0,0,1,(0,0,1),0)
```

###### ifArray

用途：判断是否为 数组类型。
参数：

- value：输入数据
- mode：遍历模式（可选；-1 对第一维逐项判断；1 对每个元素判断）
  返回：布尔值或布尔数组。

范例

```tsl
// 当参数为数组类型变量时，返回true。
a := array(23, 54, 67); // 定义a为一个数组
result := ifArray(a);
return result;

// 当参数为非数组类型变量时，返回false。
a := 34; // 定义a为一个非数组
result := ifArray(a);
return result;

// 对数组第一维度数据进行类型判断
t := array(1, 3.56, "A", (1, "C", 3.14), nil);
return ifArray(t, -1);
// 结果：array(0,0,0,1,0)

// 对数组中每一数据进行类型判断
t := array(1, 3.56, "A", (nan, 2.14, "C"), nil);
return ifArray(t, 1);
// 结果：array(0,0,0,(0,0,0),0)
```

###### ifNil

用途：判断是否为 Nil类型。
参数：

- value：输入数据
- mode：遍历模式（可选；-1 对第一维逐项判断；1 对每个元素判断）
  返回：布尔值或布尔数组。

范例

```tsl
// 当参数为空时，返回true。
result := ifNil(nil); // 函数参数为空
return result;

// 当参数不为空时，返回false。
a := 34; // 函数参数不为空
result := ifNil(a);
return result;

// 对数组第一维度数据进行类型判断
t := array(1, 3.16, "A", (nil, "C", 3.14), nil);
return ifNil(t, -1);
// 结果：array(0,0,0,0,1)

// 对数组中每一数据进行类型判断
t := array(1, 3.56, "A", (nil, 2.14, "C"), nil);
return ifNil(t, 1);
// 结果：array(0,0,0,(1,0,0),1)
```

###### ifExp

用途：判断是否为 表达式类型。
参数：

- value：输入数据
- mode：遍历模式（可选；-1 对第一维逐项判断；1 对每个元素判断）
  返回：布尔值或布尔数组。

范例

```tsl
// 当参数是一个表达式类型时，返回true。
a := @'dfhdv' + 'dbf'; // 函数参数a为一个表达式
result := ifExp(a);
return result;

// 当参数不是一个表达式类型时，返回false。
a := 'sdhv' + 'dbf'; // 函数参数a不为表达式
result := ifExp(a);
return result;

// 对数组第一维度数据进行类型判断
t := array(1, 3.16, @"A", (nil, @"C", 3.14), nil);
return ifExp(t, -1);
// 结果：array(0,0,1,0,0)

// 对数组中每一数据进行类型判断
t := array(1, 3.56, @"A", (nil, 2.14, @"C"), nil);
return ifExp(t, 1);
// 结果：array(0,0,1,(0,0,1),0)
```

###### ifGraph

用途：判断是否为 图形类型。
参数：

- value：输入数据
- mode：遍历模式（可选；-1 对第一维逐项判断；1 对每个元素判断）
  返回：布尔值或布尔数组。

范例

```tsl
// 当参数是一个图形类型时，返回true。
GData := Nday2('MA5', MA( close() , 5 ) );
g1 := graph( gtLine() , "MA5", Gdata , gfColor() , clBlue() );
result := ifGraph(g1);
return result;

// 当参数不是一个图形类型时，返回false。
a := 'sdhv' + 'dbf'; // 函数参数a不为图形类型
result := ifGraph(a);
return result;
```

参考TGraph

###### ifGraphGroup

用途：判断是否为 图形组类型。
参数：

- value：输入数据
- mode：遍历模式（可选；-1 对第一维逐项判断；1 对每个元素判断）
  返回：布尔值或布尔数组。

范例

```tsl
// 当参数是一个图形组合类型时，返回true。
VolData := Nday2(GfVol() , Vol() , gfColor() , ifthen ( Close() > Open() , ClRed() , ClGreen() ) );
MAVOL := Nday2('MA5', MA ( Vol() , 5 ) );
VOLGraph := Graph(gtBar(), 'VOLGraph', VolData);
MAVOLGraph := Graph(gtLine(), 'MA5Graph', MAVOL, gfColor(), clBlue());
g1 := GraphGroup(VOLGraph, MAVOLGraph, gfMinValue(), 0);
// 调用函GraphGroup创建一个图形组合类型变量g1
result := ifGraphGroup(g1);
return result;

GData := Nday2('MA5', MA( close() , 5 ) );
g1 := graph( gtLine() , "MA5", Gdata , gfColor() , clBlue() );
result := ifGraphGroup(g1);
return result;
// 返回0
```

参考TGraphGroup

###### ifBinary

用途：判断是否为 二进制/Buffer类型。
参数：

- value：输入数据
- mode：遍历模式（可选；-1 对第一维逐项判断；1 对每个元素判断）
  返回：布尔值或布尔数组。

范例

```tsl
// 当参数是一个二进制类型时，返回true。
a := binary('111111'); // 函数参数a为二进制类型
result := ifBinary(a);
return result;

// 当参数不是一个二进制类型时，返回false。
a := 'sdhv'; // 函数参数a不为二进制类型
result := ifBinary(a);
return result;

// 对数组第一维度数据进行类型判断
b := Binary("3.14");
t := array(1, b, "A", (nil, b, 3.14), nil);
return ifBinary(t, -1);
// 结果：array(0,1,0,0,0)

// 对数组中每一数据进行类型判断
b := Binary("3.14");
t := array(1, b, "A", (nil, 2.14, b), nil);
return ifBinary(t, 1);
// 结果：array(0,1,0,(0,0,1),0)
```

参考Binary

###### ifMatrix

用途：判断是否为 Matrix类型。
参数：

- value：输入数据
- mode：遍历模式（可选；-1 对第一维逐项判断；1 对每个元素判断）
  返回：布尔值或布尔数组。

范例

```tsl
// 当参数是一个Matrix类型时，返回true。
a := CreateMatrix(3, 4); // 使用CreateMatrix创建一个Matrix类型变量
result := ifMatrix(a);
return result;

// 当参数不是一个Matrix类型时，返回false。
a := 'sdhv'; // 函数参数a不为Matrix类型
result := ifMatrix(a);
return result;
```

###### ifObj

用途：判断是否为对象类型。
参数：

- value：输入数据
- mode：遍历模式（可选；-1 对第一维逐项判断；1 对每个元素判断）
  返回：布尔值或布尔数组。

范例

```tsl
// 当参数是一个对象类型时，返回true。
type Function14 = class()//声明类
function SetName(newName);
begin
    name := newName;
end;
end;
Obj := CreateObject('Function14'); // 使用CreateObject函数创建上面类Function14的对象
result := ifObj(Obj);
return result;

// 当参数不是一个对象类型时，返回false。
a := 'sdhv'; // 函数参数a不为对象类型
result := ifObj(a);
return result;
```

参考ComObj

###### GetOleObject

用途：获取已注册的 OLE/COM 对象实例（仅 Windows）。
参数：

- prog_id：COM ProgID（如 "Word.Application"）
- flags：选项标记（可选，通常为 0）
- out_obj：输出对象变量
  返回：是否获取成功（1/0）。

###### CreateComObject

用途：创建新的 OLE/COM 对象实例（仅 Windows）。
参数：

- prog_id：COM ProgID（如 "Word.Application"）
  返回：COM 对象实例；失败返回 nil。

说明：COM 对象仅在 Windows 可用，Linux 不支持。

###### CreateMatrix

用途：创建 Matrix 类型数据，可指定列索引与初始值。
参数：

- rows：行数
- cols：列数
- cols_value：列序列（可选）
- values：初始化值序列（可选，按行列顺序）
  返回：Matrix 对象。

范例

对比范例一与范例二，即Matrix与矩阵类型的比较

范例一：Matrix

```tsl
// 当没有ColsValue参数，返回的MATRIX的行和列的下标为从0开始的序列
return CreateMatrix(2, 3);
```

范例二：矩阵

```tsl
return nils(3, 2);
```

范例三：

```tsl
// 有ColsValue参数并初始化该Matrix时，返回的MATRIX的列序列为ColsValue数组中//的字符串或整数
return CreateMatrix(3, 4, array('s', 'd', 'f'), 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);
```

###### MatrixToArray

用途：将 Matrix 转换为数组。
参数：

- matrix：Matrix 数据
  返回：数组。

范例

```tsl
// 使用CreateMatrix创建一个Matrix，把这个Matrix转换为一个数组后返回该数组。
a := CreateMatrix(3, 4, array('s', 'd', 'f'), 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);
return MatrixToArray(a);

// 把TS的矩阵转化成Matrix类型数据
a := ones(5, 5);
return mselect * from a end;
```

###### GetMatrixFields

用途：获取 Matrix 的字段（列名）列表。
参数：

- matrix：Matrix 数据
  返回：字段名数组。

###### CreateBinary

用途：创建 Binary 缓冲区。
参数：

- size：字节长度
  返回：Binary 数据。

###### ConvertDataToBuf

用途：按指定类型将数据编码为内存 Buffer。
参数：

- value：输入数据
- type_name：类型名称
  返回：Binary Buffer。

范例

```tsl
// 将一个数据转换成内存存贮的BUFFER并返回
return ConvertDataToBuf(1.5343, 'Currency');
```

###### ConvertBufToData

用途：按指定类型将 Buffer 解码为数据。
参数：

- buffer：Binary Buffer
- type_name：类型名称
  返回：解析后的数据。

###### None类型

None类型是一种极为特殊的特性，不参与运算，仅在特殊场景传递。None类型本身可以包含一个整数。

目前用于对象算符重载[]的数组设置算符时候，重载函数送入的第一个参数是索引值，第二个参数在非最后一级时设置为None类型，用于描述级别信息（最后一级送入的是要设置的值）。

####### 内容

- ifNone
- GetNone

####### ifNone

用途：判断是否为 None 类型。
参数：

- value：输入数据
  返回：布尔值。

具体应用可参考：FAQ：对象算符重载数组set算符时none类型的应用实例

####### GetNone

用途：获取 None 类型值（可携带整数标记）。
参数：

- tag：整数标记（可选）
  返回：None 值。

具体应用可参考：FAQ：对象算符重载数组set算符时none类型的应用实例

##### 数据类型转换函数

###### 内容

- Integer
- Int64
- Real
- String
- WideString
- Binary
- SetPrecision
- ToSTM
- ToSTN
- ToXML
- STM
- STN
- XML
- ExportCsv
- ImportCsv

###### Integer

用途：将数值转换为整数。
参数：

- value：输入数值

返回：整数。

范例

```tsl
return Integer(123.456); // 返回值为整型数据：123。
```

###### Int64

用途：将数值转换为 64 位整数。
参数：

- value：输入数值

返回：64 位整数。

范例

```tsl
return Int64(123); // 返回值为64位整型数据：123。
```

###### Real

用途：将数值转换为实数。
参数：

- value：输入数值

返回：实数。

范例

```tsl
return Real(123); // 返回值为实数数据：123.00
```

###### String

用途：将数据转换为字符串。
参数：

- value：输入数据

返回：字符串。

范例

```tsl
return String(L'abcd');
// 返回值为字符串：abcd。
```

###### WideString

用途：将数据转换为 Unicode 字符串。
参数：

- value：输入数据

返回：Unicode 字符串。

范例

```tsl
return WideString('abcd');
// 返回值为Unicode字符串：L’abcd’。
```

###### Binary

用途：将数据转换为二进制流。
参数：

- value：输入数据

返回：Binary 数据。

范例

```tsl
return Binary('111111'); // 返回值为二进制流。
```

###### SetPrecision

用途：设置数值的小数精度。
参数：

- value：输入数值
- digits：小数位数

返回：按精度处理后的数值。

范例

```tsl
return SetPrecision(123.4567, 3); // 返回值为保留3位小数点后的实数：123.457。
```

###### ToSTM

用途：将数据序列化为 STM 二进制流。
参数：

- value：输入数据
- mode：序列化模式（可选）
- precision：小数位数（可选）

返回：STM 二进制流。

范例

```tsl
return ToSTM(array(1, 23, 4, 5, 6, 7, )); // 返回以.stm为后缀名的二进制文件。
```

可选参数的应用

```tsl
t := rand(4, 5);
s := ToSTM(t, 0, 1, 2); // 用新流模式，且保留两位小数
return stm(s);
```

返回如下：

###### ToSTN

用途：将数值格式化为 STN 字符串。
参数：

- value：输入数值
- digits：小数位数（可选）

返回：字符串。

范例

范例一：

```tsl
return ToSTN(12345); // 返回值为字符串：’12345’。
```

范例二：

```tsl
return ToSTN(1.2345, 2); // 返回值为字符串：’1.23’。
```

###### ToXML

用途：将数据转换为 XML 字符串表示。
参数：

- value：待转换的数据

返回：XML 字符串。

范例

```tsl
return ToXML("this is XML document");
// 返回值示例：
// <?xml version = "1.0"encoding = "GB2312"?>
// <TSXML Copyright = "Generated by ShenZhen Tinysoft Corp,Ltd. All rights reserved."type = "STRING"VALUE = "this is XML document" />
```

差异说明仅windows中支持，Linux中暂不支持。

###### STM

###### STN

###### XML

用途：解析 TSXML 字符串并返回内容。
参数：

- xml_text：TSXML 字符串

返回：解析结果值。

范例

```tsl
return XML('<?xml version="1.0" encoding="GB2312"?>'
    + '<TSXML Copyright = "Generated by ShenZhen Tinysoft Corp,Ltd. All rights reserved."type = "STRING"VALUE = "this is XML document" /> ');
// 返回值示例："this is a document"。
```

差异说明仅windows中支持，Linux中暂不支持。

###### ExportCsv

用途：将数组导出为 CSV 格式字符串。
参数：

- data：数组数据
- out_text：输出字符串（引用返回）
- include_index：是否包含下标（可选，1/0）
- include_header：是否包含表头（可选，1/0）

返回：是否成功（1/0）。

范例

范例01：一维数组转换成csv格式字符串

```tsl
data := array(1, 2, "3", "A", 9, 8);
ret := ExportCsv(data, s);
if ret then return s;
else return ret;
```

范例02：二维数组转换成csv格式字符串

```tsl
data := array((2, 5, 0), (3, 2, 1), (4, 7, 2));
ret := ExportCsv(data, s);
if ret then return s;
else return ret;
```

范例03：转换成csv格式字符串，结果包含数组下标信息

```tsl
data := array("A":(2, 5, 0), "B":(3, 2, 1), "C":(4, 7, 2));
ret := ExportCsv(data, s, 1);
if ret then return s;
else return ret;
```

范例04：转换成csv格式字符串，结果不包含字段头部信息

```tsl
data := array((2, 5, 0), (3, 2, 1), (4, 7, 2));
ret := ExportCsv(data, s, 0, 0);
if ret then return s;
else return ret;
```

###### ImportCsv

用途：将 CSV 字符串解析为数组。
参数：

- csv_text：CSV 字符串
- out_data：输出数组（引用返回）
- has_header：是否包含表头（可选，1/0）

返回：是否成功（1/0）。

范例

范例01：将指定csv格式字符串转换成二维数组

```tsl
s := "0,1,2\r\n2,5,0\r\n3,2,1\r\n4,7,2\r\n";
ret := ImportCsv(s, data);
if ret then return data;
else return ret;
```

范例02：读取本地csv文件，并将其转换成数组

本地csv文件内容如下：

```tsl
filepath := "D:\\test\\csv\\data.csv";
rdo2 ReadFile(rwRaw(), "", filepath, 0, 1000, s);
ret := ImportCsv(s, data, 1);
if ret then return data;
else return ret;
```

##### 复制函数

###### 内容

- dupValue

###### dupValue

用途：复制值，避免被调用函数修改原变量。
参数：

- value：输入值

返回：复制后的值。

范例

```tsl
// 主函数
function test1();
begin
    a := 1;
    b := 2;
    c := 3;
    d := test2(dupValue(a), b, c);
    return array(a, b, c, d);
end;
// 返回array(1,20,3,33)
// 被调用函数
function test2(a, b, c);
begin
    a := 10;
    b := 20;
    return a + b + c;
end;
```

由test1执行出来的结果可以知道，a变量，由于使用了dupValue复制值，虽然在子函数test2中改变了其值，但在主函数中的a变量仍然没变。而b变量则发生了改变。

##### 随机函数

###### 内容

- randomize
- random
- RandomFrom

###### randomize

参考random RandomFrom

###### random

用途：生成随机数。
参数：value 为上限（可选）；不传则生成 0~1 之间随机实数。
返回：随机实数或随机整数。

定义1：random():Real;

说明：返回一个0到1之间的随机数

返回：实数。

定义2：random(value:Integer):Integer;

说明：如果无参数，则返回0->1之间的随机实数,如果参数为整数，则返回0->value之间的随机整数（不包括value），即左闭右开，如random(1)只会返回0。

参数：

- max_value：上限（可选；不传返回 0~1 之间随机实数；传整数返回 [0, max_value) 随机整数）

范例：

```tsl
// 表达式无参数
return random(); // 返回值为0到1随机实数：0.124562。

// 表达式有参数
return random(100); // 返回值为随机的0到100的整型数据：94。
```

参考：RandomFrom

###### RandomFrom

用途：从数组中随机取一个元素。
参数：

- items：候选数组

返回：随机元素。

范例

```tsl
items := array('a', 'b', 'c', 'd', 'e', 'f');
return RandomFrom(items);
// 返回值为随机返回 items 中一个字符：'b'。
```

参考random

##### 条件选择函数

###### 内容

- IfThen
- IfThen3

###### IfThen

用途：条件成立返回 true_value，否则返回 false_value。
参数：

- condition：判断条件
- true_value：条件成立时返回值
- false_value：条件不成立时返回值

返回：true_value 或 false_value。

范例

```tsl
left_value := 1;
right_value := 2;
return IfThen(left_value > right_value, left_value, right_value);
// 返回：2。
```

###### IfThen3

用途：比较两个值，返回大/等/小对应结果。
参数：

- left：左值
- right：右值
- greater_value：left > right 时返回
- equal_value：left = right 时返回
- less_value：left < right 时返回

返回：对应比较结果的值。

范例

```tsl
return IfThen3(1, 2, '左大', '相等', '右大');
// 返回：’右大’
```

##### 表达式相关函数

###### 内容

- Eval
- Call
- CallInArray
- Invoke
- Invokeinarray
- SafeEval
- DoubleVariableExecute
- MultipleExecute
- SingleVariableExecute
- SafeSetSysParam

###### Eval

用途：计算表达式或表达式字符串并返回结果。
参数：

- expr：表达式（@）或表达式字符串（&）

返回：表达式计算结果。

范例

范例01：

```tsl
// 表达式是字符串表达式。&转换字符串为表达式。
A := '1';
B := '2';
return Eval(&('A+B')); // 返回值为表达式的结果：'12'。
```

范例02：

```tsl
// 表达式是语句表达式
A := 1;
B := 2; // A，B均为整型数据
return Eval(@(A + B));
// 返回值为整型数据：3，@(A+B)可以是一个执行语句块，调用该函数会得到执行语句块后的结果。
```

范例03：//字符串表达式中进行return返回。

```tsl
s := 'a := 1;b := 2;return a+b;';
return Eval(&s);
```

结果：3

范例4：跨函数中传导引用参数和变量

```tsl
setsysparam(pn_stock(), "SH600507");
return eval_test("StockZf4(t)", 20250723t);
function eval_test(e, endt);
begin
    t := specdate(ref(sp_time(), 1), endt);
    return array(datetostr(t), Eval(&e));
end;
```

参考Call CallInArray

###### Call

用途：按函数名字符串或函数指针调用函数。
参数：

- func：函数名字符串或函数指针
- args：调用参数列表

返回：函数返回值。

范例

```tsl
// 采用字符串方式来调用函数
return Call("IntTodate", 20140101);
// 返回41640

// 采用函数指针来调用函数
F := ThisFunction(IntToDate);
return Call(F, 20140101);
// 返回41640
```

参考Eval THISFUNCTION CallInArray

###### CallInArray

用途：以参数数组调用指定函数（含函数名或函数变量）。
参数：

- func：函数名字符串或函数指针
- args：参数数组

返回：函数调用结果。

范例

范例1：根据函数名称调用，第一个参数为函数名称

```tsl
return CallInArray("StrToIntDef", array('1234', 999));
// 返回1234
```

范例2：调用匿名函数，第一个参数是指向匿名函数的变量

```tsl
{func1是一个变量，我们将一个函数体赋值给这个变量，变量型函数我们称为匿名函数，匿名函数的语句段放在某个函数体内，调用的时候，需使用call或callinarray函数进行调用。
// 这个例子中，a是一个变量，当a在func1匿名函数中，并在匿名函数体重修改a，使a := a + 10; ，但执行完匿名函数后，a参数的值是不变的，即不支持变参，所以最后返回a为10，b为20。
callinarray在这里执行匿名函数func1时，其参数不需要跟在func1之后。}
a := 10;
func1 := function(a) begin
    a := a + 10;
    return a;
end;
b := CallInArray(func1, array(a));
return array(a, b);
// array(10,20)
```

范例3：根据函数指针调用，第一个参数为函数指针

```tsl
{thisfunction()函数可获得函数指针；由于调用的是stockzf3，该函数没有参数，因此，callinarray的第二个参数给空数组}
setsysparam(pn_stock(), 'SH000001');
return CallInArray(thisfunction(stockzf3), array());
```

范例04：调用时指定参数传参

```tsl
function CCC(a, b, c, d); // 展示各参数的值
begin
    echo "A:", a, " B:", b, " C:", c, " D:", d;
    return b;
end;
// 调用
return CallInArray("CCC", array("b":1, "d":4));
```

返回：1

打印结果：A:<NIL> B:1 C:<NIL> D:40

解析：callINArray在通过数组传参数时，可以通过指定下标的方式给指定参数进行传参，下标对应函数定义中的变量名。

上面示例中，只对参数b与d进行了传参，其它两参数没有进行传值，所以是nil。

参考Eval THISFUNCTION Call

###### Invoke

用途：调用对象成员方法或设置成员属性。
参数：

- obj：目标对象
- name：成员名
- mode：0 调用方法；1 设置成员
- args：方法参数或设置值

返回：调用结果或设置结果。

范例

范例01：设置成员变量后调用成员方法并返回结果

```tsl
obj := new classTest();
// 设置成员变量name的值为"张三"
Invoke(obj, "name", 1, "张三");
// 设置成员变量age的值为18
Invoke(obj, "age", 1, 18);
// 设置成员变量sid的值为"ts001"
Invoke(obj, "sid", 1, "ts001");
// 执行单参数重载成员方法fun
a := Invoke(obj, "fun", 0, "name");
// 执行双参数重载成员方法fun
b := Invoke(obj, "fun", 0, "name", "age");
// 执行三参数重载成员方法fun
c := Invoke(obj, "fun", 0, "name", "age", "studentID");
return array(a, b, c);
type classTest = class
name;
age;
sID;
function fun(a);overload;
begin
    s := "\r\n" + a + ":" + name;
    echo s;
    return s;
end;
function fun(a, b);overload;
begin
    s := "\r\n" + a + ":" + name + " " + b + ":" + floattostr(age);
    echo s;
    return s;
end;
function fun(a, b, c);overload;
begin
    s := "\r\n" + a + ":" + name + " " + b + ":" + floattostr(age) + " " + c + ":" + sID;
    echo s;
    return s;
end;
end;
```

打印：

返回:参考Invokeinarray

###### Invokeinarray

用途：以参数数组调用对象成员方法或设置成员属性。
参数：

- obj：目标对象
- name：成员名
- mode：0 调用方法；1 设置成员
- args：参数数组

返回：调用结果或设置结果。

范例

范例01：设置成员变量后调用成员方法并返回结果

```tsl
obj := new classTest();
// 设置成员变量name的值为"张三"
Invokeinarray(obj, "name", 1, array("张三"));
// 设置成员变量age的值为18
Invokeinarray(obj, "age", 1, array(18));
// 设置成员变量sid的值为"ts001"
Invokeinarray(obj, "sid", 1, array("ts001"));
// 执行单参数重载成员方法fun
a := Invokeinarray(obj, "fun", 0, array("name"));
// 执行双参数重载成员方法fun
b := Invokeinarray(obj, "fun", 0, array("name", "age"));
// 执行三参数重载成员方法fun
c := Invokeinarray(obj, "fun", 0, array("name", "age", "studentID"));
return array(a, b, c);
type classTest = class
name;
age;
sID;
function fun(a);overload;
begin
    s := "\r\n" + a + ":" + name;
    echo s;
    return s;
end;
function fun(a, b);overload;
begin
    s := "\r\n" + a + ":" + name + " " + b + ":" + floattostr(age);
    echo s;
    return s;
end;
function fun(a, b, c);overload;
begin
    s := "\r\n" + a + ":" + name + " " + b + ":" + floattostr(age) + " " + c + ":" + sID;
    echo s;
    return s;
end;
end;
```

打印：

name:张三

name:张三 age:18

name:张三 age:18 studentID:ts001返回:

范例02：命名参数调用的方式

```tsl
// 调用
obj := new classTestB();
return Invokeinarray(obj, "fun", 0, array("c":3, "b":2, "a":1)); // 命名参数的调用
// 类实现
type classTestB = class
function fun(a, b, c);overload;
begin
    return array(a, b, c);
end;
end;
```

返回:array(1,2,3)参考Invoke

###### SafeEval

用途：安全执行表达式或表达式字符串，执行失败返回 nil。
参数：

- expr：表达式（@）或表达式字符串（&）
  返回：表达式结果或 nil。

###### DoubleVariableExecute

用途：设置两个系统参数数组并计算表达式。
参数：

- arr1：第一个参数值数组
- param1：系统参数函数（如 pn_Stock()）
- arr2：第二个参数值数组
- expr：表达式

返回：结果数组。

算法

根据参数Arr和TimeArr的长度设置不同的系统参数，求表达式的值范例

```tsl
stocks := array(getbk('上证50'));
time_arr := MarketTradeDayQk(20220101T, 20221211T);
return DoubleVariableExecute(stocks, pn_Stock(), time_arr, @close());
```

返回:（部分结果截图）

###### MultipleExecute

用途：基于系统参数 STOCKS/BKS/TIMES 批量计算表达式。
参数：

- expr：表达式
  返回：结果数组。

算法

(1)获得'STOCKS'，'BKS'，'TIMES'对应的系统参数；

(2)根据以上系统参数是否是数组型，设置不同的系统参数，求表达式的值

###### SingleVariableExecute

用途：设置一个系统参数数组并计算表达式。
参数：

- arr：参数值数组
- param：系统参数函数（如 pn_Stock()）
- expr：表达式

返回：结果数组。

范例

```tsl
// Arr中存储的是代码，获取2019年3月1日，Arr中所有代码的收盘价
arr := array('SZ000001', 'SZ000002');
return SingleVariableExecute(arr, pn_stock(), @close());
```

###### SafeSetSysParam

用途：安全设置系统参数（与 SetSysParam 类似，失败不抛异常）。
参数：

- param_name：参数名或系统参数函数
- value：参数值
  返回：设置结果（成功为 1，失败为 0）。

##### 性能优化相关函数

###### 内容

- SetProfiler
- GetProfilerInfo

###### SetProfiler

用途：设置性能分析开关与统计范围。
参数：

- flags：统计选项位掩码

返回：无。

范例

范例01：1+2+4的优化信息返回

```tsl
SetProfiler(7);
a := array();
SetSysParam(PN_Stock(), 'SH000001');
for i := 20000101t to 20200721T do
begin
    if not spec(istradeday(i), 'SH000001') then continue;
    echo specdate(close(), i);
end;
return 1;
```

结果：times为函数运行的次数，seconds为运行时间，op为指令的优化信息，type为函数类型。

范例02：内置对象的优化信息返回

```tsl
SetProfiler(8);
o := new TStringList();
o.text := "Tinysoft"; // 给对象的属性赋值
o.DelimitedText := 'A=abc,B=123,C=abc,F=996,E=abd';
o.Add("G=666");
return 1;
```

优化信息如：

###### GetProfilerInfo

用途：获取性能分析信息。
参数：

- mode：可选；传 1 仅返回信息不弹窗

返回：性能分析信息。

范例

范例01：不弹出profiler窗口

```tsl
setprofiler(7); // 记录TSL源代码函数调用+二进制函数的调用+指令调用的优化信息
a := 99;
b := inttostr(a); // inttostr是函数
a := rand(1000, 1); // rand是指令
a := select * from a where [0] > 0.5 end; // select是指令
setsysparam(pn_stock(), "SZ000002");
b := nday3(100, close()); // nday3也算是指令，不是函数 ,close是函数
return GetProfilerInfo(1);
```

范例02：弹出profiler窗口

```tsl
setprofiler(7); // 记录TSL源代码函数调用+二进制函数的调用+指令调用的优化信息
a := 99;
b := inttostr(a); // inttostr是函数
a := rand(1000, 1); // rand是指令
a := select * from a where [0] > 0.5 end; // select是指令
setsysparam(pn_stock(), "SZ000002");
b := nday3(100, close()); // nday3也算是指令，不是函数 ,close是函数
t := GetProfilerInfo();
return b;
```

返回结果：返回程序结果的同时，另外弹出profiler窗口

##### 函数库路径

###### 内容

- sysgettsllibpath
- syssettsllibpath

###### sysgettsllibpath

用途：获取当前函数库查找路径。
参数：无。
返回：当前查找路径字符串。

范例

```tsl
echo "当前查找路径：", sysgettsllibpath(), '\r\n';
```

###### syssettsllibpath

用途：设置函数库查找路径（支持分号分隔的多个目录）。
参数：

- path_list：路径列表字符串（分号分隔）

返回：设置前的查找路径字符串。

范例

```tsl
a := 198.86;
b := -22.34;
echo "当前查找路径：", sysgettsllibpath(), '\r\n';
syssettsllibpath("C:\\DoTSL\\otherTest\\;");
echo "当前查找路径：", sysgettsllibpath(), '\r\n';
try
    v := TestTsfsum(a, b);
    echo "TestTsfsum执行成功：", v, '\r\n';
except
    echo ExceptObject.ErrInfo, '\r\n';
end;
return "执行完毕";
```

##### 调用堆栈
