🎨 style(markdown): format markdown files

This commit is contained in:
csh
2026-01-11 12:58:27 +08:00
parent e3ecd26a88
commit 2b37860331
54 changed files with 10042 additions and 16272 deletions
+263 -208
View File
@@ -94,7 +94,7 @@
- [MTOC](#mtoc-1)
- [MTOC(TICK:double)获得与某个指定的 TICK 之间的秒数](#mtoctickdouble获得与某个指定的-tick-之间的秒数)
- [\_\_line\_\_](#__line__)
- [\_\_stack\_frame](#__stack_frame)
- [\_\_stack_frame](#__stack_frame)
- [面向对象支持的保留字](#面向对象支持的保留字)
- [TYPE](#type)
- [CLASS](#class)
@@ -426,6 +426,7 @@ return Call(a, 1);
```tsl
SysParams["MM"] := 1;等同于 SetSysParam("MM", 1);
```
直接使用 SysParams 来访问和设置系统环境的值的性能会优越于 SetSysParam 和 GetSysParam 函数,尤其当某系统环境变量的值是一个数组的时候。
参见:系统参数设置和获取函数
@@ -752,6 +753,7 @@ var 还可以用来声明变量,在使用 Explicit 编译选项的时候,变
```tsl
echo "Today is ", DateToStr(Today()), "now->", TimeToStr(Now());
```
如果在平台运行,会输出信息到客户端
固定功能用法:
@@ -815,7 +817,7 @@ end;
function teststatic(key);
begin
// 这个变量A的值是一个不需要每次调用重新构造的静态计算,即它右边的表达式不管上层调用多少次,它只执行一次
A :=
A :=
static array("ABCD":1, "BBBB":2, "CCCC":3……..);
return A[key];
end;
@@ -878,6 +880,7 @@ begin
end;
// 使用了全局变量之后,以上的 testglobal 函数会打印出 100。
```
##### _MYMEM_
应用已经使用的内存大小。
@@ -896,6 +899,7 @@ A := 0;
for i := 0 to 99999 do A++;
return MTOC;
```
以上代码可以计算所耗费的秒数
##### MTOC
@@ -954,6 +958,7 @@ return array(TE1, TE2, MTOC);
```tsl
type abcd = class
```
Public
```tsl
@@ -964,6 +969,7 @@ begin
end;
end;
```
###### CLASS
类关键字,用来定义类,见 TYPE。
@@ -1033,6 +1039,7 @@ return ret; // 返回结果:0
property A[:String] read GETA write SETA;
property A[:String] Index 1 read GETA Write SETA;
```
###### SELF
SELF 得到当前的对象。
@@ -1082,82 +1089,82 @@ else return "Canceled";
##### SQL 语法支持保留字
| 相关的关键字 | 含义 |
| --- | --- |
| Select | 查询语句,指定由查询返回的列。详细使用方法见SELECT查询 |
| VSelect | 查询语句,返回一个值 |
| SSelect | 查询语句,返回一维数组 |
| MSelect | 查询语句,返回Matrix类型数组 |
| Distinct | 取唯一值,去重复项 |
| SelectOpt | 返回指定类型值,selectopt(type),type值不同,返回不同类型的值。详见select字句语法。 |
| DRange | Drange(N to M): 从查询结果集中输出从N到M之间的行;<br>Drange(N of M): 从查询结果集中输出从 (N-1)/M * 记录总条数到 N/M * 记录总条数 -1 之间的行; |
| As | 对列命名 |
| From | 数据的来源表 |
| MarketTable | 高频行情数据表 |
| InfoTable | 财务类数据表关键字 |
| TradeTable | 交易明细数据表 |
| SqlTable | 用于与第三方数据库交互的关键字 |
| HugeSqlTable | |
| KeepNull | |
| Datekey | 取行情数据时,指定日期关键字 |
| Of | 取数据时,指定股票关键字 |
| Order | 排序,与by同时使用:order by |
| By | 排序,与order同时使用:order by |
| Where | 条件 |
| Desc | 排序,逆序 |
| Asc | 排序,正序 |
| Group | 分组 |
| Having | 聚集 |
| ChecksumOf | 生成哈希索引 |
| Countof | 记录统计 |
| SumOf | 和 |
| MaxOf | 最大值 |
| StdevOf | 标准差 |
| VarOf | 在险价值 |
| TotalVarOf | |
| NormOf | 平方和的平方根 |
| MedianOf | 中值 |
| AveDevOf | 离散度 |
| GeoMeanOf | 几何平均值 |
| SkewOf | 偏度 |
| KurtosisOf | 峰度 |
| Skew2Of | 偏度 |
| Kurtosis2Of | 峰度 |
| LargeOf | 最大值 |
| PercentileOf | 百分点 |
| QuartileOf | 四分位的值 |
| TrimMeanOf | 返回数据集中的内部平均值,从头尾去掉指定百分比的数据点,再求平均值 |
| CountOf | 记录个数 |
| AvgOf | 平均值 |
| MinOf | 最小值 |
| AggOf | 利用回调函数计算聚集的值 |
| StdevpOf | 统计标准偏差 |
| VarpOf | 统计方差 |
| ModeOf | 众数 |
| DevSqOf | 样本平均值偏差的平方和 |
| HarMeanOf | 调和平均值 |
| Checksum_AggOf | 校验和 |
| SmallOf | 最小值 |
| PercentRankOf | 数据集中X排位的百分点的值 |
| Rankof | 排位 |
| FrequencyOf | 数值区间在数据集中出现的频率 |
| ProductOf | |
| RefOf | 往前取数据 |
| RefsOf | |
| AggValue | 当前参与聚集的列的值 |
| ThisGroup | 指定分组 |
| ThisRow | 当前行的数据值 |
| ThisRowIndex | 当前行的相对索引值 |
| ThisOrder | 当前排序 |
| Insert | 插入数据 |
| InsertFields | 插入数据的字段列表 |
| Values | 设置或者取得Name=Value模式串中指定的Name的Value值 |
| Update | 修改数据 |
| Set | 修改数据 |
| Delete | 删除数据 |
| DeleteOpt | 设定删除数组时是否自动修改下标,SelectOpt对稀疏矩阵用的时候很有意义 |
| FetchFirst | 查询第一条记录 |
| FetchNext | 查询下一条记录 |
| 相关的关键字 | 含义 |
| -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
| Select | 查询语句,指定由查询返回的列。详细使用方法见SELECT查询 |
| VSelect | 查询语句,返回一个值 |
| SSelect | 查询语句,返回一维数组 |
| MSelect | 查询语句,返回Matrix类型数组 |
| Distinct | 取唯一值,去重复项 |
| SelectOpt | 返回指定类型值,selectopt(type),type值不同,返回不同类型的值。详见select字句语法。 |
| DRange | Drange(N to M): 从查询结果集中输出从N到M之间的行;<br>Drange(N of M): 从查询结果集中输出从 (N-1)/M _ 记录总条数到 N/M _ 记录总条数 -1 之间的行; |
| As | 对列命名 |
| From | 数据的来源表 |
| MarketTable | 高频行情数据表 |
| InfoTable | 财务类数据表关键字 |
| TradeTable | 交易明细数据表 |
| SqlTable | 用于与第三方数据库交互的关键字 |
| HugeSqlTable | |
| KeepNull | |
| Datekey | 取行情数据时,指定日期关键字 |
| Of | 取数据时,指定股票关键字 |
| Order | 排序,与by同时使用:order by |
| By | 排序,与order同时使用:order by |
| Where | 条件 |
| Desc | 排序,逆序 |
| Asc | 排序,正序 |
| Group | 分组 |
| Having | 聚集 |
| ChecksumOf | 生成哈希索引 |
| Countof | 记录统计 |
| SumOf | 和 |
| MaxOf | 最大值 |
| StdevOf | 标准差 |
| VarOf | 在险价值 |
| TotalVarOf | |
| NormOf | 平方和的平方根 |
| MedianOf | 中值 |
| AveDevOf | 离散度 |
| GeoMeanOf | 几何平均值 |
| SkewOf | 偏度 |
| KurtosisOf | 峰度 |
| Skew2Of | 偏度 |
| Kurtosis2Of | 峰度 |
| LargeOf | 最大值 |
| PercentileOf | 百分点 |
| QuartileOf | 四分位的值 |
| TrimMeanOf | 返回数据集中的内部平均值,从头尾去掉指定百分比的数据点,再求平均值 |
| CountOf | 记录个数 |
| AvgOf | 平均值 |
| MinOf | 最小值 |
| AggOf | 利用回调函数计算聚集的值 |
| StdevpOf | 统计标准偏差 |
| VarpOf | 统计方差 |
| ModeOf | 众数 |
| DevSqOf | 样本平均值偏差的平方和 |
| HarMeanOf | 调和平均值 |
| Checksum_AggOf | 校验和 |
| SmallOf | 最小值 |
| PercentRankOf | 数据集中X排位的百分点的值 |
| Rankof | 排位 |
| FrequencyOf | 数值区间在数据集中出现的频率 |
| ProductOf | |
| RefOf | 往前取数据 |
| RefsOf | |
| AggValue | 当前参与聚集的列的值 |
| ThisGroup | 指定分组 |
| ThisRow | 当前行的数据值 |
| ThisRowIndex | 当前行的相对索引值 |
| ThisOrder | 当前排序 |
| Insert | 插入数据 |
| InsertFields | 插入数据的字段列表 |
| Values | 设置或者取得Name=Value模式串中指定的Name的Value值 |
| Update | 修改数据 |
| Set | 修改数据 |
| Delete | 删除数据 |
| DeleteOpt | 设定删除数组时是否自动修改下标,SelectOpt对稀疏矩阵用的时候很有意义 |
| FetchFirst | 查询第一条记录 |
| FetchNext | 查询下一条记录 |
##### 被系统保留未被使用的保留字
@@ -1528,6 +1535,7 @@ book."则代表的是 This''s a book.
有时候,程序中需要表达特殊的难以直接输入的 ASCII 符,例如笑脸符的 ASCII 值为 1,要表达的时候就用#1 就可以表达了,而同样的,回车符的 ASCII 码值为 13,可以用#13 来表达,而字符 0 的 ASCII 码值为 48,则#48 可以表达数字字符 0。
# 号字符表达方式可以和引号的字符串表达方式串起来表达字符串常量,例如:'The first
line,Hello!'#13#10'The second line,Yeah!'#13#10'The End.'描述的字符串内容为:
The first line,Hello!
@@ -1778,6 +1786,7 @@ c := s[0];
```
c 为长度 1 的字符串。
#### ArrayTableArray 数组类型
数组型,数组是程序中最常用的结构数据类型,用来描述一定数目的元素集合。数组的每个元素和下标相关联,根据下标指示数组中元素的位置。
@@ -1791,6 +1800,7 @@ arr := array();
arr[0] := -1;
arr[0][0][0] := 0;
```
TSL 的数组,有两种下标,一种为整数,一种为字符串。允许有字符型下标存在,其优点是可以直接描述一张数据表。例如 arrTable 是一个二维数组,我们可以设定其中的一个元素值如下:
```tsl
@@ -1914,6 +1924,7 @@ TCLASS 型数据可以用.操作符来调用类方法。
```tsl
class(ClassA).MethodA(a, b);
```
#### ComObj
对象型,对象型是 TSL 中的一种 Com 对象数据类型,用这种类型可以操作各种 Com 对象,如 Excel 以及 Word 对象。
@@ -1949,6 +1960,7 @@ com_obj.PropertyName(param1, param2) := value;
```tsl
com_obj.MethodName(param1, param2);
```
如果对象的属性或者方法返回的仍然是对象,支持嵌套调用:
ComObjVariant.<PropName|MethodName>[(P1,P2...)].
@@ -2008,6 +2020,7 @@ COM 的调用和 TSL 的对象的调用是没有差异的,也非常类似于 P
GetOleObject("Excel.Application", 0, Obj);
Obj.WorkBooks.Open("C:\\1.xls");
```
上边的代码 Obj.WorkBooks 隐含着返回了一个 WorkBooks 对象
#### TSLObj
@@ -2039,6 +2052,7 @@ TSL 语言标示符大小写无关,未初始化的变量为整数 0。
```tsl
var_name := expression;
```
例如:
```tsl
@@ -2112,6 +2126,7 @@ TSL 中支持常量、常量成员、运行时常量。
```tsl
const 标识符 = 基础数据类型的常数或常量参与的运算结果;
```
如下:
【常量定义】
@@ -2154,11 +2169,13 @@ end;
```tsl
// 运行时常量的赋值符号为”:=”
```
其定义与初始化:
```tsl
const 标识符 := 任何数据类型的常数或任意表达式的返回值;
```
例如:
```tsl
@@ -2166,6 +2183,7 @@ const a := 1;
C := 100;
const b := C + now();
```
则此时的 b 只有在第一次运行时才能知道它的具体值。
特性说明:
@@ -2182,18 +2200,18 @@ const b := C + now();
##### 常量与运行时常量的对比
| 特点 | 常量定义 | 运行时常量定义 | 变量定义 |
| --- | --- | --- | --- |
| 声明关键字 | Const | Const | 无(存在编译选项时用var) |
| 初始化赋值符 | = | := | := |
| 初始化数据 | 常量或常量参与的计算 | 任意表达式 | 任意表达式 |
| 初始化计算种类 | 类型与算符有限制,具体可参考:计算种类 | 无约束 | 无约束 |
| 初始化生效 | 初始化时确认,是预知的 | 第一次运行时确认 | 运行时确认 |
| 初始化后是否可被修改 | 不能被修改 | 不能被修改 | 能被修改 |
| 是否支持类成员 | 支持 | 不支持 | 支持 |
| 是否支持声明中初始化类成员 | 支持 | 不支持 | 不支持 |
| 运算效率 | 存储数据较大时效率相对较高 | 存储数据较大时效率相对较高 | 一般 |
| 定义初始化举例 | Const a="Hello"; | Const a:=100+now(); | a:=100+now(); |
| 特点 | 常量定义 | 运行时常量定义 | 变量定义 |
| -------------------------- | -------------------------------------- | -------------------------- | ------------------------- |
| 声明关键字 | Const | Const | 无(存在编译选项时用var) |
| 初始化赋值符 | = | := | := |
| 初始化数据 | 常量或常量参与的计算 | 任意表达式 | 任意表达式 |
| 初始化计算种类 | 类型与算符有限制,具体可参考:计算种类 | 无约束 | 无约束 |
| 初始化生效 | 初始化时确认,是预知的 | 第一次运行时确认 | 运行时确认 |
| 初始化后是否可被修改 | 不能被修改 | 不能被修改 | 能被修改 |
| 是否支持类成员 | 支持 | 不支持 | 支持 |
| 是否支持声明中初始化类成员 | 支持 | 不支持 | 不支持 |
| 运算效率 | 存储数据较大时效率相对较高 | 存储数据较大时效率相对较高 | 一般 |
| 定义初始化举例 | Const a="Hello"; | Const a:=100+now(); | a:=100+now(); |
##### 常量的产生对其它功能的扩展帮助
@@ -2227,6 +2245,7 @@ A := length(A);
A := A\ * 10.0; // A 的类型运算后变成了实数 140.0
A := array(A); // A 的类型变成了数组,内容为 array(140.0)
```
这种变量类型可以改变的特性,我们称之为变量类型的运行时相关,也就是说,变量类型只有在运行到具体位置的时候才可以被明确,这种特性在计算机术语里也可以称之为 TSL 语言是弱类型的语言。
#### TSL 语言变量的初始值
@@ -2246,6 +2265,7 @@ int I;//申明 I 为整数类型
```tsl
I = 0; // 赋值语句,C 语言的=和 TSL 的 := 意义是一样的
```
先得申明 I 变量为整数,才可以使用 I。
而且这样是不正确的:
@@ -2254,6 +2274,7 @@ I = 0; // 赋值语句,C 语言的=和 TSL 的 := 意义是一样的
int I;
I := "1234";
```
这样 C 语言会报告类型不匹配的错误,因为无法把一个字符串类型赋给一个整数类型的变量,这就是强类型语言,而且,无论在哪里,只要使用 I,都可以知道 I 是整数类型。
#### 数据类型转换与算符重载
@@ -2266,6 +2287,7 @@ B := 1;
C := B + StrToInt(A);
// StrToInt 是一个把字符串转换成为整数的函数,我们先不去理解 TSL 的函数的表达方式,函数会在后续章节中讲解
```
在 TSL 中,我们很明确地先把字符串 A 用相关函数转换成为整数再和 B 相加,这样我们很清楚 C 的结果是 1+1234=1235。
假定是支持数据自动转换的语言,这样写就可以了:
@@ -2275,6 +2297,7 @@ A := "1234";
B := 1;
C := B + A;
```
编译器会自动识别 B 为整数,整数和后边的类型相加,自动把后边的数据类型转换成为整数,这样我们可以称之为语言内核已经重载了+运算符,使得自动执行了将第二操作数自动转换成为和第一个操作数相同的类型,也就是自动把字符串”1234”自动转换成为和整数 1 一样的类型的功能。
以上代码看起来显然比没有自动类型转换的看起来要简单和优雅,但是我们再看下一个代码:
@@ -2284,6 +2307,7 @@ A := "1234";
B := 1;
C := A + B;
```
这个 C 的结果会是什么呢?由于 A 是字符串,所以先要把 B 的结果 1 先变成字符串"1"再和 A 相加,结果就变成了"12341"。
这样就出现了很意想不到的效果了:A+B 的结果与 B+A 的结果是完全不相同的,假定开发人员写的时候稍有不注意,这类的错误是非常容易犯下并难以查找的。
@@ -2310,6 +2334,7 @@ TSL 采用 Var 作为前缀来声明变量,具体使用方法为:
```tsl
var varName1, varName2[:type];
```
例如:
```tsl
@@ -2343,6 +2368,7 @@ TSL 的算符有的存在.前导,例如 .&,.>等等,需要注意的是,由
```tsl
a := 1;
```
注:TSL 中 `=` 是关系运算符,赋值使用 `:=`
##### 多参数赋值运算
@@ -2352,6 +2378,7 @@ a := 1;
```tsl
[变量 1, 变量 2, ...] := array(值 1, 值 2, ...);
```
注意:
- 右侧数组第一维下标必须为自然数,可为多维数组。
@@ -2411,6 +2438,7 @@ return Test(e := 3, [f, g] := array(1, 2), g); // 返回 6
return Test(e := 3, [f, g] := array(1, 2)); // 返回 4c 为 nil
```
注:此用法不常见。
范例 06:实用场景,当我们执行某个程序之后想要返回多个指标值,可以采用这种方式进行处理会更快便捷。比如在数据库交互过程中,做一个数据提取的操作的时候,我既希望可以返回提取的数据结果集,又希望在提取失败时返回具体失败的信息,方便查看失败的原因。那此时,就希望能一次返回两个结果,一个代表数据库操作是否成功的 Bool 类型结果,另一个代表的是提取的结果集或报错信息。那通过数组绑定变量的方式就可以很好地读取到对应的信息值,大致过程如下所示:
@@ -2440,20 +2468,20 @@ end;
算术运算符是最常用的运算符,用于从事算术运算,除了四则运算+-\*/以外,TSL 还支持求余,整除,自加一,自减一等。
| 运算符 | 运算 | 运算对象 | 结果类型 | 例子 |
| --- | --- | --- | --- | --- |
| + | 加,正号,可为一元或者二元运算符 | 整型、实型、字符串 | 只要有一个运算对象是实型,结果就是实型,如果全部的运算对象都是整型并且运算不是除法,则结果为整型,若运算是除法或者左除,则结果是实型 | 2+1结果为3<br>"222"+"888"结果为"222888" |
| - | 减,负号,可为一元或者二元运算符 | 整型、实型 | | 2-1结果为1 |
| * | 乘 | 整型、实型 | | 2*2结果为4 |
| / | 除 | 整型、实型 | | 2/4结果为0.5<br>注意:在某些语言中,整数常量相除的结果为整数,如果要结果为实数需要其中一个参与运算的元素为实数 |
| \ | 左除 | 整型、<br>实型 | | 3\2的结果为0.666666…<br>左除这种运算符只有少数语言支持,大部分语言并不支持 |
| %,Mod | 取余 | 整型 | 整型 | 例如4 % 3的结果为1 |
| Div | 除取整 | 整型、实型 | 整型 | 例如7 div 3的结果为2 |
| ++ | 自加1,一元运算符 | 整型、实型 | 整型、实型 | 见下例 |
| -- | 自减1,一元运算符 | 整型、实型 | 整型、实型 | 见下例 |
| ! | 求倒数,一元运算符 | 整型、实型 | 实型 | !A相当于1/A |
| ^ | 求幂 | 整型、实型 | 实数 | 2^3等于2的3次方为8 |
| ~ | 求对数 | 整型、实型 | 实数 | 8~2等于8对2求对数,为3 |
| 运算符 | 运算 | 运算对象 | 结果类型 | 例子 |
| ------ | -------------------------------- | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------- |
| + | 加,正号,可为一元或者二元运算符 | 整型、实型、字符串 | 只要有一个运算对象是实型,结果就是实型,如果全部的运算对象都是整型并且运算不是除法,则结果为整型,若运算是除法或者左除,则结果是实型 | 2+1结果为3<br>"222"+"888"结果为"222888" |
| - | 减,负号,可为一元或者二元运算符 | 整型、实型 | | 2-1结果为1 |
| \* | 乘 | 整型、实型 | | 2\*2结果为4 |
| / | 除 | 整型、实型 | | 2/4结果为0.5<br>注意:在某些语言中,整数常量相除的结果为整数,如果要结果为实数需要其中一个参与运算的元素为实数 |
| \ | 左除 | 整型、<br>实型 | | 3\2的结果为0.666666…<br>左除这种运算符只有少数语言支持,大部分语言并不支持 |
| %,Mod | 取余 | 整型 | 整型 | 例如4 % 3的结果为1 |
| Div | 除取整 | 整型、实型 | 整型 | 例如7 div 3的结果为2 |
| ++ | 自加1,一元运算符 | 整型、实型 | 整型、实型 | 见下例 |
| -- | 自减1,一元运算符 | 整型、实型 | 整型、实型 | 见下例 |
| ! | 求倒数,一元运算符 | 整型、实型 | 实型 | !A相当于1/A |
| ^ | 求幂 | 整型、实型 | 实数 | 2^3等于2的3次方为8 |
| ~ | 求对数 | 整型、实型 | 实数 | 8~2等于8对2求对数,为3 |
示例:
@@ -2477,25 +2505,25 @@ A--;
在=,<>,<,>,<=,>=等运算符都可以对字符串类型进行判断,判断是以字符串中的字符的 ASCII 码值的大小为原则的,比较原则:从第一个字符开始比,相同则比下一个字符,如果两个字符串不一样长,且短串长度部分都相等,则长串大。此外,大小写的 ASCII 码值是不同的,小写的码值大,因此字符串比较是大小写相关的,例如"A"<"a"为真。
| 运算符 | 运算 | 运算对象 | 例子 |
| --- | --- | --- | --- |
| =,.= | 等于 | 简单类型 | 1=2的结果为假<br>注意:在有些语言中,=被用于赋值符,这样等于判断符就使用== |
| <>,.<> | 不等于 | 简单类型 | 1<>2的结果为真<br>注意:在有些语言中,采用!=作为不等于的判断符 |
| <,.< | 小于 | 简单类型 | 1<2的结果为真 |
| >,.> | 大于 | 简单类型 | 1>2的结果为假<br>"B">"A"结果为真 |
| <=,.<= | 小于等于 | 简单类型 | 1<=2的结果为真 |
| >=,.>= | 大于等于 | 简单类型 | 1>=2的结果为假 |
| LIKE | 模式匹配判断 | 字符串 | "2009-1-1" like "\\d+-\\d+-\\d+"为真<br>在TSL中,Like符和SQL的Like的含义不同,TSL的Like的右元素为正则表达式,左边运算元素为匹配串,结果是左边串是否匹配右边的正则表达式,关于正则表达式可以参阅的相关正则表达式的章节 |
| 运算符 | 运算 | 运算对象 | 例子 |
| ------ | ------------ | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| =,.= | 等于 | 简单类型 | 1=2的结果为假<br>注意:在有些语言中,=被用于赋值符,这样等于判断符就使用== |
| <>,.<> | 不等于 | 简单类型 | 1<>2的结果为真<br>注意:在有些语言中,采用!=作为不等于的判断符 |
| <,.< | 小于 | 简单类型 | 1<2的结果为真 |
| >,.> | 大于 | 简单类型 | 1>2的结果为假<br>"B">"A"结果为真 |
| <=,.<= | 小于等于 | 简单类型 | 1<=2的结果为真 |
| >=,.>= | 大于等于 | 简单类型 | 1>=2的结果为假 |
| LIKE | 模式匹配判断 | 字符串 | "2009-1-1" like "\\d+-\\d+-\\d+"为真<br>在TSL中,Like符和SQL的Like的含义不同,TSL的Like的右元素为正则表达式,左边运算元素为匹配串,结果是左边串是否匹配右边的正则表达式,关于正则表达式可以参阅的相关正则表达式的章节 |
#### 逻辑运算符
逻辑运算符就是对真假的 Boolean 类型进行运算的算符。
| 运算符 | 运算 | 运算对象 | 结果类型 | 例子 |
| --- | --- | --- | --- | --- |
| Not,.!! | 逻辑非,一元运算符 | 布尔型 | 布尔型 | 逻辑非,对真运算则为假,对假运算则为真<br>Not 1的结果为0<br>在C语言或者类C语言中,Not的表达为! |
| And,.&& | 逻辑与 | 布尔型 | 布尔型 | 逻辑与,真与真与为真,真与假或者假与假与都为假<br>1 and 2结果为1<br>1 and 0结果为0<br>在C语言或者类C语言中,And的表达为&& |
| Or,.\|\| | 逻辑或 | 布尔型 | 布尔型 | 逻辑或,只要一个为真,运算结果就为真<br>1 or 2 结果为1<br>1 or 0结果为1<br>0 or 0结果为0<br>在C语言或者类C语言<br>中,Or的表达为II |
| 运算符 | 运算 | 运算对象 | 结果类型 | 例子 |
| -------- | ------------------ | -------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------- |
| Not,.!! | 逻辑非,一元运算符 | 布尔型 | 布尔型 | 逻辑非,对真运算则为假,对假运算则为真<br>Not 1的结果为0<br>在C语言或者类C语言中,Not的表达为! |
| And,.&& | 逻辑与 | 布尔型 | 布尔型 | 逻辑与,真与真与为真,真与假或者假与假与都为假<br>1 and 2结果为1<br>1 and 0结果为0<br>在C语言或者类C语言中,And的表达为&& |
| Or,.\|\| | 逻辑或 | 布尔型 | 布尔型 | 逻辑或,只要一个为真,运算结果就为真<br>1 or 2 结果为1<br>1 or 0结果为1<br>0 or 0结果为0<br>在C语言或者类C语言<br>中,Or的表达为II |
TSL 在很多方面和 Pascal 语言比较类似,但是在 Pascal 语言中,Not,And,Or 同时可以作为位运算符,由于 TSL 为弱类型语言,为了避免冲突,TSL 取消了这一特性,位运算有相应的一组算符和函数。
@@ -2601,6 +2629,7 @@ return s;
a := array(1, 2, 3, 4, 5);
b := a . > 3 .? array(2, 3, 4, 5, 6) : array(3, 4, 5, 6, 7);
```
b 的结果为:array(3,4,5,5,6)
即,对集合 a 中每个元素的集进行判断取值,然后得到对应的结果返回到结果集中。
@@ -2619,6 +2648,7 @@ f2 := fmarray[[100, 10], [200, 20], [300, 30], [400, 40]];
b := f1 . > 3 .? f1:f2;
return b;
```
结果:
例如:将整型矩阵中不符合条件的值用浮点数 10.5 替换
@@ -2628,6 +2658,7 @@ f1 := fmarray[[1, 2], [0, 4], [1, 2], [5, 6]];
b := f1 . > 3 .? f1:10.5;
return b;
```
返回的矩阵中,所有单元格类型都为浮点数:
注:即便判断中没有出现符合条件的单元,数据类型不同时也会做包容处理。
@@ -2648,16 +2679,16 @@ return b;
下述所说的整数为 32 位整数或 64 位整数。
| 运算符 | 运算 | 运算对象 | 结果类型 | 例子 |
| --- | --- | --- | --- | --- |
| .& | 位与 | 整数 | 整数 | 位与,例如3 .& 1 的结果13 .& 4的结果为0,在C或者类C语言中,.&的表达为& |
| .\| | 位或 | 整数 | 整数 | 位或,例如3 .\| 1 的结果3,3 .\| 4的结果为7,在C或者类C语言中,.\|的表达为\| |
| .! | 位非(取反) | 整数 | 整数 | 位非,.! 1的结果为-2,.! 0的结果为-1,在C或者类C语言中,位非运算符为~ |
| .^ | 位异或 | 整数 | 整数 | 位异或,按位异或,相同位为0,不同的位为1,如:1 .^ 1为0,1 .^ 5 的值为4,在C或者类C语言中,.^的表达为^ |
| SHL | 位左移 | 整数 | 整数 | 位向左移动,最高移动的N位舍弃 |
| ROL | 左循环移位 | 整数 | 整数 | 位向左移动,最高移动的N位卷滚到最低位 |
| SHR | 位右移 | 整数 | 整数 | 位向右移动,最低移动的N位舍弃 |
| ROR | 右循环移位 | 整数 | 整数 | 位向右移动,最低移动的N位卷滚到最高位 |
| 运算符 | 运算 | 运算对象 | 结果类型 | 例子 |
| ------ | ------------ | -------- | -------- | ------------------------------------------------------------------------------------------------------ |
| .& | 位与 | 整数 | 整数 | 位与,例如3 .& 1 的结果13 .& 4的结果为0,在C或者类C语言中,.&的表达为& |
| .\| | 位或 | 整数 | 整数 | 位或,例如3 .\| 1 的结果3,3 .\| 4的结果为7,在C或者类C语言中,.\|的表达为\| |
| .! | 位非(取反) | 整数 | 整数 | 位非,.! 1的结果为-2,.! 0的结果为-1,在C或者类C语言中,位非运算符为~ |
| .^ | 位异或 | 整数 | 整数 | 位异或,按位异或,相同位为0,不同的位为1,如:1 .^ 1为0,1 .^ 5 的值为4,在C或者类C语言中,.^的表达为^ |
| SHL | 位左移 | 整数 | 整数 | 位向左移动,最高移动的N位舍弃 |
| ROL | 左循环移位 | 整数 | 整数 | 位向左移动,最高移动的N位卷滚到最低位 |
| SHR | 位右移 | 整数 | 整数 | 位向右移动,最低移动的N位舍弃 |
| ROR | 右循环移位 | 整数 | 整数 | 位向右移动,最低移动的N位卷滚到最高位 |
#### []运算符
@@ -2675,6 +2706,7 @@ A := array(1, 2, 3);
B := A[0];
// 那么 B 的结果是 1;
```
[]中的内容就是数组的下标。
如果我们替换掉一行语句
@@ -2683,6 +2715,7 @@ B := A[0];
A := array(1, 2, 3);
A[0] := 2;
```
那么数组 A 的内容就变成了 array(2,2,3)。
[]的另外一个作用就是指示字符串中指定下标的字符。
@@ -2699,6 +2732,7 @@ A[0] := 2;
A := "ABCD";
B := A[1];
```
那么 B 的结果是"A"
如果要给字符串的某个项来赋值:
@@ -2707,6 +2741,7 @@ B := A[1];
A := "ABCD";
A[1] := "B";
```
那么 A 的值变成了"BBCD"
我们也可以用下列方法给字符串的某项赋值:
@@ -2715,6 +2750,7 @@ A[1] := "B";
A := "ABCD";
A[1] := 0x30;
```
结果 A 的值变成了"0BCD",因为 16 进制的 30 就是字符 0 的 ASCII 值。
此外,[]算符还可以用于在类 SQL 语法中取字段结果,这个内容在今后的数据查询与 SQL 语言中将会进行具体描述。
@@ -2733,6 +2769,7 @@ A[1] := 0x30;
a := 1;
b := a + 1;
```
那么我们知道 b 的结果会是 2,我们知道 a+1 就是一个表达式,下边的代码:
```tsl
@@ -2740,6 +2777,7 @@ A := 1;
B := @A + 1;
C := eval(B);
```
这里边出现了一个表达式求值的函数,叫 eval,而 B 是表达式类型,利用表达式求值函数对 B 这个表达式求值得到的结果就是 2,也就是 C 的结果是 2。
执行下边的代码可以得到同样的结果:
@@ -2749,12 +2787,13 @@ A := 1;
B := &”A + 1”;
C := eval(B);
```
@符是一个表达式前导符,用于指定后边的内容是一个表达式,而&符号则是把一个字符串的内容编译成为一个表达式使用。
| 运算符 | 运算 | 运算对象 | 结果类型 |
| --- | --- | --- | --- |
| @ | 前导符,直接声明为表达式,一元运算符 | 语句 | 表达式型 |
| & | 转换字符串为表达式,一元运算符 | 字符串类型 | 表达式型 |
| 运算符 | 运算 | 运算对象 | 结果类型 |
| ------ | ------------------------------------ | ---------- | -------- |
| @ | 前导符,直接声明为表达式,一元运算符 | 语句 | 表达式型 |
| & | 转换字符串为表达式,一元运算符 | 字符串类型 | 表达式型 |
表达式运算用于那些需要动态执行而传值无法实现的特殊情况。
@@ -2762,9 +2801,9 @@ C := eval(B);
该算符在后续章节中会使用到
| 运算符 | 运算 | 运算对象 | 结果类型 |
| --- | --- | --- | --- |
| . | 对象运算符号,访问对象的属性和方法 | 对象类型 | 任意 |
| 运算符 | 运算 | 运算对象 | 结果类型 |
| ------ | ---------------------------------- | -------- | -------- |
| . | 对象运算符号,访问对象的属性和方法 | 对象类型 | 任意 |
#### 矩阵运算符
@@ -2772,19 +2811,19 @@ C := eval(B);
关于矩阵的计算我们将在矩阵计算专门章节里讲述。
| 运算符 | 运算 |
| --- | --- |
| :* | 矩阵乘 |
| :/ | 矩阵除 |
| :\ | 矩阵左除 |
| :^ | 矩阵幂 |
| ! | 矩阵逆和伪逆 |
| \| | 矩阵并右方 |
| :\| | 矩阵并右方(空列不错位,支持非完全矩阵) |
| Union | 矩阵并下方 |
| :: | 矩阵循环 |
| ::= | 矩阵循环赋值 |
| -> | 生成序列数组 |
| 运算符 | 运算 |
| ------ | -------------------------------------- |
| :\* | 矩阵乘 |
| :/ | 矩阵除 |
| :\ | 矩阵左除 |
| :^ | 矩阵幂 |
| ! | 矩阵逆和伪逆 |
| \| | 矩阵并右方 |
| :\| | 矩阵并右方(空列不错位,支持非完全矩阵) |
| Union | 矩阵并下方 |
| :: | 矩阵循环 |
| ::= | 矩阵循环赋值 |
| -> | 生成序列数组 |
#### 集合运算符
@@ -2792,14 +2831,14 @@ C := eval(B);
有关集合运算的内容在集合运算章节中会独立讲述。
| 运算符 | 运算 |
| --- | --- |
| IN | 判断元素是否存在或者判定是否是子集 |
| Union2 | 集合并集 |
| Intersect | 集合交集 |
| Outersect | 对称差集 |
| Minus | 集合补集 |
| SQLIN | 行判断,判别是否是元素 |
| 运算符 | 运算 |
| --------- | ---------------------------------- |
| IN | 判断元素是否存在或者判定是否是子集 |
| Union2 | 集合并集 |
| Intersect | 集合交集 |
| Outersect | 对称差集 |
| Minus | 集合补集 |
| SQLIN | 行判断,判别是否是元素 |
#### 过滤集运算符
@@ -2807,9 +2846,9 @@ C := eval(B);
过滤集运算也可以对二维结果集的整行内容进行过滤,这样的操作非常类似于集合运算,过滤在过滤集内的类似于交集,而反之类似于减集。但是过滤运算和集合运算的最大差异是:集合运算的结果内容不允许有重复项,而过滤运算的结果允许有重复项,也就是说于被过滤集中的重复项目是不会被自动去重的。
| 运算符 | 运算 |
| --- | --- |
| FilterIn | 过滤在其中 |
| 运算符 | 运算 |
| ----------- | ------------ |
| FilterIn | 过滤在其中 |
| FilterNotIn | 过滤不在其中 |
#### 运算赋值运算符
@@ -2819,12 +2858,14 @@ C := eval(B);
```tsl
A := A + B;
```
这条语句的意思读者已经很清楚了,就是将 A+B 的值赋予 A。对于这类运算,我们可以用另外一条语句替代:
```tsl
A += B;
// 这就叫运算赋值运算符,基本上就是用算符=来替代掉原来的 A:=A 算符 B 的功能。
```
这种算符在 C 以及类 C 语言中被广泛支持,但是或许有的读者会有一个疑问,除了获得代码编写上的简便以外,似乎没有其他用处。其实不然,在很多情况下,采用运算赋值运算符还可以获得效率上的提高。
我们拿字符串的加法来做一个例子:
@@ -2833,55 +2874,59 @@ A += B;
A := "";
for i := 0 to 9999 do A := A + "A";
```
```tsl
A := "";
for i := 0 to 9999 do A += "A";
```
这两种写法在计算机的执行上是完全不同的,+=并不仅仅只是写法的简便那么简单。
```tsl
// 在执行 A:=A+"A"的时候,计算机先取出 A 的值,然后执行+的操作,也就是需要先分配一个足够的内存空间存贮 A+"A"的结果,然后再将 A 原来存贮的字符串进行释放,释放以后再把计算的字符串结果复制到 A。
```
而执行 A+="A"的时候,计算机仅仅只需要先把 A 的字符串的存贮空间扩大一个字节,然后再把"A"复制进末尾。
```tsl
// 简单说起来,就是+=可以利用原有变量的存贮空间,而:=则不行,这样就可以基本保障几乎所有类似的运算采用运算赋值运算符会更快速。这个效率尤其在之后的矩阵计算中会体现得更加明显(由于矩阵的每一次计算的结果集相比标量而言都非常庞大,导致:=会不断地生成新结果集和删除旧结果集,使得效率很低)
```
| 运算符 | 算符名称 | 备注 |
| --- | --- | --- |
| += | 加等于 | |
| -= | 等于 | |
| *= | 等于 | |
| /= | 等于 | |
| \= | 除等于 | |
| ^= | 等于 | |
| ~= | 对数等于 | |
| %= | 等于 | |
| Div= | 整除等于 | 很特殊的算符,字母和符号并用的算符 |
| .\|= | 位或等于 | |
| .&= | 位等于 | |
| .\|\|= | 逻辑或等于 | |
| .&&= | 逻辑等于 | |
| .^= | 位异或等于 | |
| \|= | 矩阵右并等于 | |
| :\|= | 矩阵右并等于 | 和\|=的差异见后续章节中\|和:\|的差异 |
| &= | 矩阵并等于 | 很特殊的算符,因为&是表达式,所以利用&=来实现union等于的功能 |
| :*= | 矩阵等于 | |
| :/= | 矩阵等于 | |
| :\= | 矩阵除等于 | |
| :^= | 矩阵等于 | |
| Union2= | 集合并等于 | 很特殊的算符,字母和符号并用的算符 |
| Intersect= | 集合交集等于 | 很特殊的算符,字母和符号并用的算符 |
| Outersect= | 集合对称差集= | 很特殊的算符,字母和符号并用的算符 |
| Minus= | 集合补集等于 | 很特殊的算符,字母和符号并用的算符 |
| 运算符 | 算符名称 | 备注 |
| ---------- | ------------- | ------------------------------------------------------------ |
| += | 等于 | |
| -= | 等于 | |
| \*= | 等于 | |
| /= | 除等于 | |
| \= | 左除等于 | |
| ^= | 幂等于 | |
| ~= | 对数等于 | |
| %= | 模等于 | |
| Div= | 整除等于 | 很特殊的算符,字母和符号并用的算符 |
| .\|= | 位等于 | |
| .&= | 位与等于 | |
| .\|\|= | 逻辑等于 | |
| .&&= | 逻辑与等于 | |
| .^= | 位异或等于 | |
| \|= | 矩阵右并等于 | |
| :\|= | 矩阵并等于 | 和\|=的差异见后续章节中\|和:\|的差异 |
| &= | 矩阵下并等于 | 很特殊的算符,因为&是表达式,所以利用&=来实现union等于的功能 |
| :\*= | 矩阵等于 | |
| :/= | 矩阵除等于 | |
| :\= | 矩阵左除等于 | |
| :^= | 矩阵幂等于 | |
| Union2= | 集合并等于 | 很特殊的算符,字母和符号并用的算符 |
| Intersect= | 集合交集等于 | 很特殊的算符,字母和符号并用的算符 |
| Outersect= | 集合对称差集= | 很特殊的算符,字母和符号并用的算符 |
| Minus= | 集合补集等于 | 很特殊的算符,字母和符号并用的算符 |
#### With 设值运算符
| 运算符 | 运算 | 运算对象 | 结果类型 |
| --- | --- | --- | --- |
| => | 设置With的系统参数 | 任意类型 | 无结果 |
| 运算符 | 运算 | 运算对象 | 结果类型 |
| ------ | ------------------ | -------- | -------- |
| => | 设置With的系统参数 | 任意类型 | 无结果 |
#### 算符优先级
@@ -2895,19 +2940,19 @@ for i := 0 to 9999 do A += "A";
以下会出现一些在上边未使用的算符,这些算符将会在矩阵计算等章节中详细解释。运算符的优先级有两个特例,就是+-号的优先级分为两种,一个是一元运算符的正负号的优先级,一个是做加减法计算的优先级。
| 运算符 | 优先级 |
| --- | --- |
| (),[],.,?. | 0(最高) |
| &,Not,++,--,`,!,.!,.!! | 1 |
| $ | 2 |
| ^,~,:^ | 3 |
| *,/,\,%,Mod,Div, :*,:/,:\,SHL,SHR,ROL,ROR | 4 |
| +,-,\|,:\|,union,union2,Intersect,Outersect,Minus,.\|,.\|\|,.&,.&&, ->,.^,正号+,负号- | 5 |
| IS,IN,Like,=,<,>,>=,<=,<>,.=,.<>,.>=,.<=,.<,.>,<br>:>, :<,:<>,:==,:>=,:<=,::>,::<,::<>,::==,::>=,::<= | 6 |
| And,Or | 7 |
| : | 8 |
| :=, +=, -=, *=, /=, \=, ^=, ~=, %=, div=, \|=, :\|=, union2=, intersect=, Outersect=, Minus=, &=, :*=, :/=, :\=, :^=, ::=, ::, .\|=, .&=, .\|\|=, .&&=, .^= | 9 |
| @ | 10(最低) |
| 运算符 | 优先级 |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- |
| (),[],.,?. | 0(最高) |
| &,Not,++,--,`,!,.!,.!! | 1 |
| $ | 2 |
| ^,~,:^ | 3 |
| _,/,\,%,Mod,Div, :_,:/,:\,SHL,SHR,ROL,ROR | 4 |
| +,-,\|,:\|,union,union2,Intersect,Outersect,Minus,.\|,.\|\|,.&,.&&, ->,.^,正号+,负号- | 5 |
| IS,IN,Like,=,<,>,>=,<=,<>,.=,.<>,.>=,.<=,.<,.>,<br>:>, :<,:<>,:==,:>=,:<=,::>,::<,::<>,::==,::>=,::<= | 6 |
| And,Or | 7 |
| : | 8 |
| :=, +=, -=, _=, /=, \=, ^=, ~=, %=, div=, \|=, :\|=, union2=, intersect=, Outersect=, Minus=, &=, :_=, :/=, :\=, :^=, ::=, ::, .\|=, .&=, .\|\|=, .&&=, .^= | 9 |
| @ | 10(最低) |
值得注意的是,虽然 TSL 语言的算符和 Pascal 语言在很多方面相似,但是算符的优先级却不尽相同,有一个很典型的例子:
@@ -3024,6 +3069,7 @@ TSL 提供的布尔表达式可以含有逻辑运算和关系运算。
```tsl
return (a := 1, b := 2, c := 3, a + b + c);
```
这个语句先对 a 赋值,在对 b 赋值,接下来是 c,最后执行 a+b+c。类似于:
```tsl
@@ -3032,27 +3078,30 @@ b := 2;
c := 3;
return a + b + c;
```
也支持作为表达式参与计算,如:
```tsl
A := (b := 2, c := 3, b * c) * c;
```
这个结果是 2*3*3 结果为 18
#### 链式表达式
TSL 语言中目前支持的关系运算符:
| 关系运算符 | 大于 | 小于 | 不等于 | 等于 | 大于等于 | 小于等于 | 说明 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 标量关系算符 | > | < | <> | = | >= | <= | 非链式,a<b<c相当于(a<b)<c |
| 标量链式算符 | :> | :< | :<> | :== | :>= | :<= | 链式,a:<b:<c相当于(a<b) and (b<c) |
| 矩阵关系算符 | .> | .< | .<> | .= | .>= | .<= | 非链式,a.<b.<c相当于(a.<b).<c |
| 矩阵链式算符 | ::> | ::< | ::<> | ::== | ::>= | ::<= | 链式,a::<b::<c相当于(a.<b) .&& (b.<c) |
| 关系运算符 | 大于 | 小于 | 不等于 | 等于 | 大于等于 | 小于等于 | 说明 |
| ------------ | ---- | ---- | ------ | ---- | -------- | -------- | -------------------------------------- |
| 标量关系算符 | > | < | <> | = | >= | <= | 非链式,a<b<c相当于(a<b)<c |
| 标量链式算符 | :> | :< | :<> | :== | :>= | :<= | 链式,a:<b:<c相当于(a<b) and (b<c) |
| 矩阵关系算符 | .> | .< | .<> | .= | .>= | .<= | 非链式,a.<b.<c相当于(a.<b).<c |
| 矩阵链式算符 | ::> | ::< | ::<> | ::== | ::>= | ::<= | 链式,a::<b::<c相当于(a.<b) .&& (b.<c) |
```tsl
// 注:由于:=是赋值符号,因此链式算符等于符为:==;由于::=是循环赋值等于符号,因此矩阵链式等于为::==;
```
##### 标量链式算符
链式比较表达式形式:`a :< b :< c` 或 `x :== y :>`。
@@ -3126,6 +3175,7 @@ TSL 还可以支持混用 fmarray 和 array 以及标量
S := "AAABBB";
S1 := S[3:4];
```
S1 的结果为"AB",为第三个字符到第四个字符的值。
#### 字符串替换子串 StringValue[StartIndex:EndIndex]:=SubString
@@ -3136,6 +3186,7 @@ S1 的结果为"AB",为第三个字符到第四个字符的值。
S := "AAABBB";
S[3:4] := "111";
```
S 的结果为"AA111BB"
含义是替换掉第三个字符到第四个字符的值为"111"。
@@ -3149,6 +3200,7 @@ S := "AAABBB";
S[3:4] := "";
S 的结果则为"AABB";
```
#### 字符串插入子串 StringValue[Index:0]:=SubString
假定我们要在指定的位置插入字符串,我们可以采用类似于替换的方法,但是结束索引号设置为 0,例如:
@@ -3157,6 +3209,7 @@ S 的结果则为"AABB";
S := "AAABBB";
S[4:0] := "111";
```
S 的结果为"AAA111BBB"
含义是在第四个字符的位置插入"111"
@@ -3271,6 +3324,7 @@ end;
```tsl
with [S => StockID, T => Time] do <statements>;
```
例如:
```tsl
@@ -3281,6 +3335,7 @@ begin
diff := close_value - ref_close;
end;
```
其工作原理如下:
先根据 S 和 T 设置当前的股票和日期,然后执行 DO 后的语句,执行完后恢复股票和日期的环境。