5.4 KiB
5.4 KiB
TSL 基础语法完整版
本文档是
$tsl-guide的子文档,聚焦基础语法。代码风格与命名规范请见docs/tsl/code_style.md与docs/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 kPi = 3.14159;
const kMaxRetry = 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"];
多维数组
matrix := array((1, 2, 3), (4, 5, 6));
value := matrix[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;
参数分隔与类型注解
类型注解仅用于说明与阅读,编译器不做类型检查。
- 无类型注解时用逗号分隔参数
- 带类型注解时用分号分隔参数
- 返回值类型写在
)之后
function F1(a, b);
function F2(a: string; b: array of real);
function F3(): void;
形参与实参(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 value; // 返回
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;
for(to / 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 found;
label found;
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.md 与 07_debug_and_profiler.md。