lookup.py: exempt code-anchored ASCII identifiers from the mixed zh/en gate so exact hits are no longer dropped; dedup parent/child sections in results; validate write-prelude anchors in --check. references: correct interpreter-verified facts (case-as-expression, control-flow semicolons, __line__/__stack_frame, tslObjects order, destroy timing, ErrDefine, truncated outputs), fix headings, scope qualifiers and reversed quotes; strip dead preamble metadata from all 24 pages. packaging: exclude __pycache__/*.pyc from playbook and bundle copies; update build test file-count assertion to match. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
8.3 KiB
8.3 KiB
TSL 内置运行时对象
这一篇只收运行时内置对象的文档明确最小模型。这里讲的是语言运行时对象,不是金融业务 API。
本篇职责
回答“写普通 TSL/TSF 脚本时,哪些内置对象可以直接创建,最小可用接口是什么,哪些对象其实依赖特定运行上下文”。
智能体内置运行时对象判断流程
- 先判断要访问哪个内置运行时对象,以及它是不是语言对象而非业务 API。
- 只照本页明确的最小读写路径使用内置对象。
- 不要把金融业务上下文对象和语言运行时对象混在一起。
- 系统参数和
with后缀的事实见 10_runtime_context_and_with.md。 - 没有对应代码块时不要发明内置运行时对象写法。
核心规则
TStringList可以直接用new TStringList()创建。TStringList支持数字下标、字符串键下标、Count和Add(...)。THashedStringList可以直接创建,最小用法与TStringList接近,适合按名称快速取值。- 流对象应先按
TStream家族理解;普通脚本里的最小可靠入口是TMemoryStream这种具体类型。 - 直接
new TStream()会失败,错误信息包含function:TStream compile error or not found。 TMemoryStream支持Write(...)、Read(...)、Position、Size。TFileStream可以带目录别名、文件名和打开模式创建,并支持TStream的读写位置模型。TCipher不是“无参即可创建”的对象;new TCipher()会失败。TCipher的最小写法是new TCipher(2),然后设置Password再做Encrypt(...)/Decrypt(...)。TRsa可以直接创建;先GenerateKey(...),再读取PublicKey/PrivateKey或执行公私钥加解密。TIniFile适合读写磁盘 INI 文件;TMemIniFile适合内存 INI 数据。MailMsg和MessagePart可以直接创建并设置消息字段,但发送邮件流程属于 SMTP 对象/外部服务边界。TWebRequest和TWebResponse在普通脚本里不作为可直接new的对象。- 因此,Web 请求 / 响应对象不要直接写进普通脚本模板;它们应视为特定运行上下文对象。
- 本页不承担对象完整方法表;只收能让 agent 稳定生成代码的最小入口。
- 本页失败创建示例只用于边界判断,不作为业务代码模板复制。
可直接照写示例
TStringList
代码块身份:可直接照写示例
list := new TStringList();
list.CommaText := "A=aaa,B=bbb,C=222";
writeLn(list[1]);
writeLn(list["B"]);
writeLn(list.Count);
list.Add("D=444");
writeLn(list.Count);
结果说明:
- 依次输出
B=bbb、bbb、3、4 - 说明既可以按数字下标取整行,也可以按键名取
Name=Value里的值
THashedStringList
代码块身份:可直接照写示例
list := new THashedStringList();
list.Add("A=aaa");
list.Add("B=bbb");
writeLn(list.Count);
writeLn(list["B"]);
结果说明:
- 依次输出
2、bbb - 说明
THashedStringList可按Name=Value的名称键读取值
TStream 家族的最小可靠入口:TMemoryStream 与 TFileStream
代码块身份:可直接照写示例
mem := new TMemoryStream();
buffer := "ABC";
mem.Write(buffer, 3);
mem.Position := 0;
outbuf := "xxx";
mem.Read(outbuf, 3);
writeLn(outbuf);
writeLn(mem.Size);
结果说明:
- 依次输出
ABC、3 - 说明普通脚本里应优先使用
TMemoryStream这类具体流对象。
TFileStream 可直接打开文件并沿用 TStream 的 Write(...) / Read(...) / Position / Size 模型:
代码块身份:可直接照写示例
file_name := "object_probe.txt";
stream := new TFileStream("", file_name, 65535);
buffer := "ABC";
stream.Write(buffer, 3);
writeLn(stream.Size);
stream.Position := 0;
outbuf := "xxx";
stream.Read(outbuf, 3);
writeLn(outbuf);
结果说明:
- 依次输出
3、ABC TFileStream("", file_name, 65535)可作为最小读写文件流骨架
裸 TStream 创建反例:
代码块身份:反例 / 不可照写
base := new TStream();
writeLn(ifObj(base));
结果说明:
- 上面这种写法会报
function:TStream compile error or not found。 - 不要把裸
TStream当成可直接创建对象。
TCipher
无参创建反例:
代码块身份:反例 / 不可照写
bad := new TCipher();
writeLn(ifObj(bad));
结果说明:
- 上面这种写法会报
New Class TCipher Error.。 TCipher不要无参创建。
带模式参数创建:
代码块身份:可直接照写示例
cipher := new TCipher(2);
cipher.Password := "Tinysoft";
enc := cipher.Encrypt("abc");
writeLn(enc <> "abc");
writeLn(cipher.Decrypt(enc));
结果说明:
- 依次输出
1、abc - 说明
TCipher必须按“带模式参数创建”来写,随后可稳定走Password -> Encrypt -> Decrypt
TRsa
代码块身份:可直接照写示例
rsa := new TRsa();
rsa.GenerateKey(1024);
plain := "abc";
enc := rsa.PubEncrypt(plain);
writeLn(rsa.PriDecrypt(enc));
enc2 := rsa.PriEncrypt(plain);
writeLn(rsa.PubDecrypt(enc2));
writeLn(length(rsa.PublicKey) > 0);
writeLn(length(rsa.PrivateKey) > 0);
结果说明:
- 依次输出
abc、abc、1、1 - 说明
TRsa先生成密钥,再用公钥加密 / 私钥解密,或私钥加密 / 公钥解密
TIniFile 与 TMemIniFile
磁盘 INI 文件:
代码块身份:可直接照写示例
ini := new TIniFile("", "object_probe.ini");
ini.WriteString("S", "K", "V");
writeLn(ini.ReadString("S", "K", ""));
ini.WriteInteger("S", "N", 123);
writeLn(ini.ReadInteger("S", "N", 0));
结果说明:
- 依次输出
V、123 - 说明
TIniFile适合直接读写磁盘 INI 文件
内存 INI 数据:
代码块身份:可直接照写示例
ini := new TMemIniFile();
ini.WriteString("S", "K", "V");
writeLn(ini.ReadString("S", "K", ""));
结果说明:
- 输出
V - 说明
TMemIniFile可不依赖磁盘文件,直接读写内存 INI 数据
MailMsg 与 MessagePart
代码块身份:可直接照写示例
msg := new MailMsg();
msg.Subject := "Hello";
msg.Body := "BodyText";
msg.Sender := "sender@example.com";
msg.Recipients := "to@example.com";
writeLn(msg.Subject);
writeLn(msg.Body);
writeLn(length(msg.AsString) > 0);
part := new MessagePart();
part.ContentType := "text/plain";
part.Body := "PartBody";
writeLn(part.ContentType);
writeLn(part.Body);
结果说明:
- 依次输出
Hello、BodyText、1、text/plain、PartBody - 说明
MailMsg/MessagePart可作为消息数据对象使用 - 发送邮件应回到 SMTP 对象和外部服务配置,不在本页生成连接/认证/发送模板
TWebRequest / TWebResponse 的普通脚本边界
代码块身份:反例 / 不可照写
req := new TWebRequest();
resp := new TWebResponse();
结果说明:
new TWebRequest()会报function:TWebRequest compile error or not found。new TWebResponse()会报function:TWebResponse compile error or not found。- 普通脚本里,Web 请求 / 响应对象不能直接按普通
new ...()脚本对象来写。
本页不生成的范围
FTP/SMTP/POP3的连接、认证、上传下载、发送邮件和收取邮件流程。TWebRequest/TWebResponse的 Web 请求响应流程。TCookie/TCookieCollection。THandleStream。TRegistryIniFile。TSessionMan/TSession。
这些对象不作为本页可生成业务流程;不要因为源资料里出现过就默认生成连接、认证、网络访问、Web 请求响应或会话管理代码。
禁止项
- 不要直接把
new TStream()写成普通脚本里的可靠创建方式。 - 不要无参创建
TCipher;最小可靠写法是new TCipher(2)后再设置Password。 - 不要把
TWebRequest/TWebResponse写进普通脚本模板。 - 不要把
MailMsg.AddText(...)当成默认消息正文写法;普通正文优先设置Body。 - 不要在缺少主机、账号、密码、端口和协议要求时生成
FTP/SMTP/POP3连接流程。 - 不要把未写入文档资料里的内置对象,当成语法事实。
- 不要把本页反例块里的失败创建代码包进
try/except后当成业务模板。