playbook/codex/skills/tsl-guide/references/primer.md

5.0 KiB
Raw Blame History

TSL 基础语法完整版

本文档是 $tsl-guide 的子文档,聚焦基础语法。代码风格与命名规范请见 docs/tsl/code_style.mddocs/tsl/naming.md

目录


语言元素与注释

标识符与关键字

  • 关键字为保留字(完整列表见 docs/tsl/syntax_book/01_language_basics.md
  • 标识符用于变量、函数、类、unit 等命名

注释

// 行注释
{ 块注释 }
/* 另一种块注释 */

编译选项(语法级)

{$Explicit+}  // 要求变量先声明再使用
{$Explicit-}  // 关闭显式声明
{$VarByRef-}  // 默认参数按值传递(可用 in/var/out 覆盖)

变量与常量

赋值

A := 1;
B := 2.5;
S := "hello";

常量

Const PI = 3.14159;
Const MaxRetry = 3;

显式变量声明(配合 {$Explicit+}

{$Explicit+}

Var A,B;          // 多变量声明
Var C := 10;      // 声明并初始化
Var D:Integer;    // 类型可写可省(类型信息不做强校验)

数据类型与字面量

常见类型(参考 01_language_basics.md

类型 说明
Integer / Int64 整数
Real 浮点数
Boolean 布尔值true/false
TDateTime 日期时间
String 字符串
Binary 二进制
Array 数组
Matrix / TMatrix 矩阵
NIL 空值

示例:

I := 42;
R := 3.14;
B := true;
T := Date();
S := 'hello';
N := nil;

字符串支持单引号或双引号,索引访问从 0 开始:

S := "ABC";
Ch := S[0];

数组与表数组

一维数组0-based

Arr := array(2,3,5,7,11);
First := Arr[0];

字符串下标(表数组)

Row := array("Code":"0001","Price":12.3);
Code := Row["Code"];

多维数组

Mat := array((1,2,3),(4,5,6));
Value := Mat[0][1];

运算符与表达式

常用运算符

  • 赋值::=, +=, -=, *=, /=
  • 算术:+ - * / div mod ^
  • 关系:= <> < > <= >= like in
  • 逻辑:and or not
  • 三目:cond ? a : b

示例:

C := A + B;
Ok := (A = B) or (A > 0);
X := (A > B) ? A : B;

矩阵/数组相关的 .=.< 等算符在扩展语法中说明(见 06_extended_syntax.md)。 完整运算符清单见 01_language_basics.md


函数

基本结构

Function HelloTSL();
Begin
  D := Date();
  Return DateToStr(D);
End;

形参与实参in/const/var/out

Function Calc(in a, var b, out c);
Begin
  b := b + a;
  c := b * 2;
  Return c;
End;

缺省参数(新一代语法)

Function Foo(a,b=a+1);
Begin
  Return b;
End;

命名参数(新一代语法)

Function FuncA(a,b,c);
Begin
  Return array(a,b,c);
End;

Result := FuncA(1, c:3); // b 默认为 nil

变参(...)与 Params

Function SumAll(...);
Begin
  Total := 0;
  For i,v in Params do
    Total := Total + v;
  Return Total;
End;

相关内置:Params, ParamCount, RealParamCount

返回与退出

Return X;   // 返回
Exit;       // 退出函数

外部函数声明external

Function GetTickCount():Integer; stdcall; external "kernel32.dll" name "GetTickCount" KeepResident;

更多外部接口与调用方式见 03_functions.md


控制流

if / else if

If x>0 then
  y := 1
else if x=0 then
  y := 0
else
  y := -1;

if 表达式(新一代语法)

Ret := if x>0 then x*x else 0;

case

Case Age Of
  0: Writeln("Baby");
  1: Writeln("Toddler");
else
  Writeln("Other");
End;

while / repeat

While cond do
  DoSomething();

Repeat
  DoSomething();
Until cond;

forto / downto / step

For i := 1 to 10 do
  Sum := Sum + i;

For i := 10 downto 1 step 2 do
  Sum := Sum + i;

for ... in数组遍历

Data := array('a':1,'b':5,'c':3);
Sum := 0;

For k,v in Data do
  Sum := Sum + v;

break / continue / goto

While cond do
Begin
  If stop then Break;
  If skip then Continue;
  // ...
End;

Goto Finded;
label Finded;
  Writeln("jumped");

异常处理

Try / Except

Try
  V := StrToInt(S);
Except
  V := 0;
  Writeln(ExceptObject.ErrInfo);
End;

Try / Finally

Try
  DoWork();
Finally
  Cleanup();
End;

Raise

If A < 0 then Raise "A 不能小于 0";

异常信息可通过 ExceptObject.ErrInfo/ErrLine/ErrNo 获取。


调试与性能相关语句

DebugReturn 1;
T1 := MTIC;
// ...
Elapsed := MTOC(T1);

更多调试/性能语法见 02_control_flow.md07_debug_and_profiler.md