# 08 高级语言(新一代) 本章汇总新一代语法与相关机制。 ## 目录 - [高级语言(新一代)](#高级语言新一代) - [内容](#内容) - [复数](#复数) - [内容](#内容-1) - [定义](#定义) - [数据类型](#数据类型) - [复数运算](#复数运算) - [相关模型](#相关模型) - [WeakRef 弱引用(新一代)](#weakref弱引用新一代) - [内容](#内容-2) - [产生弱引用的背景](#产生弱引用的背景) - [弱引用](#弱引用) - [自动弱引用](#自动弱引用) - [当前版本对弱引用支持的判定](#当前版本对弱引用支持的判定) - [对象对基础算符与基础函数的重载](#对象对基础算符与基础函数的重载) - [内容](#内容-3) - [TSL 对象支持对二进制函数的重载](#tsl对象支持对二进制函数的重载) - [TSL 对象对遍历算符的重载](#tsl对象对遍历算符的重载) ## 高级语言(新一代) ### 内容 - 复数 - WeakRef 弱引用(新一代) - 对象对基础算符与基础函数的重载 ### 复数 形如 a+bi(a、b 均为实数)的数为复数,其中,a 被称为实部,b 被称为虚部,i 为虚数单位。 复数通常用 z 表示,即 z=a+bi 当 z 的虚部 b = 0 时,则 z 为实数; 当 z 的虚部 b≠0 时,实部 a = 0 时,常称 z 为纯虚数。 TSL 语言中支持复数的表达,虚数单位用 j 表示,记复数 z 为 a+bj,也支持复数的运算以及基础函数的应用。 目前仅新一代客户端与新一代服务器支持复数的相关功能。 #### 内容 - 定义 - 数据类型 - 复数运算 - 相关模型 #### 定义 在 TSL 语言中, 虚数单位用 j 表示,记复数 z 为 a+bj 通过常量定义方式或函数 complex(a,b)可以生成复数及复数矩阵 如:z:=4+3j 或 z:=complex(4,3) 即表示 z 是一个实部为 4,虚部为 3 的复数。 复数在客户端中的显示如下: 复数矩阵的生成 如:complex(array((1,2,3),(4,5,6)),array((-1,-2,-3),(1,2,3))) 生成一个 2\*3 的矩阵,显示如下: 也可借助矩阵初始化函数,如:complex(ones(2,3),ones(2,3)) 生成一个 2\*3 的实部与虚部都为 1 的复数矩阵,显示如下: 随机矩阵:complex(rand(3,2),rand(3,2)) #### 数据类型 在 TSL 语言中, datatype(v)可以判断任意数据的数据类型,而复数的数据类型对应的是分类 41。也可以通过 ifcomplex(z)进行判断是否是复数。 注意,虽然实数也属于复数,但是 ifcomplex 会判定实数(没有用 j 表示的数)为假,而 datatype 也同理。 例如: ```text Z:=4+3j; Return datatype(z); ``` 返回整型 41。 在解释器中直接运行如下: #### 复数运算 支持复数的基础运算,如四则运算、矩阵运算、集合运算、赋值运算等,具体可查看列表。 在使用上与实数一致,例如,有复数 z1 与 z2,分别如下: z1:=4+3j; z2:=5+12j; 加法: return z1+z2; 返回:9.0+15.0j 减法: Return Z2-z1; 返回:1.0+9.0j 乘法: Return z1\*z2; 返回:-16.0+63.0j 除法: Return z2/z1; 返回:2.24+1.32j ##### 内容 - 复数支持的算符列表 ##### 复数支持的算符列表
| 运算符 | 运算 | 运算对象 | 结果 | 举例 |
| + | 加 | 复数、复数Array、 复数FMArray 支持与实数混合运算 | 复数、复数Array、 复数FMArray | 1+2j+(2+3j)结果为3.0+5.0j |
| - | 减,负号 | 同上 | 同上 | 2+3j-(3+1j)结果为-1.0+2.0j |
| * | 乘 | 同上 | 同上 | (2+3j)*(3+1j)结果为3.0+11.0j |
| / | 除 | 同上 | 同上 | (2+3j)/(3+1j)结果为0.9+0.7j |
| \ | 左除 | 同上 | 同上 | (3+1j)\(2+3j)结果为0.9+0.7j |
| ~ | 求对数 | 同上 | 同上 | (8.0+6.0j)~(3+1j)结果为2.0+0.0j |
| ^ | 求幂 | 同上 | 同上 | (3+1j)^2结果为8.0+6.0j |
| ! | 求倒数 | 一元运算符 单个值时求倒数,对矩阵时则是求矩阵逆 | 同上 | !(3+1j)结果为0.3-0.1j |
| ++ | 加1 | 一元运算符 | 同上 | (a:=(3+1j),a++,a)结果为4.0+1.0j |
| -- | 减1 | 一元运算符 | 同上 | (a:=(3+1j),a--,a)结果为2.0+1.0j |
| = | 等于 | 复数、复数Array、 复数FMArray 支持与实数混合运算 | 布尔类型 | (0+2j)=2j 结果为真 |
| <> | 不等 | 同上 | 布尔类型 | (0+2j)<>2j结果为假 |
| $ | 字符串转换与拼接 | 复数、其它任意类型 | 字符串 | (3+2j)$"A"结果为"3+2jA" |
| Like | 相似判定 | 复数、复数Array、 复数FMArray 支持与实数混合运算 | 布尔类型、布尔矩阵 | 3.55+4.16j like 3.55 结果为假 |
| 赋值等于运算符 | ||||
| += | 加等于 | 复数、 复数Array、 复数FMArray 支持与实数混合运算 | 复数、 复数Array、 复数FMArray | (a:=(3+1j),a+=(2+3j),a)结果为5.0+4.0j |
| -= | 减等于 | 同上 | 同上 | (a:=(3+1j),a-=(2+3j),a)结果为1.0-2.0j |
| *= | 乘等于 | 同上 | 同上 | (a:=(3+1j),a*=(2+3j),a)结果为3.0+11.0j |
| /= | 除等于 | 同上 | 同上 | (a:=(2+3j),a/=(3+1j),a)结果为0.9+0.7j |
| \= | 左除等于 | 同上 | 同上 | (a:=(3+1j),a\=(2+3j),a)结果为0.9+0.7j |
| ^= | 幂等于 | 同上 | 同上 | (a:=(3+1j),a^=2,a)结果为8.0+6.0j |
| ~= | 对数等于 | 同上 | 同上 | (a:=(8+6j),a~=(3+1j),a)结果为2.0+0.0j |
| 矩阵运算符 | ||||
| :* | 矩阵乘法 | 复数矩阵、 复数FMArray矩阵、支持与实数矩阵混合运算 | 复数Array、 复数FMArray 矩阵行列: n×m :* m×g =n×g | a:=array((-1+1j),(-3+1j)); b:=array((2+2j,1+3j)); return a:*b; 结果为:array( (-4.0+0.0j,-4.0-2.0j), (-8.0-4.0j,-6.0-8.0j)) |
| :/ | 矩阵除法 | 同上 | 复数矩阵(Array、 FMArray) 矩阵行列: n×m :/ g×m=n×g | a:=complex(rand(3,4),rand(3,4)); b:=complex(rand(5,4),rand(5,4)); return a:/b; |
| :\ | 矩阵左除 | 同上 | 复数矩阵(Array、 FMArray) 矩阵行列: n×m :/ n×g=m×g | a:=complex(rand(4,3),rand(4,3)); b:=complex(rand(4,5),rand(4,5)); return a:\b; |
| :^ | 矩阵乘方 | 同上 | 复数Array、 复数FMArray | 例如A:^3等于A:*A:*A,乘方应该是个方阵 |
| :: | 矩阵遍历 | 复数Array、复数FMArray、支持与实数数组混合运算 | 不改变原矩阵 | a:=array((1+2j,2),(0,4+2j)); r:=0; a::r+=ifcomplex(mcell); return r; |
| ::= | 矩阵遍历并赋值 | 同上 | 对原矩阵进行重新赋值 | a:=array((1+2j,2),(0,4+2j)); a::=ifcomplex(mcell); return a; |
| .= | 矩阵等于 | 同上 | 与操作的矩阵结构相同,元素值为布尔值 | a:=array((1+2j,2),(0,4+2j)); return a.=4+2j; |
| .<> | 矩阵不等于 | 同上 | 同上 | a:=array((1+2j,2),(0,4+2j)); return a.<>4+2j; |
| 矩阵赋值运算 | ||||
| :*= | 矩阵乘等于 | 复数矩阵、 复数FMArray矩阵、支持与实数矩阵混合运算 | 复数矩阵(Array、FMArray) 矩阵行列: n×m :* m×g =n×g | a:=array((-1+1j),(-3+1j)); b:=array((2+2j,1+3j)); a:*=b; return a; 结果为:array( (-4.0+0.0j,-4.0-2.0j), (-8.0-4.0j,-6.0-8.0j)) |
| :/= | 矩阵除等于 | 同上 | 复数矩阵(Array、FMArray) 矩阵行列: n×m :/ g×m=n×g | a:=complex(rand(3,4),rand(3,4)); b:=complex(rand(5,4),rand(5,4)); a:/=b; return a; |
| :\= | 矩阵左除等于 | 同上 | 复数矩阵(Array、FMArray) 矩阵行列: n×m :/ n×g=m×g | a:=complex(rand(4,3),rand(4,3)); b:=complex(rand(4,5),rand(4,5)); a:\=b; return a; |
| :^= | 矩阵乘方等于 | 同上 | 复数Array、 复数FMArray | a:=complex(rand(3,3),rand(3,3)); a:^=2 return a; |
| 集合运算 | ||||
| | | 矩阵右并 | 复数Array、复数FMArray、支持与实数数组混合运算 | 复数Array、 复数FMArray | a:=complex(ones(2,2),ones(2,2)); b:=complex(zeros(3,2),zeros(3,2)); return a|b; |
| :| | 非完全矩阵右并 | 同上 | 复数Array、 复数FMArray | a:=complex(ones(2,2),ones(2,2)); b:=complex(zeros(3,2),zeros(3,2)); return a:|b; |
| Union | 集合并集 | 同上 | 复数Array、 复数FMArray | a:=complex(ones(2,2),ones(2,2)); b:=complex(zeros(3,2),zeros(3,2)); return a union b; |
| Union2 | 集合并集,有去重效果 | 同上 | 同上 | a:=complex(ones(2,2),ones(2,2)); b:=complex(zeros(3,2),zeros(3,2)); return a union2 b; |
| Intersect | 集合交集 | 同上 | 同上 | a:=array(2+3j,3,2,1+2j); b:=array(1+2j,2,0,4+2j); return a intersect b; |
| Outersect | 集合对称差集 | 同上 | 同上 | a:=array(2+3j,3,2,1+2j); b:=array(1+2j,2,0,4+2j); return a Outersect b; |
| Minus | 集合差集 | 同上 | 同上 | a:=array(2+3j,3,2,1+2j); b:=array(1+2j,2,0,4+2j); return a Minus b; |
| In | 存在于判定,以最小的元素进行判断 | 复数Array、复数FMArray、支持与实数数组混合运算 | 布尔类型 | a:=4+2j; b:=array((1+2j,2),(0,4+2j)); return a in b; |
| sqlin | 存在于判定,以行进行判断 | 同上 | 同上 | a:=array(0,4+2j); b:=array((1+2j,2),(0,4+2j)); return a sqlin b; |
| 集合赋值运算 | ||||
| |= | 右并等于 | 复数Array、复数FMArray、支持与实数数组混合运算 | 复数Array、 复数FMArray | a:=complex(ones(2,2),ones(2,2)); b:=complex(zeros(3,2),zeros(3,2)); a|=b; return a; |
| :|= | 非完全矩阵右并等于 | 同上 | 同上 | a:=complex(ones(2,2),ones(2,2)); b:=complex(zeros(3,2),zeros(3,2)); a:|=b; return a; |
| &= | 集合合并等于 | 同上 | 同上 | a:=complex(ones(2,2),ones(2,2)); b:=complex(zeros(3,2),zeros(3,2)); a&=b; return a; |
| Union2= | 集合合并等于,并去重 | 同上 | 同上 | a:=complex(ones(2,2),ones(2,2)); b:=complex(zeros(3,2),zeros(3,2)); a union2=b; return a; |
| Intersect= | 集合交集等于 | 同上 | 同上 | a:=array(2+3j,3,2,1+2j); b:=array(1+2j,2,0,4+2j); a Intersect=b; return a; |
| Outersect= | 集合对称差集等于 | 同上 | 同上 | a:=array(2+3j,3,2,1+2j); b:=array(1+2j,2,0,4+2j); a Outersect=b; return a; |
| Minus= | 集合差集等于 | 同上 | 同上 | a:=array(2+3j,3,2,1+2j); b:=array(1+2j,2,0,4+2j); a Minus=b; return a; |
| No | 函数名 | 功能 | 举例 |
| 1 | Complex | 构建复数或复数矩阵 | Complex(1,2)返回1+2j |
| 2 | IfComplex | 判断是否为复数 | IfComplex(1+2j)返回1 |
| 3 | Datatype | 判断数据类型 复数的编号为41 | Datatype(1+2j)返回41 |
| 4 | real | 取实部 | 如real(2.5+3.2j)返回实数2.5 |
| 5 | Imag | 取虚部 | 如Imag(2.5+3.2j)返回实数3.2 |
| 6 | Conj | 共轭复数 | 如Conj (2.5+3.2j)返回2.5-3.2j |
| 7 | Abs | 取模 | 如Abs(3+4j)返回复数的模5 |
| 8 | Minit | 初始化FMArray | 如Minit(3,1+2j) |
| 9 | Minitdiag | 对角矩阵初始化FMArray | 如MinitDiag(3,3,1+0j); |
| 10 | Sqr | 求平方 | 如Sqr(3+1j) |
| 11 | Sqrt | 求平方根 | 如sqrt(5+12j) |
| 12 | dupValue | 复制值 | 如dupValue(2+1j) |
| 13 | Integer | 强制转换为整数 | 如Integer(3.33+2.5j)结果为3 |
| 14 | Int64 | 对实部进行取整 | int64(2.5+1.6j)返回2 |
| 15 | log10 | 以10为底的对数 | 如log10(2+1j) |
| 16 | Log2 | 以2为底的对数 | 如log2(2+1j) |
| 17 | LogN | 以指定N为底的对数 | 如LogN(3,2+1j) |
| 18 | Int | 将实部与虚部保留整数部分 | int(2.5+1.6j) 返回2.0+1.0j |
| 19 | Frac | 对实部与虚部进取小数部分 | Frac(6.4-3.2j)返回0.4-0.2j |
| 20 | Ceil | 对实部与虚部进行向上取整 | Ceil(6.1+3.5j)结果为7.0+4.0j |
| 21 | Ceil32 | 对实部与虚部进行向上取整 | Ceil32(6.1+3.5j)结果为7.0+4.0j |
| 22 | Ceil64 | 对实部与虚部进行向上取整 | Ceil64(6.1+3.5j) 结果为7.0+4.0j |
| 23 | Floor | 对实部与虚部进行向下取整 | Floor(6.1+3.5j)结果为6.0+3.0j |
| 24 | Floor32 | 对实部与虚部进行向下取整 | Floor32(6.1+3.5j)结果为6.0+3.0j |
| 25 | Floor64 | 对实部与虚部进行向下取整 | Floor64(6.1+3.5j)结果为6.0+3.0j |
| 26 | Trunc | 对实部与虚部进行近0取整 | Trunc(6.1-3.2j)结果为6.0-3.0j |
| 27 | Trunc32 | 对实部与虚部进行近0取整 | Trunc32(6.1-3.2j)结果为6.0-3.0j |
| 28 | Trunc64 | 对实部与虚部进行近0取整 | Trunc64(6.1-3.2j)结果为6.0-3.0j |
| 精度相关函数,对实部与虚部分别进行处理 | |||
| 29 | FloatN | 四舍五入 | 如:FloatN(2145.3456-1234.3446j,2) 返回:2145.35-1234.34j |
| 30 | RoundTo5 | .5处理 | RoundTo5(2.45-21.05j) 返回:2.5-21.0j |
| 31 | RoundTo | 四舍五入,银行家算法 | roundto(123.3446-123.3446j,-2) 返回:123.34-123.34j |
| 32 | SimpleRoundTo | 四舍五入 | simpleroundto(2154.3456-1246.3456j,2) 返回:2200.0-1200.0j |
| 33 | Round | 四舍五入后输出整数,银行家算法 | round(2145.3456-1234.3456j) 返回:2145.0-1234.0j |
| 34 | round32 | 四舍五入后输出整数,银行家算法 | round32(6.5+3.5j) 返回:6.0+4.0j |
| 35 | round64 | 四舍五入后输出整数,银行家算法 | Round64(6.5+3.5j) 返回:6.0+4.0j |
| 36 | simpleround | 四舍五入后输出整数 | simpleround(6.5+3.5j) 返回:7.0+4.0j |
| 37 | simpleround32 | 四舍五入后输出整数 | simpleround32(6.5+3.5j) 返回:7.0+4.0j |
| 38 | simpleround64 | 四舍五入后输出整数 | Simpleround64(6.5+3.5j) 返回:7.0+4.0j |
| 其它基础函数 | |||
| 39 | IsZero | 在指定精度下是否等于0,可用于判断两个值是否相等 | IsZero(0.000001+0.0001j,0.00001)结果为0 |
| 40 | ToStn | 转换成STN字符串 | 如tostn(2.2+3.5j)返回字符串的” 2.2+3.5j” |
| 41 | Stn | 将串转成任意类型 | 如stn(“1+2j”)返回复数1.0+2.0j |
| 42 | Format | 将数值转换成指定格式字符串 | 如Format("%.3f",2.55+4.1j)返回字符串” 2.550+4.100j” |
| 43 | DivValue | 除运算 | 如DivValue(2+3j,3+4j)等同于(2+3j)/( 3+4j) |
| 44 | Eval | 执行表达式 | 如eval(&"2+3.22+3.14j")返回5.22+3.14j |
| 45 | call | 调用函数 | 如call("abs",3-4j) 返回5 |
| 46 | CallInarray | 调用函数 | 如callInarray("abs",array(3-4j))返回5 |
| No | 函数名 | 功能 | 与实数处理的差异 | |
| 1 | IfComplex | 判断每个元素是否为复数,如 ifComplex(array(2,2j),1) | ||
| 2 | Datatype | 返回每个元素的数据类型的编号,如 Datatype(array(2,2j),1) | ||
| 3 | arraytofm | 将Array数组转成FMarray矩阵 如arraytofm(t,2j) | ||
| 4 | ExportCsv | 将数组转成csv字符串,如 ExportCsv(array((2+3j,1+2j),(2,3)),s) | ||
| ….其它数据类型的判定函数 | ||||
| 统计函数 | 具体用法请查看官方函数说明 | |||
| 1 | Mean | 求算术平均值 | ||
| 2 | Sum | 求和 | ||
| 3 | sumInt | 对实部和虚部分别求整数部分和 | 算法: sumint(real(a))+sumint(imag(a))*1j | |
| 4 | SumOfSquares | 求数组平方和 | 无 | |
| 5 | Norm | 求数组平方和的平方根 | 在复数的计算中,a*conj(a)会替代平方,因此Norm的算法为: sqrt(sum(a*conj(a))) 虚部恒为0,所以norm仅返回实部的值 | |
| 6 | SumsAndSquares | 计算总和以及平方和 | 无 | |
| 7 | StdDev | 样本标准差 | 算法中计算平方由a*conj(a)替代,其它不变 | |
| 8 | PopnStdDev | 总体标准差 | 算法中计算平方由a*conj(a)替代,其它不变 | |
| 9 | Variance | 样本方差 | 算法中计算平方由a*conj(a)替代,其它不变 | |
| 10 | PopnVariance | 总体方差 | 算法中计算平方由a*conj(a)替代,其它不变 | |
| 11 | TotalVariance | 总体偏差 | 算法中计算平方由a*conj(a)替代,其它不变 | |
| 12 | MeanAndStdDev | 计算平均值和标准差 | 标准差算法同StdDev | |
| 13 | Geomean | 几何平均数 | ||
| 14 | Harmean | 调和平均数 | ||
| 15 | Mode | 众数 | ||
| 16 | AveDev | 均值绝对偏差 | ||
| 17 | DevSq | 样本平均值偏差的平方和 | 算法中计算平方由a*conj(a)替代,其它不变 | |
| 18 | Product | 累乘值 | ||
| 19 | Randomfrom | 从一组数据中随机抽取一个样本 | ||
| 20 | VariationCoefficient | 变异系数 | 算法中计算平方由a*conj(a)替代,其它不变,需等升级 | |
| 双序列统计函数 | ||||
| 1 | Cov | 协方差 | E[X-ux*Conj(Y-uy)] | |
| 2 | Correl | 相关系数 | Cov与PopnStdDev符合复数运算 | |
| 3 | Slopeandintercept | 回归斜率和截距 | ||
| 4 | Slope | 回归斜率 | ||
| 5 | Intercept | 回归截距 | ||
| 6 | RSQ | 乘积矩相关系数平方 | ||
| 7 | Steyx | 相对标准偏差 | ||
| 8 | BetaAndAlpha | 斜率和截距 | ||
| 9 | MeanAndPopnStdDevWithRate | 带权重总体标准差以及平均值 | ||
| 矩阵运算及分解 | ||||
| 1 | mt_Transposition | 矩阵转置 | ||
| 2 | mt_Multiplication | 矩阵乘 | ||
| 3 | mt_Addition | 矩阵和 | ||
| 4 | mt_Subtraction | 矩阵差 | ||
| 5 | Mt_decompose_lu | 进行lu分解, 函数输出中vi为0,wr为复数特征值 | ||
| 6 | Mt_decompose_qr | 对矩阵进行QR分解 | ||
| 7 | Mt_decompose_eig | 特征值及特征向量 | ||
| 8 | Mt_decompose_chol | cholesky分解 | ||
| 9 | Mt_decompose_svd | 进行SVD分解 | 实矩阵验证方式: U :* (eye(n,m)*s) :* `v 复矩阵验证方式: U :* (eye(n,m)*s) :* conj(`v) | |
| 10 | Mt_decompose_ldl | ldl分解 |
A:=new TA(); Echo "Set A to NIL\r\n"; A:=nil; Echo "Run end\r\n"; Type TA=class FB; Public Function Create(); Begin FB:=new TB(self); end; Function Destroy(); Begin Echo "Destroy\r\n"; End; End; | type TB=class FOwner; Public function create(Owner); begin FOwner:=Owner; end; end; 打印结果: Set A to NIL Run end | ![]() |
A:=new TA(); Echo "Set A to NIL\r\n"; A:=nil; Echo "Run end\r\n"; Type TA=class FB; Public Function Create(); Begin FB:=new TB(self); end; Function Destroy(); Begin Echo "Destroy\r\n"; End; End; | type TB=class FOwner; Public function create(Owner); begin FOwner:=MakeWeakRef(Owner); end; end; 打印结果: Set A to NIL Destroy Run end |
|
A:=new TA(); Echo "Set A to NIL\r\n"; A:=nil; Echo "Run end\r\n"; Type TA=class FB; Public Function Create(); Begin FB:=new TB(self); end; Function Destroy(); Begin Echo "Destroy\r\n"; End; End; | type TB=class
[WeakRef]FOwner; Public function create(Owner); begin FOwner:=Owner;//弱引用 end; end; 打印结果: Set A to NIL Destroy Run end |
|