7.2 KiB
Syntax Quickstart
文档类型:语法主线 是否可直接用于生成代码:是 是否含已验证可执行示例:是 是否含已验证反例:是 遇到不确定时跳转到:03_core_model.md、06_functions_and_calls.md、10_units_and_scope.md
手册位置:第 2 篇,共 32 篇。上一篇:01_introduction.md。下一篇:03_core_model.md。
这一篇集中回答两个紧邻问题:用户已给出 .tsl / .tsf 后缀时,agent 应该如何按后缀组织代码;以及落代码前必须先核对哪些语言硬规则。
这一篇解决什么问题
快速回答“当前任务已经给出后缀或交付目标时,应该使用哪一种骨架”,并提供一份单点的语言核心事实速查。
Agent 快速落代码流程
- 先看用户有没有指定
.tsl/.tsf后缀;指定后缀时,后缀就是文件形态判断依据。 - 用户未指定后缀时,再根据交付目标判断
.tsl或.tsf:可执行脚本用.tsl,通用模块 / 函数扩展用.tsf。 - 只从
代码块身份:已验证可执行示例的骨架起手;遇到反例 / 不可照写必须避开。 - 写
.tsl时,先写会执行的语句区;需要函数或类时,把声明区放在语句区之后。 - 写
.tsf时,只写模块 / 函数扩展内容;部署、查找路径和解释器环境属于项目执行层。 - 当前页和对应专题页没有覆盖的写法,不要发明语法;改为跳转补证、向用户确认,或记录文档缺口。
语言核心事实速查
这一节是当前语法手册默认的语言硬规则收口点。涉及赋值、.tsl 语句区 / 声明区、.tsf 模块、命名参数、类写法、unit 骨架和下标规则时,统一先看这里。
- 普通赋值用
:=,不要把=当成普通赋值。 - 用户已给出
.tsl/.tsf后缀时,后缀就是判断依据;用户未给后缀时,再按交付目标判断。 - 未给后缀时,可执行代码对应
.tsl,通用模块对应.tsf;仍不明确时向用户确认。 .tsl是可执行脚本:语句区在前并按顺序执行;函数/类声明区在后,供前面的语句调用或运行时解析。.tsf是模块/函数扩展文件:部署到解释器funcext后,脚本可以直接调用其中暴露的顶层函数。- 在
.tsl中,如果需要函数或类,先写会执行的语句区,再写函数/类声明区;不要在声明区后面继续追加脚本语句。 - 无返回值时用
procedure Name(...); begin ... end;,不要勉强用function。 - 顶层类定义统一写成
type Name = class ... end;,不要写裸class Name。 - 多文件组织默认先按
unit Name; interface ... implementation ... end.理解。 - 命名参数写法是
Func(a:1, b:2)。 array(...)既可以写顺序数组,也可以写字符串键表;数组下标从0开始,字符串下标从1开始。
术语对照
- 文档里出现的“脚本语句区”,指
.tsl文件开头会按顺序执行的语句。 - 文档里出现的“声明区”,指
.tsl语句区之后的function / procedure或type Name = class声明。 - 文档里出现的“顶层
function / procedure”“顶层函数骨架”“顶层函数定义体”,在.tsf中指模块暴露的顶层函数,在.tsl中指脚本声明区里的函数。 - 文档里出现的
class function和“类方法”,指的是同一件事:前者是代码关键字写法,后者是中文描述。
先选哪一种骨架
| 当前任务 | 起手骨架 |
|---|---|
| 写一次性可执行逻辑 | .tsl 脚本语句区 |
| 脚本逻辑需要调用本文件内函数 | .tsl 语句区 + 后置函数声明区 |
| 脚本逻辑需要对象状态、字段、方法 | .tsl 语句区 + 后置类声明区 |
| 沉淀可复用函数并给脚本直接调用 | .tsf 顶层函数,部署到 funcext |
| 需要把接口和实现组织进一个模块 | .tsf unit |
默认建议:
- 如果你只是要让 agent 先写出一段最稳、最容易续写的可执行代码,优先从
.tsl脚本语句区开始。 - 不要把
unit当成最小起手骨架;只有用户明确要模块接口 / 实现组织,或项目已有unit边界时,才进入unit写法。 uses往往天然进入多文件查找路径问题,所以不放进这篇的最小起手骨架里。
已验证最小骨架
.tsl 脚本语句区骨架:
代码块身份:已验证可执行示例
a := 1;
.tsl 语句区调用后置函数声明:
代码块身份:已验证可执行示例
a := 1;
test();
function test();
begin
echo "test";
end;
代码块身份:已验证输出片段
test
.tsl 语句区调用后置类声明:
代码块身份:已验证可执行示例
obj := CreateObject("MyClass");
obj.value := 5;
echo obj.value;
type MyClass = class
value;
end;
代码块身份:已验证输出片段
5
.tsf 顶层函数骨架:
代码块身份:已验证可执行示例
function Test1();
begin
echo "test1";
end;
代码块说明:这个 .tsf 部署到解释器 funcext 后,.tsl 脚本可以直接调用 Test1();。部署方式属于项目执行层,不写进通用语法页。
代码块身份:已验证输出片段
test1
.tsf unit 骨架:
代码块身份:已验证可执行示例
unit DemoUnit;
interface
function Ping();
implementation
function Ping();
begin
return 1;
end;
end.
代码块说明:这个 .tsf 骨架用于模块接口 / 实现组织;已通过 .tsl 脚本 uses DemoUnit 调用 Ping() 验证返回值为 1。调用脚本和查找路径边界见 10_units_and_scope.md。
最常用起手版本
如果你现在没有明确的模块复用或对象建模需求,直接从 .tsl 脚本版本开始:
代码块身份:已验证可执行示例
echo "hello";
代码块身份:已验证输出片段
hello
最容易写错的一件事
.tsl可以同时有语句区和声明区;真正要避免的是在声明区后面继续追加脚本语句。
代码块身份:反例 / 不可照写
a := 1;
test();
function test();
begin
echo "test";
end;
echo "after declaration";
上面最后一行属于“声明区之后继续写脚本语句”。写 .tsl 时先把会执行的语句放在前面,再把函数/类声明放在后面。
代码块身份:已验证输出片段
Execute script error at Line:9
function:__main__:line 9: invalid statement
跳转指引
- 先建立整体读法:见 01_introduction.md
- 继续判断顶层模型:见 03_core_model.md
- 继续写函数:见 06_functions_and_calls.md
- 继续写
unit/uses:见 10_units_and_scope.md - 继续写类:见 09_objects_and_classes.md