♻️ refactor(playbook): streamline agents and refresh tsl docs
This commit is contained in:
parent
b529012c59
commit
5822a8736d
|
|
@ -1,33 +0,0 @@
|
|||
# 安全与鉴权(Auth)
|
||||
|
||||
本文件定义代理在处理鉴权、安全、敏感数据相关任务时的边界与要求。
|
||||
|
||||
## 1. 基本原则
|
||||
|
||||
- **最小权限**:只使用完成任务所需的最低权限与最少数据。
|
||||
- **默认保守**:不确定是否敏感时按敏感处理。
|
||||
- **不扩散秘密**:任何 secret 只在必要范围内出现。
|
||||
|
||||
## 2. 凭证与敏感信息
|
||||
|
||||
- 不要在代码、日志、注释或文档中写入明文密钥、Token、密码。
|
||||
- 如需示例,使用占位符:`<TOKEN>`、`<PASSWORD>`。
|
||||
- 避免把敏感信息打印到标准输出或错误日志。
|
||||
|
||||
## 3. 鉴权逻辑修改
|
||||
|
||||
- 修改鉴权/权限控制时必须说明:
|
||||
- 变更动机
|
||||
- 风险评估
|
||||
- 兼容性/回滚方案
|
||||
- 默认保持旧行为兼容,除非明确要求破坏性变更。
|
||||
|
||||
## 4. 依赖与第三方
|
||||
|
||||
- 禁止无理由新增依赖,尤其是网络、加密、认证相关依赖。
|
||||
- 若必须新增,需在 PR 说明理由、替代方案与安全影响。
|
||||
|
||||
## 5. 审计与合规
|
||||
|
||||
- 任何涉及用户数据/权限边界的改动需可审计:代码清晰、注释说明“为什么”。
|
||||
- 发现潜在安全漏洞时,优先修复或明确标注 `FIXME(name): security risk ...`。
|
||||
|
|
@ -1,37 +0,0 @@
|
|||
# 代码质量(Code Quality)
|
||||
|
||||
本文件定义代理对代码质量的最低要求与审查清单(C++)。
|
||||
|
||||
## 1. 总体要求
|
||||
|
||||
- C++ 代码遵守 `docs/cpp/code_style.md` 与
|
||||
`docs/cpp/naming.md`(在目标项目中通常 vendoring 到标准快照路径)。
|
||||
- 统一使用
|
||||
`clang-format`(Google 基线)保持格式一致;不要手工“对齐排版”制造 diff 噪音。
|
||||
- 改动聚焦目标;避免“顺手重构”。
|
||||
- API 变更要显式说明影响与迁移方式。
|
||||
- 涉及三方依赖(例如 Conan)的改动必须说明动机、替代方案与影响面;默认不“顺手升级依赖”。
|
||||
- 涉及 C++ Modules 的改动(`.cppm` 或 `export module`
|
||||
变更)必须同步更新构建系统的模块清单与相关 target 配置。
|
||||
|
||||
## 2. 可读性
|
||||
|
||||
- 复杂逻辑拆分为具名函数/类型;避免深层嵌套与重复代码。
|
||||
- 必要注释解释“为什么”而不是“做什么”。
|
||||
|
||||
## 3. 错误处理与资源管理
|
||||
|
||||
- 默认使用 RAII;避免裸 `new/delete`。
|
||||
- 失败路径必须可观测(返回值/异常/日志其一或按项目约定)。
|
||||
|
||||
## 4. 复杂度与规模
|
||||
|
||||
- 单函数尽量 ≤ 80 行;超过应说明原因或拆分(可按项目调整)。
|
||||
- 单次 PR 尽量小步提交,便于 review。
|
||||
|
||||
## 5. Review 清单
|
||||
|
||||
- 是否有无关改动?
|
||||
- 是否保持模块内风格一致?
|
||||
- 是否引入不必要的复杂度/依赖?
|
||||
- 是否有最小验证(构建/冒烟)步骤?
|
||||
|
|
@ -1,47 +1,50 @@
|
|||
# C++ 代理规则集(.agents/cpp)
|
||||
# C++ 代理规则集
|
||||
|
||||
本规则集用于存放 **AI/自动化代理在仓库内工作时必须遵守的规则**(C++ 语言专属)。
|
||||
本规则集定义 AI/自动化代理在处理 C++ 代码时必须遵守的核心约束。
|
||||
|
||||
## 范围与优先级
|
||||
|
||||
- 作为仓库级基线规则集使用;更靠近代码目录的规则应更具体并可覆盖基线。
|
||||
- 当代理规则与 `docs` 发生冲突时:
|
||||
1. 安全/合规优先
|
||||
2. 其次保持仓库现有一致性
|
||||
- 作为仓库级基线规则集使用;更靠近代码目录的规则更具体并可覆盖基线。
|
||||
- 当代理规则与 docs 冲突:安全/合规优先,其次保持仓库一致性。
|
||||
|
||||
## 代理工作原则
|
||||
## 代理工作原则(铁律)
|
||||
|
||||
- 先理解目标与上下文,再动手改代码。
|
||||
- 修改要小而清晰;避免无关重构。
|
||||
- 不要引入新依赖或工具,除非明确要求。
|
||||
1. 先理解目标与上下文,再动手改代码
|
||||
2. 修改要小而清晰;避免无关重构
|
||||
3. 发现安全问题(内存安全/鉴权漏洞)立即标注或修复
|
||||
4. 不引入新依赖或工具,除非明确要求
|
||||
|
||||
## 子文档
|
||||
## C++ 核心约定(不可违反)
|
||||
|
||||
- 安全与鉴权:`auth.md`
|
||||
- 性能:`performance.md`
|
||||
- 代码质量:`code_quality.md`
|
||||
- 测试:`testing.md`
|
||||
- 语言标准:C++23;优先使用 Modules;避免裸指针、`new/delete`、C 风格字符串
|
||||
- 代码风格:Google C++ Style Guide;使用项目 `.clang-format`;头文件保护用 `#pragma once`
|
||||
- 命名规范:文件 `lower_with_under.cpp/.h/.cppm`;类型 `CapWords`;函数/变量 `lower_with_under`;常量 `kCapWords`;成员 `lower_with_under_`;命名空间 `lower_with_under`
|
||||
- Modules 工程:模块名点分层 `lower_snake_case`;接口文件 `.cppm`;修改 `export module` 必须更新 CMake module file-set
|
||||
- 构建与依赖:Conan 需提供 `conan-release`/`conan-debug`;`conan install` + `cmake --preset ...`;Windows 通过 Linux + Clang 交叉编译验证
|
||||
|
||||
## C++ 必要约定(必须遵守)
|
||||
## 安全红线(不可触碰)
|
||||
|
||||
- 语言标准:C++23(含 Modules)。
|
||||
- 格式化:统一使用
|
||||
`clang-format`(Google 基线);避免手工排版对齐造成 diff 噪音。
|
||||
- 文件与命名:遵守 `docs/cpp/` 下的规范(或目标项目 vendoring 的标准快照路径)。
|
||||
- Modules:module 名建议使用点分层级;每段用 `lower_snake_case`;module
|
||||
interface unit 推荐 `.cppm`。
|
||||
- Modules 工程:新增/删除/重命名 `.cppm` 或修改 `export module`
|
||||
时,必须更新 CMake target 的模块 file-set/清单(否则构建容易漂移)。
|
||||
- Windows:不支持原生 Windows 开发环境;Windows 产物通过 Linux +
|
||||
Clang 交叉编译 profile 验证(profile 的 `[settings] os=Windows`)。
|
||||
- 依赖管理(如使用 Conan):必须提供统一 preset(`conan-release`/`conan-debug`);优先通过
|
||||
`conan install` + `cmake --preset ...`
|
||||
验证;如遇 Conan 家目录权限问题可临时设置 `CONAN_HOME=/tmp/conan-home`。
|
||||
- 不得在代码/日志/注释中写入明文密钥、密码、Token、API Key
|
||||
- 避免内存不安全操作:悬垂指针、双重释放、越界访问
|
||||
- 禁用不安全函数(`strcpy`, `sprintf`, `gets` 等)
|
||||
- 修改鉴权/权限逻辑必须说明动机与风险
|
||||
|
||||
## 权威来源
|
||||
|
||||
- 代码风格:`docs/cpp/code_style.md`
|
||||
- 命名规范:`docs/cpp/naming.md`
|
||||
- 工具链:`docs/cpp/toolchain.md`
|
||||
- 依赖管理:`docs/cpp/dependencies_conan.md`
|
||||
- clangd 配置:`docs/cpp/clangd.md`
|
||||
|
||||
## Skills(按需加载)
|
||||
|
||||
- `$performance-optimization`
|
||||
- `$testing-workflow`
|
||||
- `$code-review-workflow`
|
||||
- `$commit-message`
|
||||
|
||||
## 与开发规范的关系
|
||||
|
||||
- 在本仓库内:`docs/cpp/` 与 `docs/common/`。
|
||||
- 在目标项目内(若按 README 推荐的 subtree prefix `docs/standards/playbook`):
|
||||
- 代码风格:`docs/standards/playbook/docs/cpp/code_style.md`
|
||||
- 命名规范:`docs/standards/playbook/docs/cpp/naming.md`
|
||||
- 提交信息:`docs/standards/playbook/docs/common/commit_message.md`
|
||||
- 本仓库内:`docs/cpp/` 与 `docs/common/`
|
||||
- 目标项目 subtree:`docs/standards/playbook/docs/cpp/` 与 `docs/standards/playbook/docs/common/`
|
||||
|
|
|
|||
|
|
@ -1,31 +0,0 @@
|
|||
# 性能(Performance)
|
||||
|
||||
本文件定义代理在做性能相关改动时的准则与检查项。
|
||||
|
||||
## 1. 目标与度量
|
||||
|
||||
- 明确性能目标:延迟、吞吐、内存、CPU、I/O 等。
|
||||
- 没有指标时不要盲目优化;先补充测量或基准。
|
||||
|
||||
## 2. 处理流程
|
||||
|
||||
1. 先定位瓶颈(profile/trace/log)。
|
||||
2. 再提出最小化改动方案。
|
||||
3. 最后用数据验证收益与副作用。
|
||||
|
||||
## 3. 优化准则
|
||||
|
||||
- 优先消除算法/结构性问题,再考虑微优化。
|
||||
- 避免引入复杂度换取小收益。
|
||||
- 性能优化不应牺牲可读性;必要时加注释说明权衡。
|
||||
|
||||
## 4. 常见风险
|
||||
|
||||
- 避免重复计算、无界缓存、隐式复制。
|
||||
- 注意热路径中的分配与 I/O。
|
||||
- 并发优化要考虑正确性与可测试性。
|
||||
|
||||
## 5. 验证
|
||||
|
||||
- 提供优化前后可复现的对比数据(基准、采样结果或压测报告)。
|
||||
- 若无测试体系,至少提供最小可运行的复现脚本/步骤。
|
||||
|
|
@ -1,26 +0,0 @@
|
|||
# 测试(Testing)
|
||||
|
||||
本文件定义代理在改动代码时的测试策略与要求。
|
||||
|
||||
## 1. 测试层级
|
||||
|
||||
- **单元测试**:验证函数/模块的独立行为。
|
||||
- **集成测试**:验证模块间交互与关键流程。
|
||||
- **回归测试**:防止已修复问题复发。
|
||||
|
||||
## 2. 何时补测试
|
||||
|
||||
- 新功能必须新增对应测试(若项目有测试体系)。
|
||||
- 修复 bug 必须先写/补回归用例(若项目有测试体系)。
|
||||
- 仅当改动纯文档/注释/格式时可不加测试。
|
||||
|
||||
## 3. 测试可维护性
|
||||
|
||||
- 一个用例只验证一个行为点。
|
||||
- 测试命名清晰,能从名字看出期望。
|
||||
- 避免依赖外部不稳定资源;必要时 mock/stub。
|
||||
|
||||
## 4. 运行与失败处理
|
||||
|
||||
- 若项目提供构建/冒烟命令(CMake),优先保证最小构建可通过。
|
||||
- 失败时优先定位改动相关原因,不修无关失败。
|
||||
|
|
@ -1,15 +0,0 @@
|
|||
# 安全与鉴权(Auth & Security)
|
||||
|
||||
本文件定义代理在涉及鉴权/密钥/权限时必须遵守的最低要求(Python)。
|
||||
|
||||
## 基本原则
|
||||
|
||||
- 默认最小权限:避免使用全局管理员/Root 权限完成可在用户权限完成的事。
|
||||
- 不要提交任何密钥材料:token、私钥、证书、访问密钥、`.env` 中的真实值等。
|
||||
- 任何涉及加密/鉴权的实现变更必须说明威胁模型与兼容性影响。
|
||||
|
||||
## 常见风险与要求
|
||||
|
||||
- 输入校验:对外部输入(CLI 参数、环境变量、文件、网络数据)要做类型/范围校验,避免命令注入、路径穿越等问题。
|
||||
- 依赖安全:避免新增“来源不明”的依赖;如必须新增,需说明来源与版本锁定策略。
|
||||
- 日志脱敏:日志中不得输出凭据、个人敏感信息(PII)或可重放的签名/URL。
|
||||
|
|
@ -1,27 +0,0 @@
|
|||
# 代码质量(Code Quality)
|
||||
|
||||
本文件定义代理对代码质量的最低要求与审查清单(Python)。
|
||||
|
||||
## 1. 总体要求
|
||||
|
||||
- 改动聚焦目标;避免“顺手重构”。
|
||||
- API/行为变更要显式说明影响与迁移方式(尤其是脚本/CLI 输出与配置项)。
|
||||
- 保持仓库现有约定:优先复用既有结构、命名与工具配置(见 `docs/python/`)。
|
||||
|
||||
## 2. 可读性
|
||||
|
||||
- 复杂逻辑拆分为具名函数/模块;避免超长函数。
|
||||
- 尽量使用显式类型与数据结构表达意图(必要时补类型标注)。
|
||||
- 注释解释“为什么”,避免注释重复代码表述。
|
||||
|
||||
## 3. 错误处理
|
||||
|
||||
- 失败必须可观测:返回码/异常/日志至少一种要明确。
|
||||
- CLI/自动化脚本:遇到不可恢复错误应非零退出码。
|
||||
|
||||
## 4. Review 清单
|
||||
|
||||
- 是否引入了不必要的新依赖?
|
||||
- 是否遵循 `pyproject.toml` 与 lint 配置?
|
||||
- 是否对 I/O(文件/网络/数据库)失败路径做了处理?
|
||||
- 是否需要补测试或示例?
|
||||
|
|
@ -1,42 +1,48 @@
|
|||
# Python 代理规则集(.agents/python)
|
||||
# Python 代理规则集
|
||||
|
||||
本规则集用于存放
|
||||
**AI/自动化代理在仓库内工作时必须遵守的规则**(Python 语言专属)。
|
||||
本规则集定义 AI/自动化代理在处理 Python 代码时必须遵守的核心约束。
|
||||
|
||||
## 范围与优先级
|
||||
|
||||
- 作为仓库级基线规则集使用;更靠近代码目录的规则应更具体并可覆盖基线。
|
||||
- 当代理规则与 `docs` 发生冲突时:
|
||||
1. 安全/合规优先
|
||||
2. 其次保持仓库现有一致性
|
||||
- 作为仓库级基线规则集使用;更靠近代码目录的规则更具体并可覆盖基线。
|
||||
- 当代理规则与 docs 冲突:安全/合规优先,其次保持仓库一致性。
|
||||
|
||||
## 代理工作原则
|
||||
## 代理工作原则(铁律)
|
||||
|
||||
- 先理解目标与上下文,再动手改代码。
|
||||
- 修改要小而清晰;避免无关重构。
|
||||
- 不要引入新依赖或工具,除非明确要求。
|
||||
1. 先理解目标与上下文,再动手改代码
|
||||
2. 修改要小而清晰;避免无关重构
|
||||
3. 发现安全问题(明文密钥/鉴权漏洞)立即标注或修复
|
||||
4. 不引入新依赖或工具,除非明确要求
|
||||
|
||||
## 子文档
|
||||
## Python 核心约定(不可违反)
|
||||
|
||||
- 安全与鉴权:`auth.md`
|
||||
- 性能:`performance.md`
|
||||
- 代码质量:`code_quality.md`
|
||||
- 测试:`testing.md`
|
||||
- 代码风格:Google Python Style Guide;优先使用仓库既有配置(`pyproject.toml`, `.flake8`, `.pylintrc`)
|
||||
- 工具链:未经沟通不切换 formatter/linter
|
||||
- Import:标准库 → 第三方 → 本地模块;分组间空行;避免 `import *`
|
||||
- 命名:模块/包 `lower_with_under.py`;类 `CapWords`;函数/变量 `lower_with_under`;常量 `UPPER_WITH_UNDER`;私有 `_private`
|
||||
- Docstring:Google 风格;公共模块/类/函数/方法必须写
|
||||
|
||||
## Python 必要约定(必须遵守)
|
||||
## 安全红线(不可触碰)
|
||||
|
||||
- 代码风格基线:Google Python Style Guide。
|
||||
- 格式化与静态检查:优先使用仓库既有配置(`pyproject.toml`、`.flake8`、`.pylintrc`、`.pre-commit-config.yaml`);不要在未沟通前切换到另一套工具链。
|
||||
- import 顺序:遵守 `isort profile = google`(若启用)。
|
||||
- 文档字符串:Google 风格(与 `.flake8`/团队约定对齐)。
|
||||
- 命名:遵循 `docs/python/style_guide.md`
|
||||
中的约定;如与既有代码冲突,以局部一致性优先。
|
||||
- 不得在代码/日志/注释中写入明文密钥、密码、Token、API Key
|
||||
- 不得使用 `eval()` / `exec()` 处理不可信输入
|
||||
- 修改鉴权/权限逻辑必须说明动机与风险
|
||||
- 不确定是否敏感时按敏感信息处理
|
||||
|
||||
## 权威来源
|
||||
|
||||
- 代码风格:`docs/python/style_guide.md`
|
||||
- 工具链:`docs/python/tooling.md`
|
||||
- 配置清单:`docs/python/configuration.md`
|
||||
|
||||
## Skills(按需加载)
|
||||
|
||||
- `$performance-optimization`
|
||||
- `$testing-workflow`
|
||||
- `$code-review-workflow`
|
||||
- `$commit-message`
|
||||
|
||||
## 与开发规范的关系
|
||||
|
||||
- 在本仓库内:`docs/python/` 与 `docs/common/`。
|
||||
- 在目标项目内(若按 README 推荐的 subtree prefix `docs/standards/playbook`):
|
||||
- 代码风格:`docs/standards/playbook/docs/python/style_guide.md`
|
||||
- 工具链:`docs/standards/playbook/docs/python/tooling.md`
|
||||
- 配置说明:`docs/standards/playbook/docs/python/configuration.md`
|
||||
- 提交信息:`docs/standards/playbook/docs/common/commit_message.md`
|
||||
- 本仓库内:`docs/python/` 与 `docs/common/`
|
||||
- 目标项目 subtree:`docs/standards/playbook/docs/python/` 与 `docs/standards/playbook/docs/common/`
|
||||
|
|
|
|||
|
|
@ -1,15 +0,0 @@
|
|||
# 性能(Performance)
|
||||
|
||||
本文件定义代理在性能相关改动时的最低要求(Python)。
|
||||
|
||||
## 基本原则
|
||||
|
||||
- 先保证正确性与可读性,再做优化。
|
||||
- 优化前先定位瓶颈:避免盲目微优化。
|
||||
- 对可能影响性能的改动,说明复杂度变化与典型数据规模假设。
|
||||
|
||||
## 常见注意点
|
||||
|
||||
- 避免在热路径重复 I/O(文件读写、网络请求、重复解析)。
|
||||
- 对大列表/大文件处理优先采用流式处理与生成器。
|
||||
- 警惕 `O(n^2)` 循环、重复正则编译、重复 JSON/YAML 解析等。
|
||||
|
|
@ -1,13 +0,0 @@
|
|||
# 测试(Testing)
|
||||
|
||||
本文件定义代理在测试相关工作的最低要求(Python)。
|
||||
|
||||
## 原则
|
||||
|
||||
- 优先增加与变更直接相关的测试(回归测试优先)。
|
||||
- 测试应可重复运行、无顺序依赖、尽量避免真实网络/真实环境依赖。
|
||||
|
||||
## 约定(模板)
|
||||
|
||||
- 若项目使用 `pytest`:遵循 `pyproject.toml` 中的 `pytest.ini_options` 配置。
|
||||
- I/O 相关代码建议使用临时目录与 mock,避免污染工作区。
|
||||
|
|
@ -1,33 +0,0 @@
|
|||
# 安全与鉴权(Auth)
|
||||
|
||||
本文件定义代理在处理鉴权、安全、敏感数据相关任务时的边界与要求。
|
||||
|
||||
## 1. 基本原则
|
||||
|
||||
- **最小权限**:只使用完成任务所需的最低权限与最少数据。
|
||||
- **默认保守**:不确定是否敏感时按敏感处理。
|
||||
- **不扩散秘密**:任何 secret 只在必要范围内出现。
|
||||
|
||||
## 2. 凭证与敏感信息
|
||||
|
||||
- 不要在代码、日志、注释或文档中写入明文密钥、Token、密码。
|
||||
- 如需示例,使用占位符:`<TOKEN>`、`<PASSWORD>`。
|
||||
- 避免把敏感信息打印到标准输出或错误日志。
|
||||
|
||||
## 3. 鉴权逻辑修改
|
||||
|
||||
- 修改鉴权/权限控制时必须说明:
|
||||
- 变更动机
|
||||
- 风险评估
|
||||
- 兼容性/回滚方案
|
||||
- 默认保持旧行为兼容,除非明确要求破坏性变更。
|
||||
|
||||
## 4. 依赖与第三方
|
||||
|
||||
- 禁止无理由新增依赖,尤其是网络、加密、认证相关依赖。
|
||||
- 若必须新增,需在 PR 说明理由、替代方案与安全影响。
|
||||
|
||||
## 5. 审计与合规
|
||||
|
||||
- 任何涉及用户数据/权限边界的改动需可审计:代码清晰、注释说明“为什么”。
|
||||
- 发现潜在安全漏洞时,优先修复或明确标注 `FIXME(name): security risk ...`。
|
||||
|
|
@ -1,35 +0,0 @@
|
|||
# 代码质量(Code Quality)
|
||||
|
||||
本文件定义代理对代码质量的最低要求与审查清单(TSL)。
|
||||
|
||||
## 1. 总体要求
|
||||
|
||||
- 对 `.tsl`/`.tsf` 文件一律按 TSL 规范处理(`.tsf`
|
||||
也是 TSL 源文件):遵守标准快照中的 `docs/tsl/code_style.md` 与
|
||||
`docs/tsl/naming.md`(在目标项目中通常 vendoring 到
|
||||
`docs/standards/playbook/docs/tsl/`)。
|
||||
- 改动聚焦目标;避免“顺手重构”。
|
||||
- API 变更要显式说明影响与迁移方式。
|
||||
|
||||
## 2. 可读性
|
||||
|
||||
- 复杂逻辑拆分为具名函数/变量。
|
||||
- 避免深层嵌套与重复代码。
|
||||
- 必要注释解释“为什么”而不是“做什么”。
|
||||
|
||||
## 3. 错误处理
|
||||
|
||||
- 错误必须显式处理;禁止静默吞错。
|
||||
- 失败路径要可观测(返回/抛出/日志)。
|
||||
|
||||
## 4. 复杂度与规模
|
||||
|
||||
- 单函数尽量 ≤ 60 行;超过应说明原因或拆分。
|
||||
- 单次 PR 尽量小步提交,便于 review。
|
||||
|
||||
## 5. Review 清单
|
||||
|
||||
- 是否有无关改动?
|
||||
- 是否有清晰的动机与行为说明?
|
||||
- 是否保持模块内风格一致?
|
||||
- 是否需要补测试/示例?
|
||||
|
|
@ -1,48 +1,47 @@
|
|||
# TSL 代理规则集(.agents/tsl)
|
||||
# TSL 代理规则集
|
||||
|
||||
本规则集用于存放 **AI/自动化代理在仓库内工作时必须遵守的规则**(TSL 语言专属)。
|
||||
本规则集定义 AI/自动化代理在处理 TSL 代码时必须遵守的核心约束。
|
||||
|
||||
## 范围与优先级
|
||||
|
||||
- 作为仓库级基线规则集使用;更靠近代码目录的规则应更具体并可覆盖基线。
|
||||
- 当代理规则与 `docs` 发生冲突时:
|
||||
1. 安全/合规优先
|
||||
2. 其次保持仓库现有一致性
|
||||
- 作为仓库级基线规则集使用;更靠近代码目录的规则更具体并可覆盖基线。
|
||||
- 当代理规则与 docs 冲突:安全/合规优先,其次保持仓库一致性。
|
||||
|
||||
## 代理工作原则
|
||||
## 代理工作原则(铁律)
|
||||
|
||||
- 先理解目标与上下文,再动手改代码。
|
||||
- 修改要小而清晰;避免无关重构。
|
||||
- 任何可能影响行为的改动都要补充或更新测试/示例(若项目有测试体系)。
|
||||
- 不要引入新依赖或工具,除非明确要求。
|
||||
1. 先理解目标与上下文,再动手改代码
|
||||
2. 修改要小而清晰;避免无关重构
|
||||
3. 发现安全问题(明文密钥/鉴权漏洞)立即标注或修复
|
||||
4. 不引入新依赖或工具,除非明确要求
|
||||
|
||||
## 子文档
|
||||
## TSL 核心约定(不可违反)
|
||||
|
||||
- 安全与鉴权:`auth.md`
|
||||
- 性能:`performance.md`
|
||||
- 代码质量:`code_quality.md`
|
||||
- 测试:`testing.md`
|
||||
- 文件结构:一文件一顶层声明;文件名 = 声明名;`.tsl` 仅 `function`,`.tsf` 可 `function/class/unit`
|
||||
- 格式:4 空格缩进;关键字小写;多语句用 `begin/end`
|
||||
- 命名:类型/函数/property `PascalCase`;变量/参数 `snake_case`;私有 `snake_case_`;常量 `kPascalCase`
|
||||
|
||||
## TSL/TSF 必要约定(必须遵守)
|
||||
## 安全红线(不可触碰)
|
||||
|
||||
- `.tsl` 与 `.tsf` 都是 Tinysoft
|
||||
Language 源文件;修改它们时统一按 TSL 规范处理(不要把 `.tsf`
|
||||
当成“另一种语言/无风格约束的脚本”)。
|
||||
- 语法权威来源:以 `docs/tsl/syntax_book/index.md`
|
||||
为准;如与其他说明冲突,以语法手册为准。
|
||||
- 为避免上下文膨胀:不要整份加载
|
||||
`docs/tsl/syntax_book/function.md`,只按需检索与引用相关片段。
|
||||
- 文件级约束:一个文件只能有一个顶层声明,且文件基名必须与该顶层声明同名(推荐
|
||||
`PascalCase`);`.tsl` 顶层声明只能是 `function`。
|
||||
- 格式:空格缩进(默认 4 空格),关键字用小写,复杂分支/多语句分支用 `begin/end`
|
||||
块表达结构。
|
||||
- 命名:类型/顶层函数/property 用 `PascalCase`;局部变量/参数用
|
||||
`snake_case`;私有成员变量用 `snake_case_`。
|
||||
- 不得在代码/日志/注释中写入明文密钥、密码、Token、API Key
|
||||
- 修改鉴权/权限逻辑必须说明动机与风险
|
||||
- 不确定是否敏感时按敏感信息处理
|
||||
|
||||
## 权威来源
|
||||
|
||||
- 语法手册:`docs/tsl/syntax_book/index.md`
|
||||
- 函数库:`docs/tsl/syntax_book/function/`(按需检索,禁止整份加载)
|
||||
- 代码风格:`docs/tsl/code_style.md`
|
||||
- 命名规范:`docs/tsl/naming.md`
|
||||
|
||||
## Skills(按需加载)
|
||||
|
||||
- `$tsl-guide`
|
||||
- `$performance-optimization`
|
||||
- `$testing-workflow`
|
||||
- `$code-review-workflow`
|
||||
- `$commit-message`
|
||||
|
||||
## 与开发规范的关系
|
||||
|
||||
- 在本仓库内:`docs/tsl/` 与 `docs/common/`。
|
||||
- 在目标项目内(若按 README 推荐的 subtree prefix `docs/standards/playbook`):
|
||||
- 代码风格:`docs/standards/playbook/docs/tsl/code_style.md`
|
||||
- 命名规范:`docs/standards/playbook/docs/tsl/naming.md`
|
||||
- 提交信息:`docs/standards/playbook/docs/common/commit_message.md`
|
||||
- 本仓库内:`docs/tsl/` 与 `docs/common/`
|
||||
- 目标项目 subtree:`docs/standards/playbook/docs/tsl/` 与 `docs/standards/playbook/docs/common/`
|
||||
|
|
|
|||
|
|
@ -1,31 +0,0 @@
|
|||
# 性能(Performance)
|
||||
|
||||
本文件定义代理在做性能相关改动时的准则与检查项。
|
||||
|
||||
## 1. 目标与度量
|
||||
|
||||
- 明确性能目标:延迟、吞吐、内存、CPU、I/O 等。
|
||||
- 没有指标时不要盲目优化;先补充测量或基准。
|
||||
|
||||
## 2. 处理流程
|
||||
|
||||
1. 先定位瓶颈(profile/trace/log)。
|
||||
2. 再提出最小化改动方案。
|
||||
3. 最后用数据验证收益与副作用。
|
||||
|
||||
## 3. 优化准则
|
||||
|
||||
- 优先消除算法/结构性问题,再考虑微优化。
|
||||
- 避免引入复杂度换取小收益。
|
||||
- 性能优化不应牺牲可读性;必要时加注释说明权衡。
|
||||
|
||||
## 4. 常见风险
|
||||
|
||||
- 避免重复计算、无界缓存、隐式复制。
|
||||
- 注意热路径中的分配与 I/O。
|
||||
- 并发优化要考虑正确性与可测试性。
|
||||
|
||||
## 5. 验证
|
||||
|
||||
- 提供优化前后可复现的对比数据(基准、采样结果或压测报告)。
|
||||
- 若无测试体系,至少提供最小可运行的复现脚本/步骤。
|
||||
|
|
@ -1,26 +0,0 @@
|
|||
# 测试(Testing)
|
||||
|
||||
本文件定义代理在改动代码时的测试策略与要求。
|
||||
|
||||
## 1. 测试层级
|
||||
|
||||
- **单元测试**:验证函数/模块的独立行为。
|
||||
- **集成测试**:验证模块间交互与关键流程。
|
||||
- **回归测试**:防止已修复问题复发。
|
||||
|
||||
## 2. 何时补测试
|
||||
|
||||
- 新功能必须新增对应测试。
|
||||
- 修复 bug 必须先写/补回归用例。
|
||||
- 仅当改动纯文档/注释/格式时可不加测试。
|
||||
|
||||
## 3. 测试可维护性
|
||||
|
||||
- 一个用例只验证一个行为点。
|
||||
- 测试命名清晰,能从名字看出期望。
|
||||
- 避免依赖外部不稳定资源;必要时 mock/stub。
|
||||
|
||||
## 4. 运行与失败处理
|
||||
|
||||
- 本仓库未来若引入测试命令,需在此补充统一的运行方式。
|
||||
- 测试失败时优先定位改动相关原因,不修无关失败。
|
||||
|
|
@ -321,39 +321,137 @@ jobs:
|
|||
fi
|
||||
|
||||
echo "========================================"
|
||||
echo "🔍 检查代理规则一致性"
|
||||
echo "🔍 检查代理规则一致性(三层架构)"
|
||||
echo "========================================"
|
||||
|
||||
cd "$REPO_DIR"
|
||||
|
||||
# 检查 .agents/ 和 docs/ 中的规则是否一致
|
||||
# 检查 .agents/ 三层架构完整性
|
||||
python3 << 'EOF'
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
errors = []
|
||||
warnings = []
|
||||
|
||||
# 检查各语言的 .agents/ 目录
|
||||
print("检查 Layer 1: .agents/ (极简铁律)")
|
||||
print("────────────────────────────────────────")
|
||||
|
||||
# 检查各语言的 .agents/ 目录(只需 index.md)
|
||||
agents_base = Path(".agents")
|
||||
|
||||
# 检查 .agents/index.md
|
||||
agents_index = agents_base / "index.md"
|
||||
if not agents_index.exists():
|
||||
errors.append(f"❌ 缺少文件: {agents_index}")
|
||||
elif agents_index.stat().st_size == 0:
|
||||
errors.append(f"❌ 文件为空: {agents_index}")
|
||||
else:
|
||||
print(f"✅ {agents_index}")
|
||||
|
||||
for lang_dir in ["tsl", "cpp", "python"]:
|
||||
agents_lang = agents_base / lang_dir
|
||||
if not agents_lang.exists():
|
||||
errors.append(f"❌ 缺少目录: {agents_lang}")
|
||||
continue
|
||||
|
||||
# 只检查 index.md(≤50 行)
|
||||
index_file = agents_lang / "index.md"
|
||||
if not index_file.exists():
|
||||
errors.append(f"❌ 缺少文件: {index_file}")
|
||||
elif index_file.stat().st_size == 0:
|
||||
errors.append(f"❌ 文件为空: {index_file}")
|
||||
else:
|
||||
# 检查规模(≤50 行)
|
||||
line_count = len(index_file.read_text(encoding='utf-8').splitlines())
|
||||
if line_count > 50:
|
||||
warnings.append(f"⚠️ {index_file}: {line_count} 行 (目标: ≤50)")
|
||||
else:
|
||||
print(f"✅ {index_file} ({line_count} 行)")
|
||||
|
||||
# 检查是否有残留的旧文件
|
||||
old_files = ["auth.md", "code_quality.md", "performance.md", "testing.md"]
|
||||
for old_file in old_files:
|
||||
old_path = agents_lang / old_file
|
||||
if old_path.exists():
|
||||
warnings.append(f"⚠️ 残留旧文件: {old_path} (应删除)")
|
||||
|
||||
print("")
|
||||
print("检查 Layer 2: codex/skills/ (按需加载)")
|
||||
print("────────────────────────────────────────")
|
||||
|
||||
# 检查关键 skills
|
||||
skills_base = Path("codex/skills")
|
||||
required_skills = [
|
||||
("tsl-guide", ["SKILL.md", "references/primer.md", "references/advanced.md"]),
|
||||
("performance-optimization", ["SKILL.md"]),
|
||||
("testing-workflow", ["SKILL.md"]),
|
||||
]
|
||||
|
||||
for skill_name, required_files in required_skills:
|
||||
skill_dir = skills_base / skill_name
|
||||
if not skill_dir.exists():
|
||||
errors.append(f"❌ 缺少 skill: {skill_dir}")
|
||||
continue
|
||||
|
||||
# 检查必须存在的文件
|
||||
required_files = ["index.md", "auth.md", "code_quality.md"]
|
||||
for req_file in required_files:
|
||||
file_path = agents_lang / req_file
|
||||
file_path = skill_dir / req_file
|
||||
if not file_path.exists():
|
||||
errors.append(f"❌ 缺少文件: {file_path}")
|
||||
elif file_path.stat().st_size == 0:
|
||||
errors.append(f"❌ 文件为空: {file_path}")
|
||||
else:
|
||||
print(f"✅ {file_path}")
|
||||
|
||||
print("")
|
||||
print("检查 Layer 3: docs/ (权威文档)")
|
||||
print("────────────────────────────────────────")
|
||||
|
||||
# 检查关键文档路径
|
||||
docs_paths = [
|
||||
"docs/tsl/syntax_book/index.md",
|
||||
"docs/tsl/code_style.md",
|
||||
"docs/tsl/naming.md",
|
||||
"docs/cpp/code_style.md",
|
||||
"docs/python/style_guide.md",
|
||||
]
|
||||
|
||||
for doc_path in docs_paths:
|
||||
path = Path(doc_path)
|
||||
if not path.exists():
|
||||
errors.append(f"❌ 缺少文档: {doc_path}")
|
||||
else:
|
||||
print(f"✅ {doc_path}")
|
||||
|
||||
print("")
|
||||
print("检查架构文档")
|
||||
print("────────────────────────────────────────")
|
||||
|
||||
# 检查新增的架构文档
|
||||
arch_docs = ["AGENTS.md", "SKILLS.md", "README.md"]
|
||||
for doc in arch_docs:
|
||||
path = Path(doc)
|
||||
if not path.exists():
|
||||
errors.append(f"❌ 缺少文档: {doc}")
|
||||
else:
|
||||
print(f"✅ {doc}")
|
||||
|
||||
print("")
|
||||
print("────────────────────────────────────────")
|
||||
|
||||
if warnings:
|
||||
print("\n⚠️ 警告:")
|
||||
for warning in warnings:
|
||||
print(f" {warning}")
|
||||
print("")
|
||||
|
||||
if errors:
|
||||
print("\n".join(errors))
|
||||
print("\n❌ 发现错误:")
|
||||
for error in errors:
|
||||
print(f" {error}")
|
||||
sys.exit(1)
|
||||
else:
|
||||
print("✅ 代理规则一致性检查通过")
|
||||
print("✅ 三层架构完整性检查通过")
|
||||
EOF
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
|
|
|
|||
|
|
@ -19,3 +19,5 @@ tags
|
|||
# Persistent undo
|
||||
[._]*.un~
|
||||
|
||||
reports/
|
||||
|
||||
|
|
|
|||
124
AGENTS.md
124
AGENTS.md
|
|
@ -4,3 +4,127 @@
|
|||
|
||||
- 入口:`.agents/index.md`
|
||||
- 语言规则:`.agents/tsl/index.md`、`.agents/cpp/index.md`、`.agents/python/index.md`
|
||||
|
||||
---
|
||||
|
||||
## 三层架构(分层知识库)
|
||||
|
||||
本仓库将代理规则与知识分为三层:
|
||||
|
||||
### Layer 1: `.agents/`(极简铁律,≤50 行/语言)
|
||||
|
||||
- **加载方式**:自动,持续在上下文
|
||||
- **内容**:硬性约束与安全红线
|
||||
- **职责**:快速判断"能做什么/不能做什么"
|
||||
- **规模控制**:TSL 47 行 | Python 48 行 | C++ 50 行
|
||||
|
||||
### Layer 2: `codex/skills/`(按需加载,100-1000 行/skill)
|
||||
|
||||
- **加载方式**:通过 `$<skill-name>` 触发或 Agent 推断
|
||||
- **内容**:语法教学/最佳实践/工作流程
|
||||
- **职责**:提供"怎么做"的详细知识
|
||||
|
||||
**关键 Skills**:
|
||||
- `$tsl-guide` - TSL 渐进式语法教学(基础/高级/函数库/最佳实践)
|
||||
- `$performance-optimization` - 跨语言性能优化工作流
|
||||
- `$testing-workflow` - 跨语言测试策略
|
||||
- `$code-review-workflow` - 代码审查流程
|
||||
- `$commit-message` - 提交信息规范
|
||||
|
||||
### Layer 3: `docs/`(权威静态文档)
|
||||
|
||||
- **加载方式**:按需检索特定章节
|
||||
- **内容**:完整语法手册/代码风格/工具链配置
|
||||
- **职责**:最终权威来源
|
||||
- **冲突处理**:当规则冲突时,以 `docs/` 为准
|
||||
|
||||
> **注意**:函数库已拆分在 `docs/tsl/syntax_book/function/`,**禁止整目录加载**,请按需检索片段。
|
||||
|
||||
---
|
||||
|
||||
## 使用场景示例
|
||||
|
||||
### 场景 1:编写简单 TSL 函数
|
||||
|
||||
```
|
||||
1. 自动读取 .agents/tsl/index.md (47 行)
|
||||
2. 触发 $tsl-guide,加载 SKILL.md (192 行)
|
||||
3. 生成代码
|
||||
|
||||
Token 消耗:~6,000 tokens
|
||||
```
|
||||
|
||||
### 场景 2:编写 TSL Class
|
||||
|
||||
```
|
||||
1. 自动读取 .agents/tsl/index.md (47 行)
|
||||
2. 触发 $tsl-guide,加载 SKILL.md + references/advanced.md
|
||||
3. 生成代码
|
||||
|
||||
Token 消耗:~10,000 tokens
|
||||
```
|
||||
|
||||
### 场景 3:查找 TSL 函数库
|
||||
|
||||
```
|
||||
1. 自动读取 .agents/tsl/index.md (47 行)
|
||||
2. 触发 $tsl-guide,加载 references/functions_index.md
|
||||
3. 使用 rg 定位具体函数片段
|
||||
4. 返回答案
|
||||
|
||||
Token 消耗:~8,000 tokens
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 性能指标
|
||||
|
||||
| 指标 | 之前 | 当前 | 改善 |
|
||||
|------|--------|--------|------|
|
||||
| .agents/ 规模 | ~500 行 | 145 行 | **↓ 71%** |
|
||||
| 持续占用 tokens | ~12,500 | ~3,625 | **↓ 71%** |
|
||||
| 平均场景 tokens | ~12,500 | ~10,500 | **↓ 16%** |
|
||||
|
||||
---
|
||||
|
||||
## 维护原则
|
||||
|
||||
### .agents/ 修改原则
|
||||
|
||||
**应该修改**:
|
||||
- ✅ 发现新的安全漏洞类型
|
||||
- ✅ 核心约定变化(文件命名/格式规则)
|
||||
- ✅ 新增不可违反的硬性约束
|
||||
|
||||
**不应该修改**:
|
||||
- ❌ 添加"建议性"最佳实践 → 应加到 skill
|
||||
- ❌ 添加详细语法说明 → 应加到 skill 或 docs
|
||||
- ❌ 超过 50 行限制 → 应拆分到 skill
|
||||
|
||||
### Skills 创建原则
|
||||
|
||||
**应该创建**:
|
||||
- ✅ 新增工作流程(如 code-review)
|
||||
- ✅ 新语言需要"从零教学"(如 tsl-guide)
|
||||
- ✅ 跨语言通用知识(如 performance-optimization)
|
||||
|
||||
---
|
||||
|
||||
## FAQ
|
||||
|
||||
**Q: 为什么 .agents/ 这么简洁?**
|
||||
A: 因为会每次对话自动加载,精简到 50 行可节省 71% 持续 token 消耗。
|
||||
|
||||
**Q: 为什么 TSL 需要专门的 tsl-guide skill?**
|
||||
A: TSL 是未被预训练的语言,Agent 零知识,需要"从零教学"。
|
||||
|
||||
**Q: 项目有自定义约定怎么办?**
|
||||
A: Fork playbook 到项目中(git subtree),修改项目根目录的 .agents/。
|
||||
|
||||
---
|
||||
|
||||
## 相关文档
|
||||
|
||||
- Skills 使用指南:`SKILLS.md`
|
||||
- 开发规范:`docs/index.md`
|
||||
- 项目 README:`README.md`
|
||||
|
|
|
|||
199
README.md
199
README.md
|
|
@ -1,25 +1,25 @@
|
|||
# playbook
|
||||
# 📚 playbook
|
||||
|
||||
Playbook:TSL(`.tsl`/`.tsf`)+ C++ + Python 工程规范与代理规则合集。
|
||||
|
||||
## 目标
|
||||
## 🎯 目标
|
||||
|
||||
- 让代码**易读、易维护、易演进**。
|
||||
- 风格保持一致,减少无意义的差异。
|
||||
- 在不影响清晰度的前提下,尽量简洁。
|
||||
- 让代码**易读、易维护、易演进**
|
||||
- 风格保持一致,减少无意义的差异
|
||||
- 在不影响清晰度的前提下,尽量简洁
|
||||
|
||||
## 原则
|
||||
## 📏 原则
|
||||
|
||||
1. **可读性优先**:读代码的时间远大于写代码。
|
||||
2. **一致性优先**:同一仓库内保持一致比追求“最优风格”更重要。
|
||||
3. **遵从既有代码**:修改/扩展现有代码时优先沿用其局部风格。
|
||||
1. **可读性优先**:读代码的时间远大于写代码
|
||||
2. **一致性优先**:同一仓库内保持一致比追求"最优风格"更重要
|
||||
3. **遵从既有代码**:修改/扩展现有代码时优先沿用其局部风格
|
||||
|
||||
## 适用范围
|
||||
## 🌐 适用范围
|
||||
|
||||
- 本指南适用于所有 TSL/C++/Python 相关仓库与脚本。
|
||||
- 当现有代码与本指南冲突时,**以保持局部一致性为优先**,逐步迁移。
|
||||
- 本指南适用于所有 TSL/C++/Python 相关仓库与脚本
|
||||
- 当现有代码与本指南冲突时,**以保持局部一致性为优先**,逐步迁移
|
||||
|
||||
## docs/(开发规范)
|
||||
## 📖 docs/(开发规范)
|
||||
|
||||
`docs/` 目录是给开发者阅读的工程规范,约束代码写法、命名与提交信息。
|
||||
|
||||
|
|
@ -28,8 +28,8 @@ Playbook:TSL(`.tsl`/`.tsf`)+ C++ + Python 工程规范与代理规则合
|
|||
- `docs/tsl/code_style.md`:TSL 代码结构、格式、`begin/end`
|
||||
代码块、注释与通用最佳实践。
|
||||
- `docs/tsl/naming.md`:TSL 命名规范(顶层声明、文件同名规则、变量/成员/property、常量、集合命名等)。
|
||||
- `docs/tsl/syntax_book/index.md`:TSL 语法手册(整理自原始语法/机制目录册;`function.md`
|
||||
建议按需检索)。
|
||||
- `docs/tsl/syntax_book/index.md`:TSL 语法手册(整理自原始语法/机制目录册;函数库位于
|
||||
`docs/tsl/syntax_book/function/`,按需检索)。
|
||||
- `docs/tsl/toolchain.md`:TSL 工具链与验证命令模板。
|
||||
- `docs/cpp/code_style.md`:C++ 代码风格(C++23/Modules)。
|
||||
- `docs/cpp/naming.md`:C++ 命名规范(Google 基线)。
|
||||
|
|
@ -46,22 +46,57 @@ Playbook:TSL(`.tsl`/`.tsf`)+ C++ + Python 工程规范与代理规则合
|
|||
- `templates/ci/`:目标项目 CI 示例模板(如 Gitea
|
||||
Actions),用于自动化校验部分规范。
|
||||
|
||||
## .agents/(代理规则)
|
||||
## 🤖 .agents/(代理规则 - 三层架构)
|
||||
|
||||
`.agents/` 目录是给自动化/AI 代理在本仓库内工作时遵守的规则快照,与 `docs/`
|
||||
并行。
|
||||
`.agents/` 是 AI 代理的极简铁律(三层架构设计):
|
||||
|
||||
- `.agents/index.md`:规则集索引(多语言)。
|
||||
- `.agents/tsl/`:TSL 规则集(入口:`.agents/tsl/index.md`)。
|
||||
- `.agents/cpp/`:C++ 规则集(入口:`.agents/cpp/index.md`)。
|
||||
- `.agents/python/`:Python 规则集(入口:`.agents/python/index.md`)。
|
||||
### 📦 三层架构设计
|
||||
|
||||
## SKILLS(Codex CLI)
|
||||
```
|
||||
Layer 1: .agents/ (≤50 行/语言,自动加载)
|
||||
├─ 核心约束与安全红线
|
||||
└─ 指向 Skills 和 docs
|
||||
|
||||
本仓库内置一组 Codex CLI skills(见 `codex/skills/`),用于 code review
|
||||
/ 格式化 / 调试等工作流;安装与编写规范见 `SKILLS.md`。
|
||||
Layer 2: codex/skills/ (按需加载,$skill-name 触发)
|
||||
├─ tsl-guide: TSL 渐进式语法教学(962 行)
|
||||
├─ performance-optimization: 跨语言性能优化
|
||||
└─ testing-workflow: 跨语言测试策略
|
||||
|
||||
## 在其他项目中使用本 Playbook
|
||||
Layer 3: docs/ (权威静态文档)
|
||||
└─ 完整语法手册/代码风格/工具链配置
|
||||
```
|
||||
|
||||
**📂 目录结构**:
|
||||
- `.agents/index.md`:规则集索引(跨语言)
|
||||
- `.agents/tsl/index.md`:TSL 核心约定(47 行)
|
||||
- `.agents/cpp/index.md`:C++ 核心约定(50 行)
|
||||
- `.agents/python/index.md`:Python 核心约定(48 行)
|
||||
|
||||
**✨ 设计收益**:
|
||||
- 持续上下文占用从 ~500 行降至 145 行(↓ 71%)
|
||||
- 平均场景 token 消耗降低 16%
|
||||
- TSL 未训练语言获得渐进式教学支持
|
||||
|
||||
📄 详见:`AGENTS.md`
|
||||
|
||||
## ⚡ SKILLS(Codex CLI)
|
||||
|
||||
本仓库内置一组 Codex CLI skills(见 `codex/skills/`),用于按需加载的工作流与知识库。
|
||||
|
||||
**⭐ 核心 Skills**:
|
||||
- **`$tsl-guide`**:TSL/TSF 语法完整指南(基础/高级/函数库/最佳实践)
|
||||
- **`$performance-optimization`**:跨语言性能优化工作流
|
||||
- **`$testing-workflow`**:跨语言测试策略
|
||||
|
||||
**🔨 通用 Skills**:
|
||||
- `$code-review-workflow`:代码审查流程
|
||||
- `$commit-message`:提交信息规范
|
||||
- `$systematic-debugging`:系统化调试
|
||||
- 更多见 `SKILLS.md`
|
||||
|
||||
**📥 安装与使用**:详见 `SKILLS.md`
|
||||
|
||||
## 🔧 在其他项目中使用本 Playbook
|
||||
|
||||
由于本仓库需要内部权限访问,其他项目**不能仅用外链引用**;推荐把 Playbook 规范 vendoring 到项目内。
|
||||
|
||||
|
|
@ -101,7 +136,7 @@ git commit -m ":package: deps(playbook): add tsl standards"
|
|||
|
||||
---
|
||||
|
||||
### 方式一:git subtree 同步(推荐)
|
||||
### 🌲 方式一:git subtree 同步(推荐)
|
||||
|
||||
1. 在目标项目中首次引入:
|
||||
|
||||
|
|
@ -121,13 +156,13 @@ git commit -m ":package: deps(playbook): add tsl standards"
|
|||
main --squash
|
||||
```
|
||||
|
||||
#### 快速落地(最小 4 步)
|
||||
#### ⚙️ 快速落地(最小 4 步)
|
||||
|
||||
在目标项目中按以下顺序执行即可完成落地(推荐固定使用
|
||||
`--prefix docs/standards/playbook`):
|
||||
|
||||
1. 引入标准快照(见上文 `git subtree add`)
|
||||
2. 同步到项目根目录(生成/更新 `.agents/<lang>/`、更新 `.gitattributes`):
|
||||
1. **📥 引入标准快照**(见上文 `git subtree add`)
|
||||
2. **🔄 同步到项目根目录**(生成/更新 `.agents/<lang>/`、更新 `.gitattributes`):
|
||||
|
||||
```bash
|
||||
sh docs/standards/playbook/scripts/sync_standards.sh
|
||||
|
|
@ -145,41 +180,41 @@ git commit -m ":package: deps(playbook): add tsl standards"
|
|||
sh docs/standards/playbook/scripts/sync_standards.sh tsl cpp
|
||||
```
|
||||
|
||||
> 说明:若项目根目录没有 `AGENTS.md`,`sync_standards.*`
|
||||
> 💡 说明:若项目根目录没有 `AGENTS.md`,`sync_standards.*`
|
||||
> 会自动生成最小版;已存在则不会覆盖。
|
||||
|
||||
3. 验收(任意满足其一即可):
|
||||
3. **✅ 验收**(任意满足其一即可):
|
||||
- 目录存在:`.agents/tsl/`
|
||||
- 规则入口可读:`.agents/tsl/index.md`
|
||||
- (可选)C++ 规则入口可读:`.agents/cpp/index.md`
|
||||
- 标准文档可读:`docs/standards/playbook/docs/index.md`
|
||||
- `.gitattributes` 包含追加块头:`# Added from playbook .gitattributes`
|
||||
|
||||
4. 将同步产物纳入版本控制(目标项目建议提交):
|
||||
4. **📝 将同步产物纳入版本控制**(目标项目建议提交):
|
||||
- `docs/standards/playbook/`(标准快照)
|
||||
- `.agents/tsl/`(落地规则集)
|
||||
- `.gitattributes`(追加缺失规则)
|
||||
- `AGENTS.md`(若本次自动生成)
|
||||
|
||||
#### 新项目 / 旧项目(命令示例)
|
||||
#### 💼 新项目 / 旧项目(命令示例)
|
||||
|
||||
新项目(无 `.agents/` 与 `AGENTS.md`):
|
||||
**🆕 新项目**(无 `.agents/` 与 `AGENTS.md`):
|
||||
|
||||
```bash
|
||||
git subtree add --prefix docs/standards/playbook https://git.mytsl.cn/csh/playbook.git main --squash
|
||||
sh docs/standards/playbook/scripts/sync_standards.sh tsl
|
||||
```
|
||||
|
||||
旧项目(已有 `AGENTS.md`):
|
||||
**🔄 旧项目**(已有 `AGENTS.md`):
|
||||
|
||||
```bash
|
||||
git subtree pull --prefix docs/standards/playbook https://git.mytsl.cn/csh/playbook.git main --squash
|
||||
sh docs/standards/playbook/scripts/sync_standards.sh tsl
|
||||
```
|
||||
|
||||
旧项目的 `AGENTS.md` 不会被覆盖;如需指向 `.agents/`,请手动对齐内容。
|
||||
⚠️ 旧项目的 `AGENTS.md` 不会被覆盖;如需指向 `.agents/`,请手动对齐内容。
|
||||
|
||||
#### 可选:项目包装脚本(多 playbook 串联)
|
||||
#### 🔗 可选:项目包装脚本(多 playbook 串联)
|
||||
|
||||
多语言项目建议在目标项目创建一个包装脚本(便于一键同步多个规则集):
|
||||
|
||||
|
|
@ -197,7 +232,7 @@ sh docs/standards/playbook/scripts/sync_standards.sh tsl cpp
|
|||
sh docs/standards/playbook/scripts/sync_standards.sh tsl cpp
|
||||
```
|
||||
|
||||
#### 目录约定(建议)
|
||||
#### 📁 目录约定(建议)
|
||||
|
||||
目标项目推荐采用以下结构(Playbook 快照与项目文档分离):
|
||||
|
||||
|
|
@ -221,23 +256,23 @@ sh docs/standards/playbook/scripts/sync_standards.sh tsl cpp
|
|||
|
||||
根目录的 `.agents/<lang>/` 与 `.gitattributes` 通过同步脚本获得:
|
||||
|
||||
- 说明:在 **本 playbook 仓库** 内脚本位于 `scripts/`;在 **目标项目** 里通过
|
||||
- 💡 **说明**:在 **本 playbook 仓库** 内脚本位于 `scripts/`;在 **目标项目** 里通过
|
||||
`git subtree` 引入到 `docs/standards/playbook/` 后,脚本路径变为
|
||||
`docs/standards/playbook/scripts/`。
|
||||
- 在目标项目里直接运行 Playbook 提供的脚本(子树快照里自带):
|
||||
- `docs/standards/playbook/scripts/sync_standards.sh`(推荐,支持多语言参数)
|
||||
- `docs/standards/playbook/scripts/sync_standards.ps1`(推荐,支持多语言参数)
|
||||
- `docs/standards/playbook/scripts/sync_standards.bat`(推荐,支持多语言参数)
|
||||
- 脚本会从快照目录同步到项目根目录,并先备份旧文件(`.bak.*`)。
|
||||
- 📜 **在目标项目里直接运行 Playbook 提供的脚本**(子树快照里自带):
|
||||
- `docs/standards/playbook/scripts/sync_standards.sh`(推荐,支持多语言参数)
|
||||
- `docs/standards/playbook/scripts/sync_standards.ps1`(推荐,支持多语言参数)
|
||||
- `docs/standards/playbook/scripts/sync_standards.bat`(推荐,支持多语言参数)
|
||||
- 💾 脚本会从快照目录同步到项目根目录,并先备份旧文件(`.bak.*`)
|
||||
|
||||
建议固定使用 `--prefix docs/standards/playbook`,因为同步后的 `.agents/*/`
|
||||
💡 建议固定使用 `--prefix docs/standards/playbook`,因为同步后的 `.agents/*/`
|
||||
会引用该路径下的标准快照文档(`docs/standards/playbook/docs/...`)。无参数时若已存在
|
||||
`.agents/<lang>/`,将按现有语言同步;否则默认 `.agents/tsl/`。如需同步 C++ 规则集,
|
||||
推荐直接运行:`sh docs/standards/playbook/scripts/sync_standards.sh tsl cpp`。
|
||||
|
||||
这样 clone 任意项目时都能直接读取规范文件,不依赖外部访问权限。
|
||||
✅ 这样 clone 任意项目时都能直接读取规范文件,不依赖外部访问权限。
|
||||
|
||||
同步脚本行为(目标项目内的最终落地内容):
|
||||
**🔄 同步脚本行为**(目标项目内的最终落地内容):
|
||||
|
||||
- 覆盖/更新:`.agents/<AGENTS_NS>/`(默认 `.agents/tsl/`)
|
||||
- 自动识别:未传语言参数且已存在 `.agents/<lang>/` 时,按现有语言同步
|
||||
|
|
@ -250,7 +285,7 @@ sh docs/standards/playbook/scripts/sync_standards.sh tsl cpp
|
|||
<details>
|
||||
<summary>🔧 高级选项:环境变量配置(点击展开)</summary>
|
||||
|
||||
#### 环境变量(可选)
|
||||
#### ⚙️ 环境变量(可选)
|
||||
|
||||
同步脚本支持以下可选环境变量(默认值可满足大多数项目):
|
||||
|
||||
|
|
@ -261,12 +296,12 @@ sh docs/standards/playbook/scripts/sync_standards.sh tsl cpp
|
|||
|
||||
</details>
|
||||
|
||||
### 方式二:手动复制快照
|
||||
### 📋 方式二:手动复制快照
|
||||
|
||||
如果不使用
|
||||
`git subtree`,也可以由有权限的人手动复制 Playbook 到目标项目中(适合规范不频繁更新或项目数量较少的情况)。
|
||||
|
||||
步骤:
|
||||
**📝 步骤**:
|
||||
|
||||
1. 在目标项目创建目录:`docs/standards/playbook/`。
|
||||
2. 从本仓库复制以下内容到目标项目:
|
||||
|
|
@ -280,9 +315,9 @@ sh docs/standards/playbook/scripts/sync_standards.sh tsl cpp
|
|||
4. 在 `docs/standards/playbook/SOURCE.md`
|
||||
记录本次复制的来源版本/日期(建议写 Playbook 的 commit hash)。
|
||||
|
||||
该方式没有自动同步能力,后续更新需重复上述复制流程。
|
||||
⚠️ 该方式没有自动同步能力,后续更新需重复上述复制流程。
|
||||
|
||||
### 方式三:脚本裁剪复制(按语言,离线)
|
||||
### ✂️ 方式三:脚本裁剪复制(按语言,离线)
|
||||
|
||||
当你希望“只 vendoring 需要的语言规范”(例如只需要 `tsl` +
|
||||
`cpp`)时,可直接运行本仓库提供的裁剪脚本:
|
||||
|
|
@ -305,16 +340,16 @@ sh docs/standards/playbook/scripts/sync_standards.sh tsl cpp
|
|||
<PLAYBOOK_ROOT>\\scripts\\vendor_playbook.bat <target-project-root> --langs tsl,cpp
|
||||
```
|
||||
|
||||
脚本会:
|
||||
**✨ 脚本会**:
|
||||
|
||||
- 生成裁剪快照到 `docs/standards/playbook/`(包含
|
||||
- ✂️ 生成裁剪快照到 `docs/standards/playbook/`(包含
|
||||
`docs/common/` + 选定语言目录 + 对应 `.agents/<lang>/` + `scripts/` +
|
||||
`.gitattributes` + 通用 `templates/ci/` + 相关 `templates/<lang>/`)
|
||||
- 自动执行 `docs/standards/playbook/scripts/sync_standards.*`,把
|
||||
- 🔄 自动执行 `docs/standards/playbook/scripts/sync_standards.*`,把
|
||||
`.agents/<lang>/` 与 `.gitattributes` 落地到目标项目根目录
|
||||
- 生成 `docs/standards/playbook/SOURCE.md` 记录来源与版本信息
|
||||
- 📝 生成 `docs/standards/playbook/SOURCE.md` 记录来源与版本信息
|
||||
|
||||
### 多语言项目落地(TSL + C++/其他语言)
|
||||
### 🌍 多语言项目落地(TSL + C++/其他语言)
|
||||
|
||||
多语言项目建议把规范拆成两类:
|
||||
|
||||
|
|
@ -326,16 +361,14 @@ sh docs/standards/playbook/scripts/sync_standards.sh tsl cpp
|
|||
- 例如 TSL 的命名/文件顶层声明限制、C++ 的
|
||||
`.clang-format/.clang-tidy`、Python 的 `ruff` 等。
|
||||
|
||||
建议:仓库级规则尽量少且稳定;语言级规则各自独立,避免互相“污染”。
|
||||
💡 **建议**:仓库级规则尽量少且稳定;语言级规则各自独立,避免互相"污染"。
|
||||
|
||||
本仓库提供两套代理规则集(同步后位于目标项目的 `.agents/tsl/` 与
|
||||
`.agents/cpp/`):
|
||||
本仓库提供多套代理规则集(同步后位于目标项目的 `.agents/tsl/` / `.agents/cpp/` / `.agents/python/`):
|
||||
|
||||
- 两者都包含跨语言通用底线:`auth.md`、`code_quality.md`、`performance.md`、`testing.md`
|
||||
- 并在 `index.md`
|
||||
中叠加语言级“硬约束”(TSL/TSF 语法限制、C++23/Modules、Windows 支持等)
|
||||
- ✅ 三者都包含核心约定与安全红线
|
||||
- 📝 并在 `index.md` 中叠加语言级"硬约束"(TSL/TSF 语法限制、C++23/Modules、Python 风格等)
|
||||
|
||||
多语言项目推荐结构(示例:TSL + C++ + Python):
|
||||
**📂 多语言项目推荐结构**(示例:TSL + C++ + Python):
|
||||
|
||||
```txt
|
||||
.
|
||||
|
|
@ -355,11 +388,11 @@ sh docs/standards/playbook/scripts/sync_standards.sh tsl cpp
|
|||
└── src/ # 源码目录(按项目实际情况)
|
||||
```
|
||||
|
||||
规则优先级建议:
|
||||
**⚖️ 规则优先级建议**:
|
||||
|
||||
- 同一项目内多个规则集并行放在 `.agents/<lang>/`,不要互相覆盖。
|
||||
- 若某个子目录需要更具体规则(模块/子系统差异),在更靠近代码的目录放置更具体规则(例如
|
||||
`src/foo/.agents/`),并以"离代码更近者优先"为准。
|
||||
- ✅ 同一项目内多个规则集并行放在 `.agents/<lang>/`,不要互相覆盖
|
||||
- 📍 若某个子目录需要更具体规则(模块/子系统差异),在更靠近代码的目录放置更具体规则(例如
|
||||
`src/foo/.agents/`),并以"离代码更近者优先"为准
|
||||
|
||||
<details>
|
||||
<summary>🔧 高级选项:`.agents` 覆盖/合并策略(点击展开)</summary>
|
||||
|
|
@ -408,29 +441,29 @@ if (Test-Path $overlay) {
|
|||
|
||||
</details>
|
||||
|
||||
#### 扩展新语言(模板)
|
||||
#### 🔌 扩展新语言(模板)
|
||||
|
||||
当目标项目需要新增一门语言(例如 C++),建议按以下模板扩展:
|
||||
|
||||
- 文档:
|
||||
- 📖 **文档**:
|
||||
- 若使用本 Playbook 自带的 C++ 规范:无需额外 subtree,直接使用
|
||||
`docs/standards/playbook/docs/cpp/`,并在项目 `README.md`/`docs/index.md`
|
||||
链接入口。
|
||||
- 若新增“本 Playbook 未覆盖的语言”:再引入对应语言的标准仓库(subtree/vendoring 到
|
||||
`docs/standards/<lang>/`)。
|
||||
- 代理规则:
|
||||
- 若新增"本 Playbook 未覆盖的语言":再引入对应语言的标准仓库(subtree/vendoring 到
|
||||
`docs/standards/<lang>/`)
|
||||
- 🤖 **代理规则**:
|
||||
- C++:运行 `sh docs/standards/playbook/scripts/sync_standards.sh cpp`(或
|
||||
`& "docs/standards/playbook/scripts/sync_standards.ps1" -Langs cpp`),落地到
|
||||
`.agents/cpp/`(与 `.agents/tsl/` 并行)。
|
||||
- 其他语言:在目标项目增加 `.agents/<lang>/`(与 `.agents/tsl/`
|
||||
并行),只写该语言专属要求与工具链约束。
|
||||
- 同步策略:每个规则集只同步到对应子目录(例如 `.agents/cpp/`),避免覆盖整个
|
||||
`.agents/`。
|
||||
- CI/工具:按文件类型分别执行格式化、lint、测试(不要让 TSL 规则去约束 C++ 代码,反之亦然)。
|
||||
- C++ 补全:建议在项目根目录提供 `.clangd` 并指向正确的
|
||||
`CompilationDatabase`(模板见 `templates/cpp/.clangd`)。
|
||||
并行),只写该语言专属要求与工具链约束
|
||||
- 🔄 **同步策略**:每个规则集只同步到对应子目录(例如 `.agents/cpp/`),避免覆盖整个
|
||||
`.agents/`
|
||||
- 🛠️ **CI/工具**:按文件类型分别执行格式化、lint、测试(不要让 TSL 规则去约束 C++ 代码,反之亦然)
|
||||
- 💡 C++ 补全:建议在项目根目录提供 `.clangd` 并指向正确的
|
||||
`CompilationDatabase`(模板见 `templates/cpp/.clangd`)
|
||||
|
||||
## 版本与贡献
|
||||
## 🤝 版本与贡献
|
||||
|
||||
- 本项目会持续迭代;变更以 PR 形式提交。
|
||||
- 新规则需包含动机、示例、迁移建议(如有)。
|
||||
- 🔄 本项目会持续迭代;变更以 PR 形式提交
|
||||
- 📋 新规则需包含动机、示例、迁移建议(如有)
|
||||
|
|
|
|||
48
SKILLS.md
48
SKILLS.md
|
|
@ -63,6 +63,28 @@ sh scripts/install_codex_skills.sh
|
|||
sh scripts/install_codex_skills.sh style-cleanup code-review-workflow
|
||||
```
|
||||
|
||||
如果希望“项目内本地安装”(不污染全局),可用以下方式:
|
||||
|
||||
```bash
|
||||
# 安装到当前目录的 .codex/skills/
|
||||
sh scripts/install_codex_skills.sh --local
|
||||
|
||||
# 或手动指定 CODEX_HOME
|
||||
CODEX_HOME="$(pwd)/.codex" sh scripts/install_codex_skills.sh
|
||||
```
|
||||
|
||||
PowerShell / Windows:
|
||||
|
||||
```powershell
|
||||
powershell -File scripts/install_codex_skills.ps1 -Local
|
||||
```
|
||||
|
||||
```bat
|
||||
scripts\install_codex_skills.bat --local
|
||||
```
|
||||
|
||||
> 注意:Codex 只会从 `CODEX_HOME` 加载 skills;使用本地安装时,启动 Codex 需设置同样的 `CODEX_HOME`。
|
||||
|
||||
如果你的项目通过 `git subtree` vendoring 本 Playbook(推荐前缀
|
||||
`docs/standards/playbook`),则在目标项目里执行:
|
||||
|
||||
|
|
@ -123,8 +145,27 @@ sh docs/standards/playbook/scripts/install_codex_skills.sh
|
|||
|
||||
位于 `codex/skills/`:
|
||||
|
||||
- `commit-message`:基于 staged
|
||||
diff 自动建议提交信息(`:emoji: type(scope): subject`)
|
||||
### 语言特定 Skills
|
||||
|
||||
- **`tsl-guide`**:TSL/TSF 语法与编码完整指南
|
||||
- 渐进式教学体系:基础语法 → 高级特性 → 函数库 → 最佳实践
|
||||
- 包含 4 个子文档:primer.md / advanced.md / functions_index.md / common_patterns.md
|
||||
- 总计 962 行,按需加载
|
||||
- 触发词:TSL 语法, 写 TSL, TSL 函数, TSL class, 矩阵操作, TS-SQL 等
|
||||
|
||||
### 通用工作流 Skills
|
||||
|
||||
- **`performance-optimization`**:跨语言性能优化工作流
|
||||
- 适用:TSL / Python / C++
|
||||
- 流程:度量基线 → 定位瓶颈 → 优化策略 → 验证效果
|
||||
- 109 行
|
||||
|
||||
- **`testing-workflow`**:跨语言测试策略
|
||||
- 适用:TSL / Python / C++
|
||||
- 覆盖:单元测试 / 集成测试 / 回归测试
|
||||
- 108 行
|
||||
|
||||
- `commit-message`:基于 staged diff 自动建议提交信息(`:emoji: type(scope): subject`)
|
||||
- `create-plan`:生成简明计划(适用于用户明确要求规划编码任务)
|
||||
- `code-review-workflow`:结构化代码评审(正确性/安全/性能/测试)
|
||||
- `style-cleanup`:整理代码风格(优先使用仓库既有 formatter/lint 工具链)
|
||||
|
|
@ -133,8 +174,7 @@ sh docs/standards/playbook/scripts/install_codex_skills.sh
|
|||
- `defense-in-depth`:关键路径分层校验/多道防线
|
||||
- `bulk-refactor-workflow`:批量重构(安全做法 + 验证契约)
|
||||
- `document-workflow`:PDF/DOCX/PPTX/XLSX 文档工作流(带开源 fallback)
|
||||
- `pdf-workflow` / `docx-workflow` / `pptx-workflow` /
|
||||
`xlsx-workflow`:按格式拆分的文档子工作流
|
||||
- `pdf-workflow` / `docx-workflow` / `pptx-workflow` / `xlsx-workflow`:按格式拆分的文档子工作流
|
||||
- `verification-before-completion`:先验证再宣称完成(证据链优先)
|
||||
|
||||
---
|
||||
|
|
|
|||
|
|
@ -0,0 +1,109 @@
|
|||
---
|
||||
name: performance-optimization
|
||||
description: "性能优化工作流(TSL/Python/C++):度量→定位→优化→验证。Triggers: 性能优化, 优化性能, 代码慢, 提升速度, performance optimization, slow code, profiling"
|
||||
---
|
||||
|
||||
# 性能优化工作流
|
||||
|
||||
> 适用语言:TSL / Python / C++
|
||||
> 核心原则:没有度量就没有优化。
|
||||
|
||||
## 使用时机
|
||||
|
||||
- 功能正确,但响应慢或资源消耗过高
|
||||
- 热路径明显(循环/批处理/大规模数据)
|
||||
- 需要在不改变行为的前提下提升性能
|
||||
|
||||
## 必备输入
|
||||
|
||||
- 目标场景与数据规模(输入大小、并发量)
|
||||
- 基线指标(耗时、吞吐、内存、CPU)
|
||||
- 约束条件(允许的改动范围、兼容性要求)
|
||||
|
||||
## 工作流程(按顺序)
|
||||
|
||||
### 1. 度量基线(Baseline)
|
||||
|
||||
先拿到“优化前”的数据作为对照。
|
||||
|
||||
- TSL(计时示例,使用 MTIC/MTOC):
|
||||
|
||||
```tsl
|
||||
T1 := MTIC;
|
||||
// ... 逻辑 ...
|
||||
Elapsed := MTOC(T1);
|
||||
Echo "Elapsed:", Elapsed;
|
||||
```
|
||||
|
||||
- Python:
|
||||
|
||||
```python
|
||||
import time
|
||||
start = time.time()
|
||||
# ... code ...
|
||||
print(f"Elapsed: {time.time() - start:.3f}s")
|
||||
```
|
||||
|
||||
- C++:
|
||||
|
||||
```cpp
|
||||
auto start = std::chrono::high_resolution_clock::now();
|
||||
// ... code ...
|
||||
auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(
|
||||
std::chrono::high_resolution_clock::now() - start);
|
||||
std::cout << "Elapsed: " << elapsed.count() << "ms\n";
|
||||
```
|
||||
|
||||
### 2. 定位瓶颈(Profiling)
|
||||
|
||||
只优化热点,不动冷路径。
|
||||
|
||||
- TSL:插入关键路径计时,或使用 `docs/tsl/syntax_book/07_debug_and_profiler.md` 中的工具
|
||||
- Python:`cProfile` / `line_profiler`
|
||||
- C++:`perf` / `gprof` / `valgrind --tool=callgrind`
|
||||
|
||||
### 3. 优化策略(从高收益到低收益)
|
||||
|
||||
**3.1 算法级(优先级最高)**
|
||||
- 降低复杂度:`O(n^2)` → `O(n log n)` → `O(n)`
|
||||
- 避免重复计算:缓存、记忆化
|
||||
|
||||
**3.2 数据结构级**
|
||||
- 选择合适容器:数组 vs 哈希表 vs 树
|
||||
- 预分配容量,减少扩容
|
||||
|
||||
**3.3 循环级**
|
||||
- 循环内不做 I/O
|
||||
- 循环内避免重复解析/格式化
|
||||
- 提前计算循环不变量
|
||||
|
||||
**3.4 I/O 级**
|
||||
- 批量读写(减少系统调用)
|
||||
- 缓存(明确 TTL 与容量上限)
|
||||
|
||||
### 4. 验证效果(Verify)
|
||||
|
||||
- 对比优化前后指标
|
||||
- 运行回归测试,保证行为一致
|
||||
- 在真实数据量下复测
|
||||
|
||||
## 反模式(不要做)
|
||||
|
||||
- 没有度量就“感觉”优化
|
||||
- 牺牲可读性换取微小收益
|
||||
- 为冷路径引入复杂缓存
|
||||
- 未验证就宣称提升
|
||||
|
||||
## 输出清单(交付要求)
|
||||
|
||||
- 基线指标(优化前)
|
||||
- 瓶颈定位结果(热点函数/路径)
|
||||
- 优化方案与改动点
|
||||
- 优化后指标(对比数据)
|
||||
- 风险说明与回滚策略
|
||||
|
||||
## 权威参考
|
||||
|
||||
- TSL:`docs/tsl/syntax_book/07_debug_and_profiler.md`
|
||||
- Python:`docs/python/tooling.md`
|
||||
- C++:`docs/cpp/toolchain.md`
|
||||
|
|
@ -0,0 +1,108 @@
|
|||
---
|
||||
name: testing-workflow
|
||||
description: "测试策略与最佳实践(TSL/Python/C++):单元测试→集成测试→回归测试。Triggers: 写测试, 测试策略, 单元测试, 集成测试, testing, unit test, how to test"
|
||||
---
|
||||
|
||||
# 测试工作流
|
||||
|
||||
> 适用语言:TSL / Python / C++
|
||||
> 核心原则:新功能与 bug 修复必须有可复现的测试。
|
||||
|
||||
## 使用时机
|
||||
|
||||
- 新功能开发
|
||||
- Bug 修复
|
||||
- 重构或行为变更
|
||||
|
||||
## 测试层级
|
||||
|
||||
### 1. 单元测试(Unit Tests)
|
||||
|
||||
**目标**:验证单个函数/类的行为
|
||||
|
||||
- 测试纯函数(无副作用)
|
||||
- Mock 外部依赖(文件/网络/数据库)
|
||||
- 一个测试只验证一个行为点
|
||||
|
||||
**命名示例**:
|
||||
- `test_add_positive_numbers_returns_sum`
|
||||
- `test_add_with_zero_returns_other_number`
|
||||
|
||||
### 2. 集成测试(Integration Tests)
|
||||
|
||||
**目标**:验证模块间交互
|
||||
|
||||
- 关键流程的 end-to-end 测试
|
||||
- 使用真实依赖或测试环境
|
||||
- 验证数据流与状态转换
|
||||
|
||||
### 3. 回归测试(Regression Tests)
|
||||
|
||||
**目标**:防止已修复的 bug 复发
|
||||
|
||||
- 修 bug 先写失败测试
|
||||
- 修复后测试通过
|
||||
|
||||
## 何时补测试
|
||||
|
||||
| 场景 | 是否需要测试 | 测试类型 |
|
||||
|------|-------------|---------|
|
||||
| 新功能 | ✅ 必须 | 单元 + 集成 |
|
||||
| Bug 修复 | ✅ 必须 | 回归 |
|
||||
| 重构 | ✅ 必须 | 运行现有测试 |
|
||||
| 文档/注释 | ❌ 不需要 | - |
|
||||
| 格式调整 | ❌ 不需要 | - |
|
||||
|
||||
## 测试可维护性原则
|
||||
|
||||
1. 一个测试一个断言(或一组相关断言)
|
||||
2. 测试名称自解释
|
||||
3. 避免依赖外部资源(用 Mock/Stub)
|
||||
4. 测试代码也要可读
|
||||
|
||||
## 反模式
|
||||
|
||||
- 依赖执行顺序、随机数、系统时间
|
||||
- 单元测试过慢(>1s)
|
||||
- Magic number 过多
|
||||
- 重复测试相同行为
|
||||
|
||||
## 运行测试
|
||||
|
||||
### TSL
|
||||
|
||||
- 若项目已有测试命令,优先使用项目标准命令
|
||||
- 否则建议添加最小可运行脚本并在 README 说明
|
||||
|
||||
### Python
|
||||
|
||||
```bash
|
||||
pytest tests/
|
||||
pytest tests/test_module.py::test_function
|
||||
```
|
||||
|
||||
### C++
|
||||
|
||||
```bash
|
||||
ctest
|
||||
./build/test_runner --gtest_filter=TestSuite.TestName
|
||||
```
|
||||
|
||||
## 测试失败处理
|
||||
|
||||
1. 定位:哪个测试失败、失败条件是什么
|
||||
2. 复现:单独运行失败用例
|
||||
3. 调试:优先检查本次改动
|
||||
4. 无关失败:记录并告知用户
|
||||
|
||||
## 可选:测试驱动开发(TDD)
|
||||
|
||||
1. Red:先写失败测试
|
||||
2. Green:写最少代码让测试通过
|
||||
3. Refactor:重构保持测试绿色
|
||||
|
||||
## 权威参考
|
||||
|
||||
- TSL:`docs/tsl/` 测试相关文档(如有)
|
||||
- Python:`docs/python/tooling.md`
|
||||
- C++:`docs/cpp/toolchain.md`
|
||||
|
|
@ -0,0 +1,192 @@
|
|||
---
|
||||
name: tsl-guide
|
||||
description: "TSL/TSF 语法与工程实践指南(基础语法/高级特性/函数库/最佳实践)。Triggers: TSL 语法, 写 TSL, 写 TSF, TSL 函数, TSL class, TSL unit, 矩阵操作, TS-SQL, TSL 函数库, tsl basics, tsl advanced, how to write tsl, tsf code, tsl api, 学习 TSL"
|
||||
---
|
||||
|
||||
# TSL 完整指南
|
||||
|
||||
> **定位**:TSL 语言的一站式参考,从入门到进阶。本 skill 以语法为主,风格规范单独引用。
|
||||
|
||||
## 🚀 快速语法速查(仅语法)
|
||||
|
||||
> 代码风格与命名不是语法的一部分,见下方「代码风格与命名」。
|
||||
|
||||
### 变量与常量
|
||||
|
||||
```tsl
|
||||
A := 1;
|
||||
Name := "test";
|
||||
Items := array(1,2,3);
|
||||
Table := array("Code":"0001","Price":12.3);
|
||||
Const MaxRetries = 3;
|
||||
```
|
||||
|
||||
### 函数
|
||||
|
||||
```tsl
|
||||
Function Add(a,b);
|
||||
Begin
|
||||
Return a + b;
|
||||
End;
|
||||
```
|
||||
|
||||
```tsl
|
||||
Function Parse(const s, var out_value);
|
||||
Begin
|
||||
out_value := StrToInt(s);
|
||||
Return out_value;
|
||||
End;
|
||||
```
|
||||
|
||||
### 控制流
|
||||
|
||||
```tsl
|
||||
If x>0 then
|
||||
y := 1
|
||||
else if x=0 then
|
||||
y := 0
|
||||
else
|
||||
y := -1;
|
||||
|
||||
For i := 0 to 9 do
|
||||
sum := sum + i;
|
||||
|
||||
For idx,v in Items do
|
||||
total := total + v;
|
||||
```
|
||||
|
||||
### 异常处理
|
||||
|
||||
```tsl
|
||||
Try
|
||||
v := StrToInt(s);
|
||||
Except
|
||||
v := 0;
|
||||
Writeln(ExceptObject.ErrInfo);
|
||||
End;
|
||||
```
|
||||
|
||||
### 数组与索引
|
||||
|
||||
```tsl
|
||||
arr := array(10,20,30);
|
||||
value := arr[0];
|
||||
|
||||
m := array((1,2),(3,4));
|
||||
col0 := m[:,0];
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📌 代码风格与命名(非语法)
|
||||
|
||||
- 代码风格:`docs/tsl/code_style.md`
|
||||
- 命名规范:`docs/tsl/naming.md`
|
||||
- 本仓库硬约束:`.agents/tsl/index.md`
|
||||
|
||||
---
|
||||
|
||||
## 📚 详细文档索引(按需加载)
|
||||
|
||||
### 📖 基础语法(primer)
|
||||
|
||||
**文件**:`references/primer.md`
|
||||
**内容**:
|
||||
- 变量/常量、类型与字面量
|
||||
- 数组与表数组表达
|
||||
- 运算符与表达式
|
||||
- 函数定义、参数修饰、默认值、命名参数、变参
|
||||
- 控制流(if/case/for/while/repeat)
|
||||
- 异常处理(try/except/finally/raise)
|
||||
- 编译选项(`{$Explicit+}`/`{$VarByRef-}`)
|
||||
|
||||
**适用场景**:第一次写 TSL、查基础语法细节。
|
||||
|
||||
---
|
||||
|
||||
### 🚀 高级特性(advanced)
|
||||
|
||||
**文件**:`references/advanced.md`
|
||||
**内容**:
|
||||
- Unit/Namespace/函数文件与调用优先级
|
||||
- Class/Object 模型(继承/override/Create/Destroy)
|
||||
- 扩展语法:矩阵、集合运算、结果集过滤
|
||||
- TS-SQL:select/insert/update/delete/sselect/vselect/mselect
|
||||
- 运行时与性能语法要点(#网格计算等)
|
||||
- 新一代语法概览(复数/WeakRef/算符重载)
|
||||
|
||||
**适用场景**:面向对象、模块化、矩阵与 TS-SQL、高级特性。
|
||||
|
||||
---
|
||||
|
||||
### 🔍 函数库速查(index)
|
||||
|
||||
**文件**:`references/functions_index.md`
|
||||
**内容**:
|
||||
- 函数库分类索引与检索策略
|
||||
- 对应权威目录:`docs/tsl/syntax_book/function/tsl/index.md`
|
||||
|
||||
**重要说明**:
|
||||
- 函数库已拆分为 `docs/tsl/syntax_book/function/` 多文件,**禁止整目录加载**
|
||||
- 优先在 `docs/tsl/syntax_book/function/tsl/` 下分文件检索
|
||||
|
||||
---
|
||||
|
||||
### 💡 常见模式与最佳实践
|
||||
|
||||
**文件**:`references/common_patterns.md`
|
||||
**内容**:参数校验、错误处理、I/O 分层、性能小贴士。
|
||||
|
||||
---
|
||||
|
||||
## ✅ 语法覆盖清单(对照 `docs/tsl/syntax_book/`)
|
||||
|
||||
- `01_language_basics.md` → `references/primer.md`
|
||||
- `02_control_flow.md` → `references/primer.md`
|
||||
- `03_functions.md` → `references/primer.md`
|
||||
- `04_modules_and_namespace.md` → `references/advanced.md`
|
||||
- `05_object_model.md` → `references/advanced.md`
|
||||
- `06_extended_syntax.md` → `references/advanced.md`
|
||||
- `07_debug_and_profiler.md` → `references/advanced.md`(语法要点)
|
||||
- `08_new_generation.md` → `references/advanced.md`(概览)
|
||||
|
||||
---
|
||||
|
||||
## 🤖 Agent 使用指南
|
||||
|
||||
1. **分析需求**:判断需要基础语法还是高级特性
|
||||
2. **按需加载**:只读取一个子文档(避免贪婪加载)
|
||||
3. **必要时检索函数库**:先索引,再定位片段
|
||||
|
||||
---
|
||||
|
||||
## ⚠️ 函数库使用规则
|
||||
|
||||
- **禁止整目录加载**:`docs/tsl/syntax_book/function/` 体量巨大
|
||||
- **推荐流程**:
|
||||
1. 先看 `docs/tsl/syntax_book/function/tsl/index.md`
|
||||
2. 再在 `docs/tsl/syntax_book/function/tsl/*.md` 中搜索
|
||||
3. 只读取相关函数片段(≤100 行)
|
||||
|
||||
**检索示例**:
|
||||
```bash
|
||||
rg -n "\\bTrim\\b" docs/tsl/syntax_book/function/tsl/base.md
|
||||
rg -n "^######\s+FileExists" docs/tsl/syntax_book/function/tsl/resource.md
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔗 权威文档路径
|
||||
|
||||
- 语法手册总览:`docs/tsl/syntax_book/index.md`
|
||||
- 语言基础:`docs/tsl/syntax_book/01_language_basics.md`
|
||||
- 控制流与异常:`docs/tsl/syntax_book/02_control_flow.md`
|
||||
- 函数:`docs/tsl/syntax_book/03_functions.md`
|
||||
- 模块与命名空间:`docs/tsl/syntax_book/04_modules_and_namespace.md`
|
||||
- 对象模型:`docs/tsl/syntax_book/05_object_model.md`
|
||||
- 扩展语法:`docs/tsl/syntax_book/06_extended_syntax.md`
|
||||
- 运行时与性能工具:`docs/tsl/syntax_book/07_debug_and_profiler.md`
|
||||
- 新一代语法:`docs/tsl/syntax_book/08_new_generation.md`
|
||||
- 函数库:`docs/tsl/syntax_book/function/tsl/index.md`
|
||||
- 代码风格:`docs/tsl/code_style.md`
|
||||
- 命名规范:`docs/tsl/naming.md`
|
||||
|
|
@ -0,0 +1,230 @@
|
|||
# TSL 高级特性
|
||||
|
||||
> 本文档是 `$tsl-guide` 的子文档,覆盖模块/对象/扩展语法与新一代特性。
|
||||
> 详细规则以 `docs/tsl/syntax_book/` 为准。
|
||||
|
||||
## 目录
|
||||
|
||||
- [Unit/命名空间/函数文件](#unit命名空间函数文件)
|
||||
- [Class/Object 模型](#classobject-模型)
|
||||
- [扩展语法:矩阵/集合/过滤](#扩展语法矩阵集合过滤)
|
||||
- [TS-SQL(select/insert/update/delete)](#ts-sqlselectinsertupdatedelete)
|
||||
- [运行时与性能语法要点](#运行时与性能语法要点)
|
||||
- [新一代语法概览](#新一代语法概览)
|
||||
|
||||
---
|
||||
|
||||
## Unit/命名空间/函数文件
|
||||
|
||||
### Unit 基本结构
|
||||
|
||||
```tsl
|
||||
Unit Demo_Unit;
|
||||
|
||||
interface
|
||||
|
||||
var Ua,Ub;
|
||||
const CS = 888;
|
||||
|
||||
function AddV();
|
||||
|
||||
implementation
|
||||
|
||||
var Uc;
|
||||
|
||||
function AddV();
|
||||
begin
|
||||
Ua += 10;
|
||||
Uc += 1;
|
||||
end;
|
||||
|
||||
initialization
|
||||
Ua := 100;
|
||||
Ub := "Tinysoft Unit";
|
||||
Uc := 1;
|
||||
|
||||
finalization
|
||||
echo "Demo_Unit End.";
|
||||
|
||||
end.
|
||||
```
|
||||
|
||||
### uses 与调用优先级
|
||||
|
||||
```tsl
|
||||
uses Demo_Unit;
|
||||
|
||||
// 直接调用(按 uses 优先级解析)
|
||||
AddV();
|
||||
|
||||
// 指定单元调用
|
||||
Unit(Demo_Unit).AddV();
|
||||
CALL("Demo_Unit.AddV");
|
||||
```
|
||||
|
||||
### 函数文件(TSF)与命名空间
|
||||
|
||||
- `.tsf` 文件可存放 function/class/unit(函数库目录 `funcext`)
|
||||
- 命名空间:
|
||||
|
||||
```tsl
|
||||
NameSpace "ProjectA";
|
||||
|
||||
SomeFunction();
|
||||
```
|
||||
|
||||
如需固定命名空间,可在 `tsl.Conf` 配置 `Namespace=...`(详见 `04_modules_and_namespace.md`)。
|
||||
|
||||
---
|
||||
|
||||
## Class/Object 模型
|
||||
|
||||
### 类定义与继承
|
||||
|
||||
```tsl
|
||||
Type Base = Class
|
||||
function Speak(); virtual;
|
||||
end;
|
||||
|
||||
Type Child = Class(Base)
|
||||
function Speak(); override;
|
||||
end;
|
||||
```
|
||||
|
||||
### 构造函数与析构函数
|
||||
|
||||
```tsl
|
||||
Type User = Class
|
||||
user_id;
|
||||
user_name;
|
||||
|
||||
function Create(id,name); overload;
|
||||
Begin
|
||||
user_id := id;
|
||||
user_name := name;
|
||||
End;
|
||||
|
||||
function Destroy();
|
||||
Begin
|
||||
// 清理资源
|
||||
End;
|
||||
end;
|
||||
```
|
||||
|
||||
### 属性(Property)
|
||||
|
||||
```tsl
|
||||
Type Account = Class
|
||||
_id;
|
||||
function getId();
|
||||
function setId(v);
|
||||
property Id read _id write setId;
|
||||
end;
|
||||
```
|
||||
|
||||
### 创建对象
|
||||
|
||||
```tsl
|
||||
Obj := CreateObject("User", 1, "Alice");
|
||||
Obj2 := New User(2, "Bob");
|
||||
```
|
||||
|
||||
更多:`Self`、`FindClass`、`ClassInfo`、`operator` 重载等见 `05_object_model.md`。
|
||||
|
||||
---
|
||||
|
||||
## 扩展语法:矩阵/集合/过滤
|
||||
|
||||
### 矩阵初始化与访问
|
||||
|
||||
```tsl
|
||||
M1 := zeros(10); // 一维数组
|
||||
M2 := zeros(10,10); // 二维矩阵
|
||||
M3 := rand(5,3); // 随机矩阵
|
||||
M4 := eye(3); // 单位矩阵
|
||||
Seq := 1->10; // 数列数组
|
||||
```
|
||||
|
||||
```tsl
|
||||
// 子矩阵与索引
|
||||
Rows := MRows(M2,1);
|
||||
Cols := MCols(M2,1);
|
||||
Sub := M2[array(1,3), array(0,2)];
|
||||
Col0 := M2[:,0];
|
||||
```
|
||||
|
||||
### 矩阵查找
|
||||
|
||||
```tsl
|
||||
A := Rand(10,10);
|
||||
B := MFind(A, MCell>0.9);
|
||||
```
|
||||
|
||||
### 集合运算
|
||||
|
||||
```tsl
|
||||
A := array((1,2),(3,4));
|
||||
B := array((1,2),(5,6));
|
||||
C := A Union2 B;
|
||||
D := A Intersect B;
|
||||
E := A Minus B;
|
||||
```
|
||||
|
||||
### 结果集过滤
|
||||
|
||||
```tsl
|
||||
R1 := FilterIn(R, CodeArr, "Code");
|
||||
Idx := FilterNotIn(R, CodeArr, "Code", false);
|
||||
Sub := R[Idx, array("Code","V1")];
|
||||
```
|
||||
|
||||
更多细节见 `06_extended_syntax.md`。
|
||||
|
||||
---
|
||||
|
||||
## TS-SQL(select/insert/update/delete)
|
||||
|
||||
```tsl
|
||||
T := zeros(10, array("A","B"));
|
||||
T[:,"A"] := 1->10;
|
||||
|
||||
V1 := select ["A"] from T end;
|
||||
V2 := sselect ["A"] from T end;
|
||||
V3 := vselect sumof(["A"]) from T end;
|
||||
V4 := mselect * from T end;
|
||||
|
||||
update T set ["A"] = 100 where ["B"] = 4 end;
|
||||
delete from T where ["A"] = 0 end;
|
||||
insert into T insertfields(["A"],["B"]) values(1,2);
|
||||
```
|
||||
|
||||
TS-SQL 语法细节与高级用法见 `06_extended_syntax.md`。
|
||||
|
||||
---
|
||||
|
||||
## 运行时与性能语法要点
|
||||
|
||||
### 网格计算操作符 `#`
|
||||
|
||||
```tsl
|
||||
R[i] := #CalcStock(B[i]) with array(pn_stock():B[i]) timeout 3000;
|
||||
```
|
||||
|
||||
### 全局缓存
|
||||
|
||||
详见 `07_debug_and_profiler.md` 中的全局缓存管理与相关函数。
|
||||
|
||||
---
|
||||
|
||||
## 新一代语法概览
|
||||
|
||||
### 复数
|
||||
|
||||
```tsl
|
||||
Z := 4+3j;
|
||||
Z2 := complex(4,3);
|
||||
```
|
||||
|
||||
### WeakRef 与算符重载
|
||||
|
||||
新一代语言支持 WeakRef 与对象算符重载,详见 `08_new_generation.md` 与 `05_object_model.md`。
|
||||
|
|
@ -0,0 +1,126 @@
|
|||
# TSL 常见编码模式
|
||||
|
||||
> 本文档是 `$tsl-guide` 的子文档,汇总常见的组织方式与实践范式。
|
||||
> 语法示例以 `docs/tsl/syntax_book/` 为准。
|
||||
|
||||
## 目录
|
||||
|
||||
- [参数校验](#参数校验)
|
||||
- [早返回(减少嵌套)](#早返回减少嵌套)
|
||||
- [错误处理与上下文信息](#错误处理与上下文信息)
|
||||
- [I/O 分层](#io-分层)
|
||||
- [常量与配置管理](#常量与配置管理)
|
||||
- [集合与结果集处理](#集合与结果集处理)
|
||||
- [性能小贴士](#性能小贴士)
|
||||
|
||||
---
|
||||
|
||||
## 参数校验
|
||||
|
||||
尽早验证输入并给出明确错误信息。
|
||||
|
||||
```tsl
|
||||
Function ValidateUserId(UserId);
|
||||
Begin
|
||||
If UserId <= 0 then
|
||||
Raise "invalid user_id: " + IntToStr(UserId);
|
||||
End;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 早返回(减少嵌套)
|
||||
|
||||
```tsl
|
||||
Function NormalizeName(Name);
|
||||
Begin
|
||||
If Trim(Name) = "" then
|
||||
Return "";
|
||||
|
||||
Return UpperCase(Trim(Name));
|
||||
End;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 错误处理与上下文信息
|
||||
|
||||
```tsl
|
||||
Function LoadConfig(Path);
|
||||
Begin
|
||||
Try
|
||||
Return ReadFile(Path);
|
||||
Except
|
||||
Raise "load config failed: " + Path + ", " + ExceptObject.ErrInfo;
|
||||
End;
|
||||
End;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## I/O 分层
|
||||
|
||||
```tsl
|
||||
Function ReadUserIds(Path);
|
||||
Begin
|
||||
Content := ReadFile(Path);
|
||||
Return ParseUserIds(Content);
|
||||
End;
|
||||
|
||||
Function ParseUserIds(Content);
|
||||
Begin
|
||||
// 纯函数:只负责解析
|
||||
Return array();
|
||||
End;
|
||||
|
||||
Function WriteReport(Path, Report);
|
||||
Begin
|
||||
WriteFile(Path, Report);
|
||||
End;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 常量与配置管理
|
||||
|
||||
```tsl
|
||||
Const MaxRetries = 3;
|
||||
Const TimeoutMs = 5000;
|
||||
|
||||
Function RetryFetch(Url);
|
||||
Begin
|
||||
For i := 1 to MaxRetries do
|
||||
Begin
|
||||
// ...
|
||||
End;
|
||||
End;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 集合与结果集处理
|
||||
|
||||
```tsl
|
||||
Function SumPositive(Values);
|
||||
Begin
|
||||
Total := 0;
|
||||
For i := 0 to Length(Values) - 1 do
|
||||
Begin
|
||||
If Values[i] > 0 then
|
||||
Total := Total + Values[i];
|
||||
End;
|
||||
Return Total;
|
||||
End;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 性能小贴士
|
||||
|
||||
仅当明确存在性能瓶颈时采用:
|
||||
|
||||
- 把循环内的常量/表达式提到循环外
|
||||
- 避免在循环内执行 I/O 或 SQL
|
||||
- 对结果集访问做局部缓存(如字段名映射)
|
||||
|
||||
详细流程见:`$performance-optimization`。
|
||||
|
|
@ -0,0 +1,67 @@
|
|||
# TSL 函数库分类索引
|
||||
|
||||
> **说明**:本文档是 `$tsl-guide` 的子文档,仅提供分类索引与检索策略。
|
||||
> **权威入口**:`docs/tsl/syntax_book/function/tsl/index.md`
|
||||
> **注意**:函数库已拆分为 `docs/tsl/syntax_book/function/` 多文件,禁止整目录加载。
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 先在 `function/tsl/index.md` 找到所属类别
|
||||
2. 进入对应子文件(如 `base.md` / `math.md` / `resource.md`)
|
||||
3. 用 `rg` 精确定位函数定义片段(≤100 行)
|
||||
|
||||
### 推荐搜索方式
|
||||
|
||||
```bash
|
||||
# 先读索引
|
||||
sed -n '1,120p' docs/tsl/syntax_book/function/tsl/index.md
|
||||
|
||||
# 精确定位某个函数
|
||||
rg -n "^#######\s+Trim" docs/tsl/syntax_book/function/tsl/base.md
|
||||
|
||||
# 模糊搜索关键词
|
||||
rg -n "date|time" docs/tsl/syntax_book/function/tsl/base.md
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 常用分类(来自 `function/tsl/index.md`)
|
||||
|
||||
### 数学与计算(math.md)
|
||||
|
||||
- 常见函数示例:Abs, Sqrt, Sin, Cos, Log, Exp, Round...
|
||||
|
||||
### 字符串处理(base.md)
|
||||
|
||||
- 常见函数示例:Len, Mid, Left, Right, Trim, Replace...
|
||||
|
||||
### 日期时间(base.md)
|
||||
|
||||
- 常见函数示例:Now, Date, Time, DateAdd, DateDiff...
|
||||
|
||||
### 文件操作(resource.md)
|
||||
|
||||
- 常见函数示例:FileExists, ReadFile, WriteFile...
|
||||
|
||||
### 数组操作(base.md)
|
||||
|
||||
- 常见函数示例:Array, UBound, LBound, Sort...
|
||||
|
||||
### 类型转换(base.md)
|
||||
|
||||
- 常见函数示例:CStr, CInt, CFloat, CBool...
|
||||
|
||||
---
|
||||
|
||||
## 进一步建议
|
||||
|
||||
- 优先用索引确定范围,再定位到具体函数定义
|
||||
- 只读取相关片段,避免加载大段内容
|
||||
- 若函数名不确定,用关键词在对应分类文件中搜索
|
||||
|
||||
---
|
||||
|
||||
## 金融函数(独立分类)
|
||||
|
||||
- 权威入口:`docs/tsl/syntax_book/function/financial/index.md`
|
||||
- 适用范围:行情、财务、技术分析等金融领域函数(与通用字符串/数学函数分开检索)
|
||||
|
|
@ -0,0 +1,354 @@
|
|||
# TSL 基础语法完整版
|
||||
|
||||
> 本文档是 `$tsl-guide` 的子文档,聚焦基础语法。代码风格与命名规范请见 `docs/tsl/code_style.md` 与 `docs/tsl/naming.md`。
|
||||
|
||||
## 目录
|
||||
|
||||
- [语言元素与注释](#语言元素与注释)
|
||||
- [变量与常量](#变量与常量)
|
||||
- [数据类型与字面量](#数据类型与字面量)
|
||||
- [数组与表数组](#数组与表数组)
|
||||
- [运算符与表达式](#运算符与表达式)
|
||||
- [函数](#函数)
|
||||
- [控制流](#控制流)
|
||||
- [异常处理](#异常处理)
|
||||
- [调试与性能相关语句](#调试与性能相关语句)
|
||||
|
||||
---
|
||||
|
||||
## 语言元素与注释
|
||||
|
||||
### 标识符与关键字
|
||||
|
||||
- 关键字为保留字(完整列表见 `docs/tsl/syntax_book/01_language_basics.md`)
|
||||
- 标识符用于变量、函数、类、unit 等命名
|
||||
|
||||
### 注释
|
||||
|
||||
```tsl
|
||||
// 行注释
|
||||
{ 块注释 }
|
||||
/* 另一种块注释 */
|
||||
```
|
||||
|
||||
### 编译选项(语法级)
|
||||
|
||||
```tsl
|
||||
{$Explicit+} // 要求变量先声明再使用
|
||||
{$Explicit-} // 关闭显式声明
|
||||
{$VarByRef-} // 默认参数按值传递(可用 in/var/out 覆盖)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 变量与常量
|
||||
|
||||
### 赋值
|
||||
|
||||
```tsl
|
||||
A := 1;
|
||||
B := 2.5;
|
||||
S := "hello";
|
||||
```
|
||||
|
||||
### 常量
|
||||
|
||||
```tsl
|
||||
Const PI = 3.14159;
|
||||
Const MaxRetry = 3;
|
||||
```
|
||||
|
||||
### 显式变量声明(配合 `{$Explicit+}`)
|
||||
|
||||
```tsl
|
||||
{$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 | 空值 |
|
||||
|
||||
示例:
|
||||
|
||||
```tsl
|
||||
I := 42;
|
||||
R := 3.14;
|
||||
B := true;
|
||||
T := Date();
|
||||
S := 'hello';
|
||||
N := nil;
|
||||
```
|
||||
|
||||
字符串支持单引号或双引号,索引访问从 0 开始:
|
||||
|
||||
```tsl
|
||||
S := "ABC";
|
||||
Ch := S[0];
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 数组与表数组
|
||||
|
||||
### 一维数组(0-based)
|
||||
|
||||
```tsl
|
||||
Arr := array(2,3,5,7,11);
|
||||
First := Arr[0];
|
||||
```
|
||||
|
||||
### 字符串下标(表数组)
|
||||
|
||||
```tsl
|
||||
Row := array("Code":"0001","Price":12.3);
|
||||
Code := Row["Code"];
|
||||
```
|
||||
|
||||
### 多维数组
|
||||
|
||||
```tsl
|
||||
Mat := array((1,2,3),(4,5,6));
|
||||
Value := Mat[0][1];
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 运算符与表达式
|
||||
|
||||
### 常用运算符
|
||||
|
||||
- 赋值:`:=`, `+=`, `-=`, `*=`, `/=`
|
||||
- 算术:`+ - * / div mod ^`
|
||||
- 关系:`= <> < > <= >= like in`
|
||||
- 逻辑:`and or not`
|
||||
- 三目:`cond ? a : b`
|
||||
|
||||
示例:
|
||||
|
||||
```tsl
|
||||
C := A + B;
|
||||
Ok := (A = B) or (A > 0);
|
||||
X := (A > B) ? A : B;
|
||||
```
|
||||
|
||||
矩阵/数组相关的 `.=`、`.<` 等算符在扩展语法中说明(见 `06_extended_syntax.md`)。
|
||||
完整运算符清单见 `01_language_basics.md`。
|
||||
|
||||
---
|
||||
|
||||
## 函数
|
||||
|
||||
### 基本结构
|
||||
|
||||
```tsl
|
||||
Function HelloTSL();
|
||||
Begin
|
||||
D := Date();
|
||||
Return DateToStr(D);
|
||||
End;
|
||||
```
|
||||
|
||||
### 形参与实参(in/const/var/out)
|
||||
|
||||
```tsl
|
||||
Function Calc(in a, var b, out c);
|
||||
Begin
|
||||
b := b + a;
|
||||
c := b * 2;
|
||||
Return c;
|
||||
End;
|
||||
```
|
||||
|
||||
### 缺省参数(新一代语法)
|
||||
|
||||
```tsl
|
||||
Function Foo(a,b=a+1);
|
||||
Begin
|
||||
Return b;
|
||||
End;
|
||||
```
|
||||
|
||||
### 命名参数(新一代语法)
|
||||
|
||||
```tsl
|
||||
Function FuncA(a,b,c);
|
||||
Begin
|
||||
Return array(a,b,c);
|
||||
End;
|
||||
|
||||
Result := FuncA(1, c:3); // b 默认为 nil
|
||||
```
|
||||
|
||||
### 变参(`...`)与 Params
|
||||
|
||||
```tsl
|
||||
Function SumAll(...);
|
||||
Begin
|
||||
Total := 0;
|
||||
For i,v in Params do
|
||||
Total := Total + v;
|
||||
Return Total;
|
||||
End;
|
||||
```
|
||||
|
||||
相关内置:`Params`, `ParamCount`, `RealParamCount`。
|
||||
|
||||
### 返回与退出
|
||||
|
||||
```tsl
|
||||
Return X; // 返回
|
||||
Exit; // 退出函数
|
||||
```
|
||||
|
||||
### 外部函数声明(external)
|
||||
|
||||
```tsl
|
||||
Function GetTickCount():Integer; stdcall; external "kernel32.dll" name "GetTickCount" KeepResident;
|
||||
```
|
||||
|
||||
更多外部接口与调用方式见 `03_functions.md`。
|
||||
|
||||
---
|
||||
|
||||
## 控制流
|
||||
|
||||
### if / else if
|
||||
|
||||
```tsl
|
||||
If x>0 then
|
||||
y := 1
|
||||
else if x=0 then
|
||||
y := 0
|
||||
else
|
||||
y := -1;
|
||||
```
|
||||
|
||||
### if 表达式(新一代语法)
|
||||
|
||||
```tsl
|
||||
Ret := if x>0 then x*x else 0;
|
||||
```
|
||||
|
||||
### case
|
||||
|
||||
```tsl
|
||||
Case Age Of
|
||||
0: Writeln("Baby");
|
||||
1: Writeln("Toddler");
|
||||
else
|
||||
Writeln("Other");
|
||||
End;
|
||||
```
|
||||
|
||||
### while / repeat
|
||||
|
||||
```tsl
|
||||
While cond do
|
||||
DoSomething();
|
||||
|
||||
Repeat
|
||||
DoSomething();
|
||||
Until cond;
|
||||
```
|
||||
|
||||
### for(to / downto / step)
|
||||
|
||||
```tsl
|
||||
For i := 1 to 10 do
|
||||
Sum := Sum + i;
|
||||
|
||||
For i := 10 downto 1 step 2 do
|
||||
Sum := Sum + i;
|
||||
```
|
||||
|
||||
### for ... in(数组遍历)
|
||||
|
||||
```tsl
|
||||
Data := array('a':1,'b':5,'c':3);
|
||||
Sum := 0;
|
||||
|
||||
For k,v in Data do
|
||||
Sum := Sum + v;
|
||||
```
|
||||
|
||||
### break / continue / goto
|
||||
|
||||
```tsl
|
||||
While cond do
|
||||
Begin
|
||||
If stop then Break;
|
||||
If skip then Continue;
|
||||
// ...
|
||||
End;
|
||||
|
||||
Goto Finded;
|
||||
label Finded;
|
||||
Writeln("jumped");
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 异常处理
|
||||
|
||||
### Try / Except
|
||||
|
||||
```tsl
|
||||
Try
|
||||
V := StrToInt(S);
|
||||
Except
|
||||
V := 0;
|
||||
Writeln(ExceptObject.ErrInfo);
|
||||
End;
|
||||
```
|
||||
|
||||
### Try / Finally
|
||||
|
||||
```tsl
|
||||
Try
|
||||
DoWork();
|
||||
Finally
|
||||
Cleanup();
|
||||
End;
|
||||
```
|
||||
|
||||
### Raise
|
||||
|
||||
```tsl
|
||||
If A < 0 then Raise "A 不能小于 0";
|
||||
```
|
||||
|
||||
异常信息可通过 `ExceptObject.ErrInfo/ErrLine/ErrNo` 获取。
|
||||
|
||||
---
|
||||
|
||||
## 调试与性能相关语句
|
||||
|
||||
```tsl
|
||||
DebugReturn 1;
|
||||
```
|
||||
|
||||
```tsl
|
||||
T1 := MTIC;
|
||||
// ...
|
||||
Elapsed := MTOC(T1);
|
||||
```
|
||||
|
||||
更多调试/性能语法见 `02_control_flow.md` 与 `07_debug_and_profiler.md`。
|
||||
|
|
@ -11,8 +11,13 @@
|
|||
- TSL 源文件后缀同时包含:`.tsl`(脚本)与 `.tsf`(模块/库代码)。
|
||||
- 代码风格:`tsl/code_style.md`
|
||||
- 命名规范:`tsl/naming.md`
|
||||
- 语法手册(TSL 语法;`function.md` 建议按需检索):`tsl/syntax_book/index.md`
|
||||
- 语法手册(TSL 语法;函数库按需检索 `tsl/syntax_book/function/`):`tsl/syntax_book/index.md`
|
||||
- 工具链与验证命令(模板):`tsl/toolchain.md`
|
||||
- TSL 模块化文档:
|
||||
- 微信消息接口说明:`tsl/modules/wechat_message.md`
|
||||
- 回测框架 TSBackTesting:`tsl/modules/tsbacktesting.md`
|
||||
- 天软与 Python 交互:`tsl/modules/tsl_python_interop.md`
|
||||
- pyTSL 接口说明:`tsl/modules/pytsl_api.md`
|
||||
|
||||
## C++(cpp)
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,50 @@
|
|||
# 天软 pyTSL 接口使用说明
|
||||
|
||||
## 定位
|
||||
|
||||
- 官方 Python SDK,面向取数/执行/批量/异步与数据转换。
|
||||
|
||||
## 结构索引
|
||||
|
||||
- 安装与配置
|
||||
- pyTSL 接口说明(Client / AsyncClient / async_util / Batch / Task / Const / TSResultValue)
|
||||
- pyTSLPy 兼容说明
|
||||
- 示例与数据类型转换
|
||||
- 附录与常见问题
|
||||
|
||||
## 安装方式(摘要)
|
||||
|
||||
- `pip install tspytsl`(在线安装)
|
||||
- 离线安装与手动部署
|
||||
|
||||
## 核心类与模块
|
||||
|
||||
- `pyTSL.Client`:同步客户端
|
||||
- `pyTSL.AsyncClient`:异步客户端
|
||||
- `pyTSL.async_util`:异步工具函数
|
||||
- `TSBatch` / `Task`:批量与任务
|
||||
- `TSResultValue`:统一返回结果封装
|
||||
- `pyTSL.Const`:常量与字段
|
||||
|
||||
## 关键方法(常用)
|
||||
|
||||
- `login` / `logout`
|
||||
- `exec` / `call` / `query`
|
||||
- `download_list` / `download` / `upload` / `remove`
|
||||
- `DatetimeToDouble` / `DoubleToDatetime`
|
||||
- `EncodeStream` / `DecodeStream`
|
||||
- `DataFrameToTSArray`
|
||||
|
||||
## 示例(Python)
|
||||
|
||||
```python
|
||||
import pyTSL
|
||||
|
||||
c = pyTSL.Client("user", "password")
|
||||
c.login()
|
||||
|
||||
result = c.query("select close from market where stock = 'SZ000001' end")
|
||||
print(result.dataframe())
|
||||
|
||||
c.logout()
|
||||
```
|
||||
|
|
@ -0,0 +1,66 @@
|
|||
# 策略回测框架 TSBackTesting
|
||||
|
||||
## 定位
|
||||
|
||||
- 提供统一的策略回测框架(股票/期货/期权/组合等),覆盖资金、交易约束、清算与绩效输出。
|
||||
|
||||
## 结构索引
|
||||
|
||||
- 策略回测流程
|
||||
- 成员变量
|
||||
- 成员方法
|
||||
- 查询用接口
|
||||
- 回测范例
|
||||
- 债券品种回测说明
|
||||
- 期权组合策略回测说明
|
||||
- 常见问题
|
||||
|
||||
## 回测流程概览
|
||||
|
||||
- 组合类型选择 → 交易数据准备 → 回测执行 → 结果查询与分析。
|
||||
|
||||
## 组合类型
|
||||
|
||||
- 比例类组合:提供目标权重。
|
||||
- 数量类组合:提供成交量/成交价等交易明细。
|
||||
|
||||
## 关键成员变量(分组摘要)
|
||||
|
||||
- **时间与周期**:`FBegT`、`FEndT`、`FCycle`
|
||||
- **组合类型**:`FGroupType`(比例类/数量类)
|
||||
- **资金与价格**:`FIniCash`、`FPriceType`、`FPriceType1..4`
|
||||
- **交易约束**:`FNoZT`、`FNoDT`、`FMinVol`、`FMinAmount`、`FMaxVolPercent`、`FMaxAmountPercent`
|
||||
- **费用与分红**:`FFeeType`、`FlowestFeeType`、`FDividendType`
|
||||
- **期权与期货特性**:`FOptionRs`、`FMainFutureMap`
|
||||
- **基准与输出**:`FBMType`、`FBMDetail`、`FBMOption`、`FHFDataOutPut`
|
||||
|
||||
> 详细取值及说明以实际接口定义为准。
|
||||
|
||||
## 关键成员方法(常用)
|
||||
|
||||
- `BackTest`:执行回测
|
||||
- `GetTimeSeries`:返回净值/收益率时间序列
|
||||
- `GetTradeOrder`:返回调仓/成交数据
|
||||
- `GetNetAssetValue` / `GetAssetData` / `GetHoldData`:资产与持仓
|
||||
- `GetPercent`、`GetIRRReturn`、`ReturnBenchmark`:绩效指标
|
||||
- `GetClearancePrice` / `GetIntVol` / `GetOtherData`:扩展查询
|
||||
|
||||
## 最小流程示例(概念化)
|
||||
|
||||
```tsl
|
||||
// 1) 初始化参数
|
||||
backtest := new TSBackTesting();
|
||||
backtest.FBegT := 20240101T;
|
||||
backtest.FEndT := 20241231T;
|
||||
backtest.FGroupType := 1; // 比例类
|
||||
backtest.FIniCash := 1000000;
|
||||
|
||||
// 2) 设置交易数据(比例类:目标持仓)
|
||||
// backtest.SetTradeData(trade_data);
|
||||
|
||||
// 3) 执行回测
|
||||
backtest.BackTest();
|
||||
|
||||
// 4) 获取结果
|
||||
return backtest.GetTimeSeries();
|
||||
```
|
||||
|
|
@ -0,0 +1,46 @@
|
|||
# 天软平台和 Python 的交互
|
||||
|
||||
## 摘要
|
||||
|
||||
- 覆盖三类交互:Python 调用 TSL、TSL 调用 Python、落地服务器开启 Python 服务。
|
||||
- 提供 COM/远程登录两种路径,以及 `PyRun`/`PyCall` 体系。
|
||||
|
||||
## 结构索引
|
||||
|
||||
- 支持版本
|
||||
- Python 调用 TSL:配置步骤 / 接口说明 / 范例
|
||||
- TSL 调用 Python:配置步骤 / 接口说明 / 范例
|
||||
- do Python 方式
|
||||
- 落地服务器开启 Python 服务
|
||||
- sklearn 机器学习接口
|
||||
- 附录与 FAQ
|
||||
|
||||
## Python 调用 TSL(核心步骤)
|
||||
|
||||
1. 配置环境变量(天软目录、Python 目录)。
|
||||
2. 加载 TSLPy 模块(直接加载或修改包名)。
|
||||
3. 选择连接方式(COM / 远程登录)。
|
||||
|
||||
## 主要接口(Python 侧)
|
||||
|
||||
- 服务器:`ConnectServer` / `LoginServer` / `Disconnect`
|
||||
- 执行:`RemoteExecute` / `RemoteCallFunc`
|
||||
- 系统参数:`SetSysParam` / `GetSysParam`
|
||||
- 日期转换:`EncodeDate` / `DecodeDate` / `EncodeDateTime` / `DecodeDateTime`
|
||||
|
||||
## TSL 调用 Python(核心接口)
|
||||
|
||||
- `PyPutVar` / `PyGetVar`
|
||||
- `PyRun`(执行脚本)
|
||||
- `PyCall`(调用 Python 函数,支持命名参数)
|
||||
- `PyError` / `PyRelease` / `PyEnsure`
|
||||
|
||||
## do Python 方式
|
||||
|
||||
- 适合快速执行 Python 脚本,省去显式接口调用。
|
||||
|
||||
## 注意事项(精简)
|
||||
|
||||
- Python 与 TSL 位数必须一致。
|
||||
- 多版本 Python 需同步设置 `PYTHONHOME`。
|
||||
- TSL 调 Python 不支持网格调用。
|
||||
|
|
@ -0,0 +1,60 @@
|
|||
# 发送微信消息使用说明
|
||||
|
||||
## 摘要
|
||||
|
||||
- 通过“天软科技服务号”向微信客户端发送模板消息。
|
||||
- 支持同步/异步发送,异步可用消息 ID 查询状态。
|
||||
|
||||
## 前置条件
|
||||
|
||||
- 用户关注并绑定天软科技服务号,获得 `userid`。
|
||||
- 给他人发送消息需对方授权其 `userid`。
|
||||
|
||||
## 核心接口
|
||||
|
||||
- `send_wechat_message(userid, url, title, first, remark[, k1..k6])`
|
||||
- 同步发送;成功返回 `success`,否则返回错误信息。
|
||||
- `send_wechat_message_async(userid, url, title, first, remark[, k1..k6])`
|
||||
- 异步发送;返回 16 位消息 ID(时间戳 + 随机数)。
|
||||
- `get_wechat_message_status(userid, username, wechat_message_id)`
|
||||
- 查询异步发送结果;返回 “成功” 或错误信息。
|
||||
|
||||
## 参数说明(模板消息)
|
||||
|
||||
- `userid`:绑定账户后获取的用户标识(必需)。
|
||||
- `url`:详情地址(必需,可为空字符串)。
|
||||
- `title`:模板消息标题(必需)。
|
||||
- `first`:副标题(一般需要)。
|
||||
- `remark`:备注(一般需要)。
|
||||
- `k1..k6`:模板关键字参数(根据模板类型变化)。常见模板示例:
|
||||
- 监控报告通知:运行状态/时间
|
||||
- 系统运行简报:系统名称/简报内容/发布时间
|
||||
- 告警通知:告警内容/发生时间
|
||||
|
||||
## 同步 vs 异步
|
||||
|
||||
- 同步:阻塞等待结果,适合紧急通知。
|
||||
- 异步:立即返回,适合非紧急通知;用 `get_wechat_message_status` 查询。
|
||||
|
||||
## 示例(TSL)
|
||||
|
||||
```tsl
|
||||
// 定义参数
|
||||
url := "http://tinysoft.com.cn";
|
||||
user_id := "190F1826267E0EB45658FB81836636A7";
|
||||
|
||||
title := "监控报告通知";
|
||||
first := "运行状态";
|
||||
keyword_1 := "运行正常";
|
||||
keyword_2 := "";
|
||||
DateTimeToString(keyword_2, "YYYY-MM-DD HH:NN:SS", Now());
|
||||
remark := "如有疑问请与技术人员联系!";
|
||||
|
||||
// 同步发送
|
||||
echo send_wechat_message(user_id, url, title, first, remark, keyword_1, keyword_2);
|
||||
|
||||
// 异步发送
|
||||
wechat_message_id := send_wechat_message_async(user_id, url, title, first, remark, keyword_1, keyword_2);
|
||||
// 获取结果
|
||||
echo get_wechat_message_status(user_id, "username", wechat_message_id);
|
||||
```
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -7,14 +7,11 @@
|
|||
- [02 控制流与异常](#02-控制流与异常)
|
||||
- [目录](#目录)
|
||||
- [流程控制语句](#流程控制语句)
|
||||
- [内容](#内容)
|
||||
- [条件语句](#条件语句)
|
||||
- [内容](#内容-1)
|
||||
- [IF](#if)
|
||||
- [IF 表达式](#if-表达式)
|
||||
- [CASE](#case)
|
||||
- [循环语句](#循环语句)
|
||||
- [内容](#内容-2)
|
||||
- [WHILE](#while)
|
||||
- [REPEAT](#repeat)
|
||||
- [FOR](#for)
|
||||
|
|
@ -22,7 +19,6 @@
|
|||
- [CONTINUE](#continue)
|
||||
- [GOTO](#goto)
|
||||
- [错误控制,以及调试语句](#错误控制以及调试语句)
|
||||
- [内容](#内容-3)
|
||||
- [异常处理 Try Except/Finally](#异常处理-try-exceptfinally)
|
||||
- [ExceptObject 异常对象](#exceptobject-异常对象)
|
||||
- [RAISE](#raise)
|
||||
|
|
@ -35,34 +31,17 @@
|
|||
|
||||
## 流程控制语句
|
||||
|
||||
### 内容
|
||||
|
||||
- 条件语句
|
||||
- 循环语句
|
||||
- GOTO
|
||||
- 错误控制,以及调试语句
|
||||
- 函数的返回和退出
|
||||
|
||||
### 条件语句
|
||||
|
||||
#### 内容
|
||||
|
||||
- IF
|
||||
- IF 表达式
|
||||
- CASE
|
||||
|
||||
#### IF
|
||||
|
||||
IF 语句是由一个布尔表达式和两个供选择的操作序列组成。运行时根据布尔表达式求值结果,选取其中之一的操作序列执行。有两种形式的 IF 语句:
|
||||
if 语句是由一个布尔表达式和两个供选择的操作序列组成。运行时根据布尔表达式求值结果,选取其中之一的操作序列执行。有两种形式的 if 语句:
|
||||
|
||||
```text
|
||||
If <布尔表达式> then <语句>;
|
||||
```
|
||||
```tsl
|
||||
if <布尔表达式> then <语句> ;
|
||||
|
||||
```text
|
||||
If <布尔表达式> then <语句1>
|
||||
|
||||
else <语句2>;
|
||||
if <布尔表达式> then <语句1>
|
||||
else <语句2> ;
|
||||
```
|
||||
|
||||
当布尔表达式的值为真,执行 then 后面的语句;当值为假时则有两种情况:要么什么也不做,要么执行 else 后面的语句。
|
||||
|
|
@ -72,47 +51,34 @@ else <语句2>;
|
|||
else 前面没有分号,因为分号是两个语句之间的分隔符,而 else 并非语句。如果在该处添了分号,则远程服务器在编译的时候就会认为 if 语句到此结束,而把 else 当作另一句的开头,这样就会输出出错信息。
|
||||
|
||||
语句可以是一条语句或是一组语句,如果是一组语句时,这组语句必须使用 Begin …
|
||||
End 标识符来限定,写成复合语句。在用 if 语句连续嵌套时,如果你插入适量的复合语句,有利于程序的阅读和理解。
|
||||
end 标识符来限定,写成复合语句。在用 if 语句连续嵌套时,如果你插入适量的复合语句,有利于程序的阅读和理解。
|
||||
|
||||
例 2:求 y=f(x),当 x>0 时,y=1,当 x=0 时,y=0,当 x<0 时,y=-1。
|
||||
|
||||
```text
|
||||
Function IfExample();
|
||||
|
||||
Begin
|
||||
|
||||
if x>0 then y:=1
|
||||
|
||||
else if x=0 then y:=0
|
||||
|
||||
else y:=-1;
|
||||
|
||||
return y;
|
||||
|
||||
End;
|
||||
```tsl
|
||||
function IfExample(x);
|
||||
begin
|
||||
if x > 0 then
|
||||
y := 1;
|
||||
else if x = 0 then
|
||||
y := 0;
|
||||
else
|
||||
y := -1;
|
||||
return y;
|
||||
end;
|
||||
```
|
||||
|
||||
例 3:当 x>0 时候,计算 x*x,并且输出 x*x,否则输出 0。
|
||||
|
||||
```text
|
||||
FunctionIfExample2(x);
|
||||
|
||||
begin
|
||||
|
||||
if x>=0 then
|
||||
|
||||
begin
|
||||
|
||||
x1:=x*x;
|
||||
|
||||
return x1;
|
||||
|
||||
end
|
||||
|
||||
else
|
||||
|
||||
return 0;
|
||||
|
||||
```tsl
|
||||
function IfExample2(x);
|
||||
begin
|
||||
if x >= 0 then
|
||||
begin
|
||||
x1 := x * x;
|
||||
return x1;
|
||||
end
|
||||
else return 0;
|
||||
end;
|
||||
```
|
||||
|
||||
|
|
@ -128,9 +94,7 @@ if 表达式:会计算一个结果,这个结果可以赋值给变量、作
|
|||
|
||||
其基本形式通常如下:
|
||||
|
||||
```text
|
||||
if 条件 then 值1 else 值2
|
||||
```
|
||||
|
||||
例如 if a>1 then 2 else 1,如果 a 大于 1,整个表达式的结果就是 2,否则是 1。
|
||||
|
||||
|
|
@ -140,19 +104,17 @@ if 表达式必须存在 else 部分,主要是为了确保表达式始终有
|
|||
|
||||
示例:
|
||||
|
||||
```text
|
||||
ret:=if x>0 then x*x else 0;
|
||||
|
||||
```tsl
|
||||
ret := if x > 0 then x * x else 0;
|
||||
return ret;
|
||||
```
|
||||
|
||||
当 x>0,返回 x\*x;x<=0 时,返回 0。
|
||||
|
||||
//多个分支
|
||||
|
||||
```text
|
||||
ret:=if x>0 then x*x else if x<0 then -(x*x) else 0;
|
||||
多个分支:
|
||||
|
||||
```tsl
|
||||
ret := if x > 0 then x * x else if x < 0 then - (x * x) else 0;
|
||||
return ret;
|
||||
```
|
||||
|
||||
|
|
@ -164,148 +126,99 @@ return ret;
|
|||
|
||||
语法一:普通语法。
|
||||
|
||||
CASE <Expression> OF
|
||||
|
||||
<情况标号表 1>: 语句 1;
|
||||
|
||||
<情况标号表 2>: 语句 2;
|
||||
|
||||
...
|
||||
|
||||
<情况标号表 N>: 语句 N;
|
||||
|
||||
[Else 例外语句;]
|
||||
|
||||
End;
|
||||
```tsl
|
||||
case <Expression> of
|
||||
<情况标号表 1>: 语句 1;
|
||||
<情况标号表 2>: 语句 2;
|
||||
...
|
||||
<情况标号表 N>: 语句 N;
|
||||
[else 例外语句;]
|
||||
end;
|
||||
```
|
||||
|
||||
情况标号表的语法为:
|
||||
|
||||
CASE 区间 1[,CASE 区间 2..CASE 区间 N]
|
||||
|
||||
CASE 区间的语法为:
|
||||
|
||||
区间开始值[TO 区间结束值]
|
||||
```tsl
|
||||
case 区间 1[, case 区间 2 .. case 区间 N]
|
||||
区间开始值 [to 区间结束值]
|
||||
```
|
||||
|
||||
如果没有 TO 语句,则结束值和开始值相同。
|
||||
|
||||
例:
|
||||
|
||||
```text
|
||||
Function CaseExample(Age);
|
||||
|
||||
Begin
|
||||
|
||||
Case Age Of
|
||||
|
||||
0: Writeln("婴儿");
|
||||
|
||||
1 ,2: Writeln("婴幼儿");
|
||||
|
||||
3 TO 6: Writeln("幼儿");
|
||||
|
||||
7 TO 14: Writeln("少年");
|
||||
|
||||
15 TO 17: Writeln("青少年");
|
||||
|
||||
Else
|
||||
|
||||
Writeln("成年");
|
||||
|
||||
End;
|
||||
|
||||
End;
|
||||
```tsl
|
||||
function CaseExample(Age);
|
||||
begin
|
||||
case Age of
|
||||
0: Writeln("婴儿");
|
||||
1, 2: Writeln("婴幼儿");
|
||||
3 to 6: Writeln("幼儿");
|
||||
7 to 14: Writeln("少年");
|
||||
15 to 17: Writeln("青少年");
|
||||
else
|
||||
Writeln("成年");
|
||||
end;
|
||||
end;
|
||||
```
|
||||
|
||||
语法二:支持 Case 表达式,在该种情况下,分支语句不支持语句段,只能是单语句表达式。
|
||||
|
||||
B:= CASE <Expression> OF
|
||||
|
||||
<情况标号表 1>: 表达式 1;
|
||||
|
||||
<情况标号表 2>: 表达式 2;
|
||||
|
||||
```tsl
|
||||
B := case <Expression> of
|
||||
<情况标号表 1> : 表达式 1;
|
||||
<情况标号表 2> : 表达式 2;
|
||||
```
|
||||
…(其它的与普通用法一致)
|
||||
|
||||
范例:
|
||||
|
||||
范例一:
|
||||
|
||||
```text
|
||||
a:=3;
|
||||
|
||||
b:=case a of
|
||||
|
||||
1,2:"1/2";
|
||||
|
||||
3,4:"3/4";
|
||||
|
||||
else
|
||||
|
||||
"OTHER";
|
||||
|
||||
```tsl
|
||||
a := 3;
|
||||
b := case a of
|
||||
1, 2: "1/2";
|
||||
3, 4: "3/4";
|
||||
else "OTHER";
|
||||
end;
|
||||
|
||||
return b;
|
||||
```
|
||||
|
||||
//结果:3/4
|
||||
结果:3/4
|
||||
|
||||
范例二:
|
||||
|
||||
```text
|
||||
a:=3;
|
||||
|
||||
b:=case a of
|
||||
|
||||
1,2:echo "1/2";
|
||||
|
||||
3,4:echo "3/4";
|
||||
|
||||
else
|
||||
|
||||
"OTHER";
|
||||
|
||||
```tsl
|
||||
a := 3;
|
||||
b := case a of
|
||||
1, 2: echo "1/2";
|
||||
3, 4: echo "3/4";
|
||||
else "OTHER";
|
||||
end;
|
||||
|
||||
return b;
|
||||
```
|
||||
|
||||
//结果:0。打印窗口:3/4
|
||||
结果:0。打印窗口:3/4
|
||||
|
||||
范例三:表达式的用法
|
||||
|
||||
```text
|
||||
b:=@case a of
|
||||
|
||||
1,2:"1/2";
|
||||
|
||||
3,4:"3/4";
|
||||
|
||||
else
|
||||
|
||||
"OTHER";
|
||||
|
||||
```tsl
|
||||
b := @case a of
|
||||
1, 2: "1/2";
|
||||
3, 4: "3/4";
|
||||
else "OTHER";
|
||||
end;
|
||||
|
||||
a:=2;
|
||||
|
||||
a := 2;
|
||||
return eval(b);
|
||||
```
|
||||
|
||||
//结果:1/2
|
||||
结果:1/2
|
||||
|
||||
### 循环语句
|
||||
|
||||
当需要重复执行一条或是一组语句时,可以使用循环控制语句。TSL 中的循环控制语句有 While 语句和 For 语句。
|
||||
|
||||
#### 内容
|
||||
|
||||
- WHILE
|
||||
- REPEAT
|
||||
- FOR
|
||||
- BREAK
|
||||
- CONTINUE
|
||||
|
||||
#### WHILE
|
||||
|
||||
while 语句用于"当满足某一条件时重复执行语句"的情况。while 语句的语法格式:
|
||||
|
|
@ -317,31 +230,21 @@ while 布尔表达式 do 语句;
|
|||
说明:
|
||||
|
||||
语句可以是一条语句或是一组语句,如果是一组语句时,这组语句必须使用 Begin …
|
||||
End 标识符来限定,写成复合语句。
|
||||
end 标识符来限定,写成复合语句。
|
||||
|
||||
例 4:计算从 0 到某个数之间的和。
|
||||
|
||||
```text
|
||||
Function sums(limit);
|
||||
|
||||
```tsl
|
||||
function sums(limit);
|
||||
begin
|
||||
|
||||
sum:=0;
|
||||
|
||||
num:=0;
|
||||
|
||||
while num<=limit do
|
||||
|
||||
begin
|
||||
|
||||
sum:=sum+num;
|
||||
|
||||
num++;
|
||||
|
||||
end;
|
||||
|
||||
return sum;
|
||||
|
||||
sum := 0;
|
||||
num := 0;
|
||||
while num <= limit do
|
||||
begin
|
||||
sum := sum + num;
|
||||
num++;
|
||||
end;
|
||||
return sum;
|
||||
end;
|
||||
```
|
||||
|
||||
|
|
@ -349,11 +252,9 @@ end;
|
|||
|
||||
repeat 语句用于”重复执行语句直到满足某一条件”的情况。repeat 语句的语法格式:
|
||||
|
||||
```text
|
||||
```tsl
|
||||
repeat
|
||||
|
||||
语句段;
|
||||
|
||||
// 语句段;
|
||||
until 布尔表达式;
|
||||
```
|
||||
|
||||
|
|
@ -366,42 +267,32 @@ repeat 与 while 不同之处有几点:
|
|||
2,repeat 的判断条件是结束条件,而 while 的判定条件是开始做的条件;
|
||||
|
||||
3,repeat 和 util 之间可以有语句段,不需要 begin
|
||||
end 来限定,而 while 由于没有结束的特殊标识符,因此当使用语句段的时候必须用 Begin
|
||||
end 来限定,而 while 由于没有结束的特殊标识符,因此当使用语句段的时候必须用 begin
|
||||
end 来约束。
|
||||
|
||||
例 5:求第一个阶乘超过指定值的值
|
||||
|
||||
```text
|
||||
Function MinMultiValue(limit);
|
||||
|
||||
```tsl
|
||||
function MinMultiValue(limit);
|
||||
begin
|
||||
|
||||
multi:=1;
|
||||
|
||||
value:=1;
|
||||
|
||||
repeat
|
||||
|
||||
multi:=multi*value;
|
||||
|
||||
value++;
|
||||
|
||||
until multi>limit;
|
||||
|
||||
return value;
|
||||
|
||||
multi := 1;
|
||||
value := 1;
|
||||
repeat
|
||||
multi := multi * value;
|
||||
value++;
|
||||
until multi > limit;
|
||||
return value;
|
||||
end;
|
||||
```
|
||||
|
||||
#### FOR
|
||||
|
||||
```tsl
|
||||
for 语句用来描述已知重复次数的循环结构。for 语句有三种形式:
|
||||
|
||||
(1) for 控制变量:=初值 to 终值 [step 步长] do 语句;
|
||||
|
||||
(2) for 控制变量:=初值 downto 终值 [step 步长] do 语句;
|
||||
|
||||
(3) for 控制变量 1,控制变量 2 IN 数组 Do 语句;
|
||||
(1) for 控制变量 := 初值 to 终值 [step 步长] do 语句;
|
||||
(2) for 控制变量 := 初值 downto 终值 [step 步长] do 语句;
|
||||
(3) for 控制变量 1,控制变量 2 in 数组 do 语句;
|
||||
```
|
||||
|
||||
第一种形式的 for 语句是递增循环。
|
||||
|
||||
|
|
@ -419,37 +310,23 @@ for 语句用来描述已知重复次数的循环结构。for 语句有三种形
|
|||
|
||||
例如:计算 1+2+3+……+99+100 的值
|
||||
|
||||
```text
|
||||
Function PlusFor();
|
||||
|
||||
```tsl
|
||||
function PlusFor();
|
||||
begin
|
||||
|
||||
sum:=0;
|
||||
|
||||
for i:=1 to 100 do //缺省步长,默认步长为1
|
||||
|
||||
sum:=sum+i;
|
||||
|
||||
return sum;
|
||||
|
||||
sum := 0;
|
||||
for i := 1 to 100 do sum := sum + i; // 缺省步长,默认步长为 1
|
||||
return sum;
|
||||
end;
|
||||
```
|
||||
|
||||
例如:计算 1+3+5+……+99 的值
|
||||
|
||||
```text
|
||||
Function PlusFor2();
|
||||
|
||||
```tsl
|
||||
function PlusFor2();
|
||||
begin
|
||||
|
||||
sum:=0;
|
||||
|
||||
for i:=1 to 100 step 2 do
|
||||
|
||||
sum:=sum+i;
|
||||
|
||||
return sum;
|
||||
|
||||
sum := 0;
|
||||
for i := 1 to 100 step 2 do sum := sum + i;
|
||||
return sum;
|
||||
end;
|
||||
```
|
||||
|
||||
|
|
@ -457,7 +334,7 @@ end;
|
|||
|
||||
对数组中的每一行(第一维)进行遍历,当前行的下标存放在第一个控制变量中,该行对应的值存放在第二个控制变量中。从第一行开始,将行标与当前行的值分别赋值给控制变量 1 与控制变量 2 后,执行循环体,在执行了循环体之后,自动将 2 个控制变量的值赋值为下一行的下标及该行值,当遍历完最后一行之后,退出 for 循环,执行 for 语句之后的语句。
|
||||
|
||||
For … IN 遍历的用法说明
|
||||
for … in 遍历的用法说明
|
||||
|
||||
语法:For i,v IN TArray DO 语句;说明:对数据的遍历。
|
||||
|
||||
|
|
@ -473,42 +350,28 @@ TArray:需要被遍历的数组。
|
|||
|
||||
范例一:一维数组的应用
|
||||
|
||||
```text
|
||||
data:=array('a':1,'b':5,'c':3,'d':-2);
|
||||
|
||||
s:=0;
|
||||
|
||||
for i,v in data do
|
||||
|
||||
s+=v;
|
||||
|
||||
```tsl
|
||||
data := array('a': 1, 'b': 5, 'c': 3, 'd': -2);
|
||||
s := 0;
|
||||
for i, v in data do s += v;
|
||||
return s;
|
||||
|
||||
//返回实数7
|
||||
```
|
||||
|
||||
返回:7
|
||||
|
||||
范例二:二维数组的应用
|
||||
|
||||
```text
|
||||
data:=rand(array('a','b','c'),array('AA','BB','CC','DD'));
|
||||
|
||||
s:=0;
|
||||
|
||||
t:=1;
|
||||
|
||||
for i,v in data do //data是二维数组,所以第一维中,v的值是一个一维数组,即当前行。
|
||||
|
||||
for j,v1 in v do
|
||||
|
||||
begin
|
||||
|
||||
s+=v1;
|
||||
|
||||
t*=v1;
|
||||
|
||||
end
|
||||
|
||||
return array(s,t);
|
||||
```tsl
|
||||
data := rand(array('a', 'b', 'c'), array('AA', 'BB', 'CC', 'DD'));
|
||||
s := 0;
|
||||
t := 1;
|
||||
for i, v in data do // data 是二维数组,所以第一维中 v 的值是当前行的一维数组
|
||||
for j, v1 in v do
|
||||
begin
|
||||
s += v1;
|
||||
t *= v1;
|
||||
end;
|
||||
return array(s, t);
|
||||
```
|
||||
|
||||
返回:array(12,1)
|
||||
|
|
@ -516,63 +379,43 @@ return array(s,t);
|
|||
#### BREAK
|
||||
|
||||
在执行 WHILE 和 FOR 以及 REPEAT
|
||||
UNTIL 循环语句时,可以用 BREAK 语句随时从当前循环的语句段中跳出来,并继续执行循环语句后面的语句。
|
||||
until 循环语句时,可以用 break 语句随时从当前循环的语句段中跳出来,并继续执行循环语句后面的语句。
|
||||
|
||||
注意:Break 语句只是从当前的语句循环中跳出来,如果要从多个嵌套的循环语句中跳出,则需要通过多个对应的 Break 语句来完成。
|
||||
|
||||
例 7:我们用 While 语句和 Break 语句重新来例 5 中的 1+2+3+……+99+100 值
|
||||
|
||||
```text
|
||||
Function PlusWhile();
|
||||
|
||||
```tsl
|
||||
function PlusWhile();
|
||||
begin
|
||||
|
||||
sum:=0;
|
||||
|
||||
i:=0;
|
||||
|
||||
while True do
|
||||
|
||||
begin
|
||||
|
||||
i++;
|
||||
|
||||
if i>100 then
|
||||
|
||||
|
||||
break;
|
||||
|
||||
|
||||
sum:=sum+i;
|
||||
|
||||
end;
|
||||
|
||||
return sum; //BREAK后执行的第一行语句。
|
||||
|
||||
sum := 0;
|
||||
i := 0;
|
||||
while true do
|
||||
begin
|
||||
i++;
|
||||
if i > 100 then break;
|
||||
sum := sum + i;
|
||||
end;
|
||||
return sum; // break 后执行的第一行语句
|
||||
end;
|
||||
```
|
||||
|
||||
#### CONTINUE
|
||||
|
||||
CONTINUE 语句和 BREAK 语句一样,都可以改变 WHILE 循环语句和 FOR 循环语句以及 REPEAT
|
||||
UNTIL 的执行顺序。
|
||||
until 的执行顺序。
|
||||
|
||||
BREAK 是强制地从一个循环语句中跳出来,提前结束循环,而 CONTINUE 语句则强制地结束当前循环开始进入下一次循环。
|
||||
|
||||
如:
|
||||
|
||||
```text
|
||||
While true do
|
||||
|
||||
Begin
|
||||
|
||||
i++;
|
||||
|
||||
if i=100 then continue;//跳过100
|
||||
|
||||
if i>=1000 then break; //到1000结束
|
||||
|
||||
End;
|
||||
```tsl
|
||||
while true do
|
||||
begin
|
||||
i++;
|
||||
if i = 100 then continue; // 跳过 100
|
||||
if i >= 1000 then break; // 到 1000 结束
|
||||
end;
|
||||
```
|
||||
|
||||
### GOTO
|
||||
|
|
@ -581,103 +424,63 @@ End;
|
|||
|
||||
一个 GOTO 的案例:
|
||||
|
||||
```text
|
||||
for i := 0 to length(data) -1 do
|
||||
|
||||
begin
|
||||
|
||||
for j := 0 to length(data[i])-1 do
|
||||
|
||||
begin
|
||||
|
||||
if data[i][j] = target then
|
||||
|
||||
begin
|
||||
|
||||
|
||||
goto finded;
|
||||
|
||||
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
|
||||
```tsl
|
||||
for i := 0 to length(data) - 1 do
|
||||
begin
|
||||
for j := 0 to length(data[i]) - 1 do
|
||||
begin
|
||||
if data[i][j] = target then
|
||||
begin
|
||||
goto finded;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
label finded;
|
||||
|
||||
|
||||
//在一个二维数组中查找只要查找到则结束
|
||||
// 在二维数组中查找,找到即结束
|
||||
```
|
||||
|
||||
GOTO 有一个特性,就是只能从内层往外层跳转(且不能跨越函数)
|
||||
goto 有一个特性,就是只能从内层往外层跳转(且不能跨越函数)
|
||||
|
||||
### 错误控制,以及调试语句
|
||||
|
||||
#### 内容
|
||||
|
||||
- 异常处理 Try Except/Finally
|
||||
- ExceptObject 异常对象
|
||||
- RAISE
|
||||
- DEBUGRETURN
|
||||
- DebugRunEnv 与 DebugRunEnvDo
|
||||
- MTIC,MTOC 计算运算时间
|
||||
- SetProfiler,GetProfilerInfo 优化信息
|
||||
- 调用信息与代码行号
|
||||
|
||||
#### 异常处理 Try Except/Finally
|
||||
|
||||
某些函数在执行的过程中可能会自动抛出异常,或者被手动 Raise 抛出异常,这个时候如果没有异常处理运行就会终止。
|
||||
|
||||
使用异常处理则可以保护程序继续执行,并可以对异常进行相应的处理。异常的信息可以由 ExceptObject 对象获得,异常处理使用如下模式:
|
||||
|
||||
```text
|
||||
Try
|
||||
|
||||
被保护的程序执行段
|
||||
|
||||
Except
|
||||
|
||||
异常处理程序段
|
||||
|
||||
End;
|
||||
```tsl
|
||||
try
|
||||
// 被保护的程序执行段
|
||||
except
|
||||
// 异常处理程序段
|
||||
end;
|
||||
```
|
||||
|
||||
例如:
|
||||
|
||||
```text
|
||||
Try
|
||||
|
||||
I:=StrToInt(S); //当S不能转换为整数的时候会产生异常。
|
||||
|
||||
Except
|
||||
|
||||
I:=0; //当发生异常的时候设置I为0;
|
||||
|
||||
Writeln(ExceptObject.ErrInfo);
|
||||
|
||||
End;
|
||||
```tsl
|
||||
try
|
||||
I := StrToInt(S); // 当 S 不能转换为整数时会产生异常
|
||||
except
|
||||
I := 0; // 当发生异常时设置 I 为 0
|
||||
Writeln(ExceptObject.ErrInfo);
|
||||
end;
|
||||
```
|
||||
|
||||
对于某个程序段可能出现中途返回或者退出,或者中途被异常中断,而某些代码必需要在其后执行的,则采用如下模式:
|
||||
|
||||
```text
|
||||
Try
|
||||
|
||||
被保护的程序执行段
|
||||
|
||||
Finally
|
||||
|
||||
|
||||
保证执行的处理程序段,即便Try Finally之间的语句有返回或者异常产生。
|
||||
|
||||
End;
|
||||
```tsl
|
||||
try
|
||||
// 被保护的程序执行段
|
||||
finally
|
||||
// 保证执行的处理程序段,即便Try Finally之间的语句有返回或者异常产生。
|
||||
end;
|
||||
```
|
||||
|
||||
注:try...Except...end 可以使程序在报错时继续向下运行,即主程序不终止。
|
||||
|
||||
try...Finally...end 则是该报错时就会报错,即发生错误时程序会报错且终止,只是在中断前会执行完 Finally 中的命令行。
|
||||
try...finally...end 则是该报错时就会报错,即发生错误时程序会报错且终止,只是在中断前会执行完 finally 中的命令行。
|
||||
|
||||
#### ExceptObject 异常对象
|
||||
|
||||
|
|
@ -693,19 +496,13 @@ ExceptObject. ErrNo 错误号
|
|||
|
||||
例如:
|
||||
|
||||
```text
|
||||
a:=100;
|
||||
|
||||
```tsl
|
||||
a := 100;
|
||||
try
|
||||
|
||||
a:=1+'a';
|
||||
|
||||
a := 1 + 'a';
|
||||
except
|
||||
|
||||
echo ExceptObject.ErrInfo;
|
||||
|
||||
echo ExceptObject.ErrInfo;
|
||||
end;
|
||||
|
||||
return a;
|
||||
```
|
||||
|
||||
|
|
@ -720,10 +517,9 @@ type error
|
|||
|
||||
如:
|
||||
|
||||
```text
|
||||
A:=-1;
|
||||
|
||||
If a<0 then raise “a不能小于0”;
|
||||
```tsl
|
||||
A := -1;
|
||||
if a < 0 then raise “a不能小于0”;
|
||||
```
|
||||
|
||||
运行时报错如:
|
||||
|
|
@ -734,21 +530,14 @@ If a<0 then raise “a不能小于0”;
|
|||
|
||||
如下面示例,返回为 3 而不是 4:
|
||||
|
||||
```text
|
||||
A:=abcd(3);
|
||||
|
||||
Return A+1;
|
||||
|
||||
|
||||
Function abcd(bb);
|
||||
|
||||
Begin
|
||||
|
||||
|
||||
debugreturn
|
||||
bb;
|
||||
|
||||
End;
|
||||
```tsl
|
||||
A := abcd(3);
|
||||
return A + 1;
|
||||
function abcd(bb);
|
||||
begin
|
||||
debugreturn
|
||||
bb;
|
||||
end;
|
||||
```
|
||||
|
||||
#### DebugRunEnv 与 DebugRunEnvDo
|
||||
|
|
@ -769,17 +558,12 @@ DebugRunEnvDo FunctionXX(….)
|
|||
|
||||
一般使用:以上代码可以计算所耗费的秒数
|
||||
|
||||
```text
|
||||
```tsl
|
||||
MTIC
|
||||
;
|
||||
|
||||
A:=0;
|
||||
|
||||
For i:=0 to 99999 do
|
||||
|
||||
 A++;
|
||||
|
||||
Return
|
||||
A := 0;
|
||||
for i := 0 to 99999 do  A++;
|
||||
return
|
||||
MTOC
|
||||
;
|
||||
```
|
||||
|
|
@ -788,32 +572,20 @@ MTOC
|
|||
|
||||
默认 MTOC 和上次 MTIC 匹配,但是也可以指定某个 MTIC 的返回来计算时间
|
||||
|
||||
```text
|
||||
T1:=
|
||||
```tsl
|
||||
T1 :=
|
||||
MTIC
|
||||
;
|
||||
|
||||
For i:=0 to 9999 do
|
||||
|
||||
A++;
|
||||
|
||||
TE1:=
|
||||
for i := 0 to 9999 do A++;
|
||||
TE1 :=
|
||||
MTOC(T1)
|
||||
;
|
||||
|
||||
|
||||
MTIC;
|
||||
|
||||
|
||||
For j:=0 to 9999 do
|
||||
|
||||
A++;
|
||||
|
||||
TE2:=
|
||||
for j := 0 to 9999 do A++;
|
||||
TE2 :=
|
||||
MTOC(T1)
|
||||
;
|
||||
|
||||
Return array(TE1,TE2,
|
||||
return array(TE1, TE2,
|
||||
MTOC
|
||||
);
|
||||
```
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -5,47 +5,33 @@
|
|||
## 目录
|
||||
|
||||
- [#网格计算操作符](#网格计算操作符)
|
||||
- [内容](#内容)
|
||||
- [#网格计算操作符简介](#网格计算操作符简介)
|
||||
- [网格计算案例](#网格计算案例)
|
||||
- [网格计算代入系统参数的案例](#网格计算代入系统参数的案例)
|
||||
- [网格计算设置任务超时时间](#网格计算设置任务超时时间)
|
||||
- [TSL 全局缓存的应用说明](#tsl全局缓存的应用说明)
|
||||
- [内容](#内容-1)
|
||||
- [TSL 全局缓存的应用说明](#tsl-全局缓存的应用说明)
|
||||
- [全局缓存管理](#全局缓存管理)
|
||||
- [内容](#内容-2)
|
||||
- [全局缓存管理的函数](#全局缓存管理的函数)
|
||||
- [全局缓存的使用](#全局缓存的使用)
|
||||
- [全局缓存的过期与回收策略](#全局缓存的过期与回收策略)
|
||||
- [全局缓存管理的初始化和监控](#全局缓存管理的初始化和监控)
|
||||
- [未升级的系统对新代码的使用](#未升级的系统对新代码的使用)
|
||||
- [初始化 TSL 和监控管理的 TSL](#初始化tsl和监控管理的tsl)
|
||||
- [内容](#内容-3)
|
||||
- [初始化 TSL 和监控管理的 TSL](#初始化-tsl-和监控管理的-tsl)
|
||||
- [功能设计](#功能设计)
|
||||
|
||||
## #网格计算操作符
|
||||
|
||||
### 内容
|
||||
|
||||
- #网格计算操作符简介
|
||||
- 网格计算案例
|
||||
- 网格计算代入系统参数的案例
|
||||
- 网格计算设置任务超时时间
|
||||
|
||||
### #网格计算操作符简介
|
||||
|
||||
什么是网格计算?
|
||||
|
||||
随着计算技术的发展,计算机已经得到了大规模普及,计算资源随处可见。另一方面,随着 CPU 制程技术提高的门槛越来越高,制造工艺成为了单一 CPU 内核计算性能提升的瓶颈。CPU 的主流发展从主频的提高逐步向多核迈进,而在应用层面上,以往单服务器计算逐渐被集群式计算所代替。在处理数据规模越来越大,计算模型越来越复杂的趋势下,传统单任务串行计算越来越成为了技术瓶颈,对于多 CPU 多内核以及多服务器群而言,成为了计算资源的巨大浪费,这个时候,对并行计算的研究成为了未来发展的主流,而网格计算则成为了并行计算研究中的热点。
|
||||
|
||||
并行计算在超算中心的大型主机应用中被广泛应用,依靠硬件技术,成千上万台主机被联接成为一个大型主机,这样使得在其上的开发对于用户而言,后台成千上万的主机只是一台拥有成千上万个计算核心的计算,用户不用关注数据的同步,用户也不用关注计算将派发到哪里。但是超算中心的建设和使用成本都非常巨大,而且还受到超算中心的数据管理麻烦的制约。
|
||||
|
||||
普通 PC 服务器的 CPU 核心数都非常有限,单机并行计算无法充分利用起计算机资源,这个时候,网格计算就孕育而生了。
|
||||
网格计算用于并行执行函数调用,把任务分发到可用计算资源并异步返回句柄。适用于大量独立任务的批量计算;对强顺序依赖的流程不适用。
|
||||
|
||||
网格使用格式:
|
||||
|
||||
R[i]:=#函数名(参数…) with array(系统参数列表…) timeout N;
|
||||
|
||||
```tsl
|
||||
R[i] := #函数名(参数…) with array(系统参数列表…) timeout N;
|
||||
```
|
||||
其中,with 语句可指定网格运算子程中的系统参数,此输入可省
|
||||
|
||||
timeout
|
||||
|
|
@ -59,45 +45,26 @@ N 为指定网格运算子程序运行的超时时间,若运行超过设定时
|
|||
|
||||
例如:
|
||||
|
||||
```text
|
||||
A:=Array();
|
||||
|
||||
B:=Array('SZ000001','SZ000002','SH600000');
|
||||
|
||||
for i:=0 to length(B)-1 do
|
||||
|
||||
begin
|
||||
|
||||
A[I]:=
|
||||
###
|
||||
CalcStock(B[I]);
|
||||
|
||||
end;
|
||||
|
||||
//--对结果进行访问,用来等待所有网格运行完成,并得到运行结果
|
||||
|
||||
r:=array();
|
||||
|
||||
for j:=0 to length(A)-1 do
|
||||
|
||||
r[j]:=dupvalue(A[j]);//复制网格子程序结果-》即等待网格运行完成
|
||||
|
||||
Return r;
|
||||
```tsl
|
||||
A := array();
|
||||
B := array('SZ000001', 'SZ000002', 'SH600000');
|
||||
for i := 0 to length(B) - 1 do
|
||||
begin
|
||||
A[i] := #CalcStock(B[i]);
|
||||
end;
|
||||
// 对结果进行访问,用来等待所有网格运行完成并取得结果
|
||||
r := array();
|
||||
for j := 0 to length(A) - 1 do r[j] := dupvalue(A[j]); // 复制网格子程序结果
|
||||
return r;
|
||||
```
|
||||
|
||||
//---需要被网格调用的函数 CalcStock
|
||||
需要被网格调用的函数 `CalcStock`:
|
||||
|
||||
```text
|
||||
Function CalcStock(StockId);
|
||||
|
||||
|
||||
Begin
|
||||
|
||||
|
||||
//…………………
|
||||
|
||||
|
||||
End;
|
||||
```tsl
|
||||
function CalcStock(StockId);
|
||||
begin
|
||||
// ...
|
||||
end;
|
||||
```
|
||||
|
||||
### 网格计算代入系统参数的案例
|
||||
|
|
@ -106,12 +73,11 @@ CalcStock(B[I]);
|
|||
|
||||
例如:
|
||||
|
||||
```text
|
||||
A[i]:=#Close()
|
||||
with Array(pn_Stock():StockId,pn_Date():ToDay()-1)
|
||||
```tsl
|
||||
A[i] := #Close() with array(pn_stock():StockId, pn_date():Today() - 1);
|
||||
```
|
||||
|
||||
就可以获得指定的股票昨天的收盘价,\*实际中我们不会用网格计算去调用收盘价函数,因为网格存在开销那样的效率会更低,这只是一个例子。
|
||||
就可以获得指定股票昨日的收盘价。实际使用时不建议用网格计算调用收盘价函数,这里仅作示例。
|
||||
|
||||
### 网格计算设置任务超时时间
|
||||
|
||||
|
|
@ -120,47 +86,34 @@ N 对该子进程进行设置超时时间,若网格运行的程序运行时间
|
|||
|
||||
如有网格运行目标程序:
|
||||
|
||||
```text
|
||||
Function testdo();
|
||||
|
||||
```tsl
|
||||
function TestDo();
|
||||
begin
|
||||
|
||||
sleep(10*1000);
|
||||
|
||||
return getsysparam(pn_stock());
|
||||
|
||||
sleep(10 * 1000);
|
||||
return getsysparam(pn_stock());
|
||||
end;
|
||||
```
|
||||
|
||||
在网格中设置超时间为 3 秒,调用如下:
|
||||
|
||||
```text
|
||||
r:=# testDo() timeout 3000;
|
||||
|
||||
t:=dupvalue(r);
|
||||
|
||||
return t;
|
||||
```tsl
|
||||
r := #TestDo() timeout 3000;
|
||||
t := dupvalue(r);
|
||||
return t;
|
||||
```
|
||||
|
||||
在网格中通过 with 传入系统参数的同时设置超时间为 3 秒,调用如下:
|
||||
|
||||
```text
|
||||
r:=# testDo() with array(pn_stock():"SZ000002") timeout 3000;
|
||||
|
||||
t:=dupvalue(r);
|
||||
|
||||
return t;
|
||||
```tsl
|
||||
r := #TestDo() with array(pn_stock():"SZ000002") timeout 3000;
|
||||
t := dupvalue(r);
|
||||
return t;
|
||||
```
|
||||
|
||||
超时报错 Grid timeout,示例如下:
|
||||
|
||||
## TSL 全局缓存的应用说明
|
||||
|
||||
### 内容
|
||||
|
||||
- 全局缓存管理
|
||||
- 初始化 TSL 和监控管理的 TSL
|
||||
|
||||
### 全局缓存管理
|
||||
|
||||
TSL 设计的全局缓存是一套极为高效的内存缓存机制,其以 COPYONWRITE 的模式实现了设置和写入完全分离,允许存在多份使用中的版本,使得更新数据和读数据无冲突。
|
||||
|
|
@ -175,48 +128,25 @@ TSL 的全局缓存主要应用于数组和矩阵两种类型,也支持其他
|
|||
|
||||
由于我们对 TSL 全局缓存的透明处理,因为普通函数无法分辨全局缓存还是标准数据类型,除非采用特殊的函数。
|
||||
|
||||
#### 内容
|
||||
|
||||
- 全局缓存管理的函数
|
||||
- 全局缓存的使用
|
||||
- 全局缓存的过期与回收策略
|
||||
- 全局缓存管理的初始化和监控
|
||||
- 未升级的系统对新代码的使用
|
||||
|
||||
#### 全局缓存管理的函数
|
||||
|
||||
##### 内容
|
||||
|
||||
- SetGlobalCache
|
||||
- GetGlobalCache
|
||||
- CheckGlobalCacheExpired
|
||||
- GetGlobalCacheInfo
|
||||
- ListGlobalCache
|
||||
- ListGlobalCacheRemoved
|
||||
- IfCache
|
||||
|
||||
##### SetGlobalCache
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
a:=rand(1000,100);
|
||||
|
||||
return SetGlobalCache("LLL",a,now()+1); //设置一个名为”LLL”的全局缓存,生存周期为1天
|
||||
```tsl
|
||||
a := rand(1000, 100);
|
||||
return SetGlobalCache("LLL", a, now() + 1); // 设置一个名为”LLL”的全局缓存,生存周期为1天
|
||||
```
|
||||
|
||||
##### GetGlobalCache
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
```tsl
|
||||
mtic;
|
||||
|
||||
for i:=0 to 999999 do
|
||||
|
||||
getglobalCache("LLL",V);
|
||||
|
||||
return array(V,mtoc);
|
||||
for i := 0 to 999999 do getglobalCache("LLL", V);
|
||||
return array(V, mtoc);
|
||||
```
|
||||
|
||||
这个例子告诉我们,对于全局缓存数据,无论全局缓存数据本身多大,例如这个是 1000\*1000 的矩阵,获取 100 万次花费的时间也是微乎其微的。这样我们的数据准备工作所耗费的时间几乎就不存在了。
|
||||
|
|
@ -225,36 +155,28 @@ mtic;
|
|||
|
||||
范例
|
||||
|
||||
```text
|
||||
Setglobalcache("VVV",rand(1000,100));
|
||||
|
||||
Getglobalcache("VVV",V);
|
||||
|
||||
expired1:=CheckGlobalCacheExpired(V);
|
||||
|
||||
setglobalcache("VVV",rand(1000,100));//重置,V过期
|
||||
|
||||
return array("重置前":expired1,"重置后":CheckGlobalCacheExpired(V));
|
||||
```tsl
|
||||
Setglobalcache("VVV", rand(1000, 100));
|
||||
Getglobalcache("VVV", V);
|
||||
expired1 := CheckGlobalCacheExpired(V);
|
||||
setglobalcache("VVV", rand(1000, 100)); // 重置,V过期
|
||||
return array("重置前":expired1, "重置后":CheckGlobalCacheExpired(V));
|
||||
```
|
||||
|
||||
##### GetGlobalCacheInfo
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
if GetGlobalCache("LLL",V) then
|
||||
|
||||
|
||||
return GetGlobalCacheInfo(V);
|
||||
```tsl
|
||||
if GetGlobalCache("LLL", V) then return GetGlobalCacheInfo(V);
|
||||
```
|
||||
|
||||
##### ListGlobalCache
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
getglobalcache("LLL",v);
|
||||
|
||||
```tsl
|
||||
getglobalcache("LLL", v);
|
||||
return listglobalcache();
|
||||
```
|
||||
|
||||
|
|
@ -266,32 +188,24 @@ Owners 列里是缓存使用中的用户列表
|
|||
|
||||
范例 1:
|
||||
|
||||
```text
|
||||
SetGlobalCache("CCC",array(1,2,3));
|
||||
|
||||
Getglobalcache("CCC",V); //v指向全局缓存
|
||||
|
||||
setglobalcache("CCC",array(1,2,3,4));//v的版本已经过期
|
||||
|
||||
return listglobalcacheremoved();
|
||||
```tsl
|
||||
SetGlobalCache("CCC", array(1, 2, 3));
|
||||
Getglobalcache("CCC", V); // v指向全局缓存
|
||||
setglobalcache("CCC", array(1, 2, 3, 4)); // v的版本已经过期
|
||||
return listglobalcacheremoved();
|
||||
```
|
||||
|
||||
存在一份 CCC 的过期版本。
|
||||
|
||||
范例 2:
|
||||
|
||||
```text
|
||||
SetGlobalCache("CCC",array(1,2,3));
|
||||
|
||||
Getglobalcache("CCC",V); //v指向全局缓存
|
||||
|
||||
setglobalcache("CCC",array(1,2,3,4));//V已经过期
|
||||
|
||||
//return listglobalcacheremoved();
|
||||
|
||||
V:=nil;//V释放了没有过期版本
|
||||
|
||||
return listglobalcacheremoved();
|
||||
```tsl
|
||||
SetGlobalCache("CCC", array(1, 2, 3));
|
||||
Getglobalcache("CCC", V); // v指向全局缓存
|
||||
setglobalcache("CCC", array(1, 2, 3, 4)); // V已经过期
|
||||
// return listglobalcacheremoved();
|
||||
V := nil; // V释放了没有过期版本
|
||||
return listglobalcacheremoved();
|
||||
```
|
||||
|
||||
返回结果:空数组。
|
||||
|
|
@ -300,117 +214,71 @@ SetGlobalCache("CCC",array(1,2,3));
|
|||
|
||||
#### 全局缓存的使用
|
||||
|
||||
##### 内容
|
||||
|
||||
- 全局缓存的基础函数和子矩阵的支持
|
||||
- 全局缓存的算符支持
|
||||
- 支持 SELECT
|
||||
- 写入实例化
|
||||
|
||||
##### 全局缓存的基础函数和子矩阵的支持
|
||||
|
||||
绝大多数的函数已经可以完全支持全局缓存,当成和原始数据类型对待,而子矩阵这类的操作也毫无问题。
|
||||
|
||||
```text
|
||||
a:=array();
|
||||
|
||||
for i:=1 to 9 do
|
||||
|
||||
for j:=1 to 9 do
|
||||
|
||||
a[i-1,j-1]:=i*j;
|
||||
|
||||
setglobalcache("99MT",a);
|
||||
|
||||
Getglobalcache("99MT",V);
|
||||
|
||||
return array(sum(sum(V)),length(V),mcols(V),ifarray(V),V[8,8],V[0:3,0:3]);
|
||||
```tsl
|
||||
a := array();
|
||||
for i := 1 to 9 do for j := 1 to 9 do
|
||||
a[i - 1, j - 1] := i * j;
|
||||
setglobalcache("99MT", a);
|
||||
Getglobalcache("99MT", V);
|
||||
return array(sum(sum(V)), length(V), mcols(V), ifarray(V), V[8, 8], V[0:3, 0:3]);
|
||||
```
|
||||
|
||||
##### 全局缓存的算符支持
|
||||
|
||||
对于四则运算等算符,以及矩阵运算符,还有集合运算符号等等,全局缓存和原始类型一致。
|
||||
|
||||
```text
|
||||
a:=array();
|
||||
|
||||
for i:=1 to 9 do
|
||||
|
||||
for j:=1 to 9 do
|
||||
|
||||
a[i-1,j-1]:=i*j;
|
||||
|
||||
setglobalcache("99MT",a);
|
||||
|
||||
Getglobalcache("99MT",V);
|
||||
|
||||
return V+100;
|
||||
```tsl
|
||||
a := array();
|
||||
for i := 1 to 9 do for j := 1 to 9 do
|
||||
a[i - 1, j - 1] := i * j;
|
||||
setglobalcache("99MT", a);
|
||||
Getglobalcache("99MT", V);
|
||||
return V + 100;
|
||||
```
|
||||
|
||||
##### 支持 SELECT
|
||||
|
||||
对于 SELECT 而言,全局缓存的表现和其原始数据没有任何差异。
|
||||
|
||||
```text
|
||||
a:=array();
|
||||
|
||||
for i:=1 to 9 do
|
||||
|
||||
for j:=1 to 9 do
|
||||
|
||||
a[i-1,j-1]:=i*j;
|
||||
|
||||
setglobalcache("99MT",a);
|
||||
|
||||
Getglobalcache("99MT",V);
|
||||
|
||||
return select * from V order by [0] desc end;
|
||||
```tsl
|
||||
a := array();
|
||||
for i := 1 to 9 do for j := 1 to 9 do
|
||||
a[i - 1, j - 1] := i * j;
|
||||
setglobalcache("99MT", a);
|
||||
Getglobalcache("99MT", V);
|
||||
return select * from V order by [0] desc end;
|
||||
```
|
||||
|
||||
##### 写入实例化
|
||||
|
||||
当对全局缓存进行各式写入操作时,无论是数据设置,还是 UPDATE,INSERT 等 SQL 操作,我们均会将全局缓存实例化,在用户使用的时候和传统数据复制后进行写入操作毫无差异,这样最大化地保证了易用性。
|
||||
|
||||
```text
|
||||
a:=array();
|
||||
|
||||
for i:=1 to 9 do
|
||||
|
||||
for j:=1 to 9 do
|
||||
|
||||
a[i-1,j-1]:=i*j;
|
||||
|
||||
setglobalcache("99MT",a);
|
||||
|
||||
Getglobalcache("99MT",V);
|
||||
|
||||
b:=ifcache(V);//是缓存 ,b为真
|
||||
|
||||
V[0,0]:=100; //设置完成后,ifcache就为假了
|
||||
|
||||
return array(b,ifcache(V),V);
|
||||
```tsl
|
||||
a := array();
|
||||
for i := 1 to 9 do for j := 1 to 9 do
|
||||
a[i - 1, j - 1] := i * j;
|
||||
setglobalcache("99MT", a);
|
||||
Getglobalcache("99MT", V);
|
||||
b := ifcache(V); // 是缓存 ,b为真
|
||||
V[0, 0] := 100; // 设置完成后,ifcache就为假了
|
||||
return array(b, ifcache(V), V);
|
||||
```
|
||||
|
||||
使用 SQL 的 Update 更新全局缓存也引发数据的实例化
|
||||
|
||||
```text
|
||||
a:=array();
|
||||
|
||||
for i:=1 to 9 do
|
||||
|
||||
for j:=1 to 9 do
|
||||
|
||||
a[i-1,j-1]:=i*j;
|
||||
|
||||
setglobalcache("99MT",a);
|
||||
|
||||
Getglobalcache("99MT",V);
|
||||
|
||||
b:=ifcache(V);//是缓存 ,b为真
|
||||
|
||||
update v set [0]=1 end; //update后V也不再是globalcache
|
||||
|
||||
return array(b,ifcache(V),V);
|
||||
```tsl
|
||||
a := array();
|
||||
for i := 1 to 9 do for j := 1 to 9 do
|
||||
a[i - 1, j - 1] := i * j;
|
||||
setglobalcache("99MT", a);
|
||||
Getglobalcache("99MT", V);
|
||||
b := ifcache(V); // 是缓存 ,b为真
|
||||
update v set [0] = 1 end; // update后V也不再是globalcache
|
||||
return array(b, ifcache(V), V);
|
||||
```
|
||||
|
||||
#### 全局缓存的过期与回收策略
|
||||
|
|
@ -423,10 +291,6 @@ TSL 为全局缓存建立了一套回收规则,结合了系统的剩余内存
|
|||
|
||||
一旦遇到这类的问题,用户应该检查模型使用这些全局缓存是否存在问题。由于全局缓存的获取效率以及使用效率均极高,用户不应该将全局缓存放在系统变量,TSL 的 GLOBAL 存贮等等中,用户应尽量直接使用缓存,并审慎长期占用缓存的模式。
|
||||
|
||||
##### 内容
|
||||
|
||||
- 配置
|
||||
|
||||
##### 配置
|
||||
|
||||
配置在 plugin\FileMgr.ini 中
|
||||
|
|
@ -445,14 +309,6 @@ ExpiredLoadLimit=5 //允许过期的全局缓存占用的物理内存百分比
|
|||
|
||||
ExpiredAvailLimit=16777216 //允许过期的全局缓存占用的物理内存大小,单位 KB
|
||||
|
||||
###### 内容
|
||||
|
||||
- MemoryLoadLimit
|
||||
- MemoryAvailLimit
|
||||
- ExpiredSecondsCheck
|
||||
- ExpiredLoadLimit
|
||||
- ExpiredAvailLimit
|
||||
|
||||
###### MemoryLoadLimit
|
||||
|
||||
单位:百分数
|
||||
|
|
@ -485,28 +341,18 @@ ExpiredAvailLimit=16777216 //允许过期的全局缓存占用的物理内存大
|
|||
|
||||
#### 全局缓存管理的初始化和监控
|
||||
|
||||
##### 内容
|
||||
|
||||
- 有瑕疵的全局缓存管理方式
|
||||
- 期望的方式
|
||||
- 不推荐的模式
|
||||
- 全局缓存的初始化
|
||||
- 全局缓存的更新监控
|
||||
|
||||
##### 有瑕疵的全局缓存管理方式
|
||||
|
||||
全局缓存的生成,一种模式是在由应用模型内来设置:
|
||||
|
||||
例如: if not GetGlobalCache(CacheName,V) then
|
||||
|
||||
Begin
|
||||
|
||||
V:=CalcDataCall();
|
||||
|
||||
SetGlobalCache(Cache,V);
|
||||
|
||||
End;
|
||||
|
||||
```tsl
|
||||
begin
|
||||
V := CalcDataCall();
|
||||
SetGlobalCache(Cache, V);
|
||||
end;
|
||||
```
|
||||
但这样存在几个问题:
|
||||
|
||||
一是全局缓存的设置是需要权限的,一旦采用这样的模式,代码只能运行在高权限下。
|
||||
|
|
@ -515,32 +361,29 @@ ExpiredAvailLimit=16777216 //允许过期的全局缓存占用的物理内存大
|
|||
|
||||
三是我们很难知道何时适合于进行缓存的准备工作以及缓存的更新工作,因为缓存总有失效的时候,如果要解决失效问题,我们还得将代码变成如下:
|
||||
|
||||
if not GetGlobalCache(CacheName,V) or IsDataNeedReCalc(V) then
|
||||
|
||||
Begin
|
||||
|
||||
V:=CalcDataCall();
|
||||
|
||||
SetGlobalCache(Cache,V);
|
||||
|
||||
End
|
||||
|
||||
```tsl
|
||||
if not GetGlobalCache(CacheName, V) or IsDataNeedReCalc(V) then
|
||||
begin
|
||||
V := CalcDataCall();
|
||||
SetGlobalCache(Cache, V);
|
||||
end;
|
||||
```
|
||||
我们需要在 IsDataNeedReCalc 里来检查诸如外部数据的版本是否发生了变更等工作,往往这种检查对事件的耗费远远大于全局缓存的获取,这样又会影响到用户模型的效率。
|
||||
|
||||
##### 期望的方式
|
||||
|
||||
如果全局缓存的生成和更新,交由系统,那么我们期望的应用开发是如下模式:
|
||||
|
||||
if not GetGlobalCache(CacheName,V) then
|
||||
|
||||
V:=CalcDataCall();
|
||||
|
||||
```tsl
|
||||
if not GetGlobalCache(CacheName, V) then V := CalcDataCall();
|
||||
```
|
||||
由于全局缓存系统管了生成,所以我们只需要取即可,如果系统未生成,我们直接进入计算模式。
|
||||
|
||||
##### 不推荐的模式
|
||||
|
||||
GetGlobalCache(CacheName,V);
|
||||
|
||||
```tsl
|
||||
GetGlobalCache(CacheName, V);
|
||||
```
|
||||
有的开发者会在升级应用后,将取数程序变成了最简单的模式,假设缓存的获得会成功,这样在项目实施中并无不可,假设数据的初始化和数据变更确定性由系统其他部分完成了,这样也带来了数据底层来源和上层应用分离的优势。
|
||||
|
||||
但在产品开发中,我们并不推荐如此模式,因为这样会带来了新的问题。
|
||||
|
|
@ -583,17 +426,8 @@ GetGlobalCache(CacheName,V);
|
|||
|
||||
注:初始化 TSL 只运行一次,而监控的线程不会退出,当 TSL 运行完毕后会重新调用运行。
|
||||
|
||||
#### 内容
|
||||
|
||||
- 功能设计
|
||||
|
||||
#### 功能设计
|
||||
|
||||
##### 内容
|
||||
|
||||
- WEB 模块的初始化和监控
|
||||
- 平台的初始化和监控
|
||||
|
||||
##### WEB 模块的初始化和监控
|
||||
|
||||
Apache 的模块,设置在 TSL.INI 中。
|
||||
|
|
@ -604,11 +438,6 @@ automonthreads=1 //监控线程的个数
|
|||
|
||||
initrun=1 //是否运行初始化 TSL
|
||||
|
||||
###### 内容
|
||||
|
||||
- 初始化
|
||||
- 监控及管理线程
|
||||
|
||||
###### 初始化
|
||||
|
||||
初始化 InitRun.TSL 位于进程或者模块所在目录,进程所在目录优先。
|
||||
|
|
@ -636,13 +465,6 @@ Automonthreads 设置的是启动的监控管理线程的数量。
|
|||
|
||||
监控进程目前并未支持调用网格计算。
|
||||
|
||||
###### 内容
|
||||
|
||||
- 初始化
|
||||
- 监控及管理线程
|
||||
- 平台的初始化和监控 TSL 的管理
|
||||
- 平台的初始化和监控的权限管控
|
||||
|
||||
###### 初始化
|
||||
|
||||
初始化的启动是通过参数-i 来设定的,例如 Exec64.exe -i 则表明需要启动初始化。
|
||||
|
|
@ -672,6 +494,7 @@ Automonthreads 设置的是启动的监控管理线程的数量。
|
|||
|
||||
###### 平台的初始化和监控的权限管控
|
||||
|
||||
如果初始化和监控 TSL 需要调用内外部的 TSL 函数来进行数据准备,设计者推荐用户采用 data:=sudo("modeluser",getcalcdata())的模式来进行数据的一些准备工作,因为 GetCalcData()这类的函数往往不需要任何特殊权限,这样可以最大限度地防止非授权代码的运行。
|
||||
|
||||
```tsl
|
||||
// 如果初始化和监控 TSL 需要调用内外部的 TSL 函数来进行数据准备,设计者推荐用户采用 data:=sudo("modeluser",getcalcdata())的模式来进行数据的一些准备工作,因为 GetCalcData()这类的函数往往不需要任何特殊权限,这样可以最大限度地防止非授权代码的运行。
|
||||
```
|
||||
如果我们仅仅只是利用初始化和监控进行一些系统性操作,设计者强烈建议不需要使用一些中间函数,将除了二进制函数外的实现直接在.TSL 里完成,这样做可以让这些代码可以独立运行。如果无法保障这一点,强烈建议将无需权限运行的内容以 sudo 模式来运行。
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,86 +0,0 @@
|
|||
# TSL 函数大全(已迁移)
|
||||
|
||||
> ⚠️
|
||||
> **本文件已弃用** - 原文件因体积过大(221,389行,4.2MB)影响编辑器性能,已拆分为多个模块化文件。
|
||||
|
||||
## 🚀 请使用新版本
|
||||
|
||||
**新版函数参考入口:** **[function/index.md](./function/index.md)**
|
||||
|
||||
### 快速跳转
|
||||
|
||||
| 你要查找... | 跳转到... |
|
||||
| ------------------------------ | ----------------------------------------------------- |
|
||||
| 数学、字符串、日期等基础函数 | [TSL函数](./function/tsl/index.md) |
|
||||
| 股票、行情、技术分析、财务函数 | [金融函数](./function/financial/index.md) |
|
||||
| 数据查询、时间序列函数 | [数据仓库函数](./function/03_datawarehouse.md) |
|
||||
| 算法交易相关函数 | [算法交易支撑函数](./function/04_algo_trading.md) |
|
||||
| 服务器连接、执行函数 | [服务器交互函数](./function/05_server_interaction.md) |
|
||||
| Excel/Word/PDF处理 | [文档处理函数](./function/06_document_processing.md) |
|
||||
| 其他工具函数 | [函数参考总目录](./function/index.md) |
|
||||
|
||||
## 📊 拆分说明
|
||||
|
||||
原文件已拆分为 **42个独立文件**:
|
||||
|
||||
```
|
||||
function/
|
||||
├── index.md # 总索引(从这里开始)
|
||||
│
|
||||
├── tsl/ # TSL函数(10个文件)
|
||||
│ ├── index.md
|
||||
│ ├── math.md # 数学函数 (14K行)
|
||||
│ ├── base.md # 基础函数 (10K行)
|
||||
│ ├── system.md # 系统相关函数
|
||||
│ └── ...
|
||||
│
|
||||
├── financial/ # 金融函数(23个文件)
|
||||
│ ├── index.md
|
||||
│ ├── stock.md # 股票 (20K行)
|
||||
│ ├── market_data.md # 行情 (11K行)
|
||||
│ ├── financial_analysis.md # 财务分析 (46K行)
|
||||
│ └── ...
|
||||
│
|
||||
└── 03_datawarehouse.md # 其他9个独立章节
|
||||
04_algo_trading.md
|
||||
...
|
||||
```
|
||||
|
||||
## 🔍 如何查找函数
|
||||
|
||||
### 方法 1:使用索引导航(推荐)
|
||||
|
||||
1. 打开 [function/index.md](./function/index.md)
|
||||
2. 根据功能分类找到对应章节
|
||||
3. 点击链接进入具体文件
|
||||
|
||||
### 方法 2:全局搜索(最快)
|
||||
|
||||
在编辑器中使用全局搜索(`Ctrl+Shift+F` 或 `Cmd+Shift+F`):
|
||||
|
||||
- 搜索范围:`docs/tsl/syntax_book/function/`
|
||||
- 搜索关键词:函数名或功能描述
|
||||
|
||||
### 方法 3:查看历史备份
|
||||
|
||||
如需查看原始完整文件,请从历史版本获取(当前仓库不保留备份文件)。
|
||||
|
||||
## 💡 拆分的好处
|
||||
|
||||
| 拆分前 | 拆分后 |
|
||||
| -------------------------- | ----------------------- |
|
||||
| ❌ 单文件 221,389 行 | ✅ 最大文件 < 50,000 行 |
|
||||
| ❌ 编辑器打开需要 10-30 秒 | ✅ 任意文件打开 < 1 秒 |
|
||||
| ❌ Git diff 无法有效查看 | ✅ Git diff 清晰可读 |
|
||||
| ❌ 搜索定位困难 | ✅ 模块化搜索,精准定位 |
|
||||
| ❌ 难以维护和更新 | ✅ 按模块独立维护 |
|
||||
|
||||
## 📅 迁移时间
|
||||
|
||||
- 原始文件:保留至 `function.md.backup`
|
||||
- 拆分完成时间:2026-01-07
|
||||
- 拆分方式:按三级标题(###)分为11个主章节,再对TSL函数和金融函数进行二级拆分
|
||||
|
||||
---
|
||||
|
||||
**立即开始使用:** **[→ 前往新版函数参考](./function/index.md)**
|
||||
|
|
@ -0,0 +1,35 @@
|
|||
# 01 TSL函数
|
||||
|
||||
> 本模块包含数学、系统、基础、图形等通用函数,适用于各种TSL脚本开发场景。
|
||||
|
||||
**完整内容请查阅:**
|
||||
|
||||
**→ [TSL函数模块详细文档](./tsl/index.md)**
|
||||
|
||||
## 快速概览
|
||||
|
||||
### 数学与计算
|
||||
- **[数学函数](./tsl/math.md)** (14,396行) - 数值计算、三角函数、统计函数
|
||||
|
||||
### 系统与平台
|
||||
- **[系统相关函数](./tsl/system.md)** (1,647行) - 系统信息、环境变量、进程控制
|
||||
- **[平台函数](./tsl/platform.md)** (553行) - 平台特定功能
|
||||
- **[客户端函数](./tsl/client.md)** (409行) - 客户端交互、界面控制
|
||||
|
||||
### 基础功能
|
||||
- **[基础函数](./tsl/base.md)** (10,660行) - 字符串、数组、日期时间、文件操作
|
||||
- **[图形函数](./tsl/graphics.md)** (698行) - 绘图、图表、可视化
|
||||
|
||||
### 资源与交互
|
||||
- **[资源访问函数](./tsl/resource.md)** (4,897行) - 文件读写、数据库、网络通信
|
||||
- **[第三方交互函数](./tsl/third_party.md)** (610行) - 第三方库调用、外部程序交互
|
||||
|
||||
### 工具函数
|
||||
- **[压缩和解压函数](./tsl/compression.md)** (108行) - 数据压缩、解压缩
|
||||
- **[信息摘要及编码](./tsl/digest_encoding.md)** (172行) - 哈希算法、加密、编码转换
|
||||
|
||||
---
|
||||
|
||||
**共计 10 个子文件,总计 34,150 行**
|
||||
|
||||
详细目录和完整内容请访问:**[tsl/index.md](./tsl/index.md)**
|
||||
|
|
@ -0,0 +1,51 @@
|
|||
# 02 金融函数
|
||||
|
||||
> 本模块涵盖股票、行情、技术分析、财务等金融专用功能,是量化分析和金融建模的核心函数库。
|
||||
|
||||
**完整内容请查阅:**
|
||||
|
||||
**→ [金融函数模块详细文档](./financial/index.md)**
|
||||
|
||||
## 快速概览
|
||||
|
||||
### 行情数据
|
||||
- **[股票](./financial/stock.md)** (20,893行) - 股票代码、名称、上市信息、交易状态
|
||||
- **[行情](./financial/market_data.md)** (11,748行) - 实时行情、历史行情、K线数据
|
||||
- **[指数](./financial/index_data.md)** (2,237行) - 指数数据、指数成分股
|
||||
|
||||
### 技术分析
|
||||
- **[技术分析](./financial/technical_analysis.md)** (11,373行) - 均线、MACD、KDJ、RSI等技术指标
|
||||
|
||||
### 资产类别
|
||||
- **[债券](./financial/bond.md)** (2,827行) - 债券信息、收益率曲线、债券估值
|
||||
- **[期权](./financial/option.md)** (1,573行) - 期权定价、希腊字母、隐含波动率
|
||||
- **[基金](./financial/fund.md)** (10,681行) - 基金净值、持仓、业绩
|
||||
- **[期货](./financial/futures.md)** (1,248行) - 期货合约、持仓量、基差
|
||||
- **[权证](./financial/warrant.md)** (125行) - 权证信息、行权价
|
||||
- **[外汇](./financial/forex.md)** (116行) - 汇率、外汇行情
|
||||
|
||||
### 财务与基本面
|
||||
- **[财务分析](./financial/financial_analysis.md)** (46,778行) ⚠️ **最大文件** - 三大报表、财务比率
|
||||
- **[基本面](./financial/fundamentals.md)** (6,139行) - 公司信息、行业分类、股东结构
|
||||
- **[宏观](./financial/macro.md)** (789行) - 宏观经济数据、GDP、CPI
|
||||
|
||||
### 板块与分类
|
||||
- **[板块](./financial/sector.md)** (24,819行) ⚠️ **大文件** - 行业板块、概念板块、板块轮动
|
||||
|
||||
### 量化分析
|
||||
- **[金融工程](./financial/financial_engineering.md)** (6,564行) - 风险模型、因子模型、组合优化
|
||||
- **[组合评价](./financial/portfolio_evaluation.md)** (3,656行) - 绩效评估、风险调整收益
|
||||
- **[天软因子](./financial/ts_factor.md)** (186行) - 天软自定义因子库
|
||||
|
||||
### 工具与框架
|
||||
- **[框架构造Tools](./financial/framework_tools.md)** (71行) - 策略框架构建工具
|
||||
- **[网格池](./financial/grid_pool.md)** (301行) - 网格交易、池化管理
|
||||
- **[日志](./financial/logging.md)** (53行) - 交易日志、事件日志
|
||||
- **[数据提取](./financial/data_extraction.md)** (50行) - 批量数据提取工具
|
||||
- **[评价分析算法函数](./financial/evaluation_algorithms.md)** (18行) - 评价算法接口
|
||||
|
||||
---
|
||||
|
||||
**共计 22 个子文件,总计 152,245 行**
|
||||
|
||||
详细目录和完整内容请访问:**[financial/index.md](./financial/index.md)**
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -33,59 +33,23 @@
|
|||
|
||||
范例 http模式代理登陆
|
||||
|
||||
```text
|
||||
cTS:=ConnectServer("tsl.tinysoft.com.cn",443,array("Address":"192.168.0.250","Port":808,"AuthMode":0));
|
||||
|
||||
|
||||
lg:=LoginServer("TSUser","UserPass",msg);
|
||||
|
||||
|
||||
if lg=0 then
|
||||
|
||||
|
||||
begin
|
||||
|
||||
|
||||
echo "登陆成功!";
|
||||
|
||||
|
||||
Script:='program TS_testFunc;
|
||||
|
||||
|
||||
Begin
|
||||
|
||||
|
||||
r:=1->5;
|
||||
|
||||
|
||||
Return r;
|
||||
|
||||
|
||||
End.';
|
||||
|
||||
|
||||
if SendExecuteAndWait(Script,getSysParams(),Result,ErrMsg)=0 then //Execute Success
|
||||
|
||||
|
||||
echo tostn(Result),'\r\n';
|
||||
|
||||
|
||||
else
|
||||
|
||||
|
||||
echo '远端执行失败!\r\n';
|
||||
|
||||
|
||||
DisconnectServer();
|
||||
|
||||
|
||||
end
|
||||
|
||||
|
||||
else
|
||||
|
||||
|
||||
echo "登陆失败,报错:(",cTS,",",msg,")\r\n";
|
||||
```tsl
|
||||
cTS := ConnectServer("tsl.tinysoft.com.cn", 443, array("Address":"192.168.0.250", "Port":808, "AuthMode":0));
|
||||
lg := LoginServer("TSUser", "UserPass", msg);
|
||||
if lg = 0 then
|
||||
begin
|
||||
echo "登陆成功!";
|
||||
Script := 'program TS_testFunc;
|
||||
begin
|
||||
r := 1 - > 5;
|
||||
return r;
|
||||
end.';
|
||||
if SendExecuteAndWait(Script, getSysParams(), Result, ErrMsg) = 0 then//Execute Success
|
||||
echo tostn(Result), '\r\n';
|
||||
else echo '远端执行失败!\r\n';
|
||||
DisconnectServer();
|
||||
end
|
||||
else echo "登陆失败,报错:(", cTS, ",", msg, ")\r\n";
|
||||
```
|
||||
|
||||
打印"登陆成功!"则说明连接成功。参考DefaultConnectAndLogin LoginServer
|
||||
|
|
@ -109,53 +73,30 @@ Files\Tinysoft\Analyse.NET\Plugin
|
|||
|
||||
第二步:在tslclient.ini添加以下内容:
|
||||
|
||||
```text
|
||||
```ini
|
||||
[TSLClient Config]
|
||||
|
||||
;调用是登陆的别名
|
||||
|
||||
[test]
|
||||
|
||||
;本地许可
|
||||
|
||||
Permit=local
|
||||
|
||||
;用户名
|
||||
|
||||
LoginName=
|
||||
|
||||
;密码
|
||||
|
||||
LoginPass=
|
||||
|
||||
;服务器 地址
|
||||
|
||||
Address=tsl.tinysoft.com.cn
|
||||
|
||||
;端口
|
||||
|
||||
Port=443
|
||||
|
||||
;---以下为代理服务器
|
||||
|
||||
;代理服务器端口
|
||||
|
||||
ProxyPort=
|
||||
|
||||
;代理服务器地址
|
||||
|
||||
ProxyAddress=
|
||||
|
||||
;代理身份验证用户名
|
||||
|
||||
ProxyUser=
|
||||
|
||||
;验证密码
|
||||
|
||||
ProxyPass=
|
||||
|
||||
;代理模式 http模式设置为0, SOCKS5模式设置为5
|
||||
|
||||
ProxyAuthMode=
|
||||
```
|
||||
|
||||
|
|
@ -181,50 +122,24 @@ ProxyAuthMode=
|
|||
|
||||
#### 异步回调函数以及实时订阅系统参数说明
|
||||
|
||||
<table><tbody><tr><td>
|
||||
系统参数名</td><td>
|
||||
类型</td><td>
|
||||
说明</td></tr><tr><td>
|
||||
channel</td><td>
|
||||
整数</td><td>
|
||||
通道ID,和SendExecute返回值一致</td></tr><tr><td>
|
||||
recvtype</td><td>
|
||||
整数</td><td>
|
||||
参阅:<a href="http://www.tinysoft.com.cn/tsdn/helpdoc/display.tsl?id=22122">服务器返回信息类型</a></td></tr><tr><td>
|
||||
errno</td><td>
|
||||
整数</td><td>
|
||||
错误号,非0错误</td></tr><tr><td>
|
||||
errmsg</td><td>
|
||||
字符串</td><td>
|
||||
错误信息</td></tr><tr><td>
|
||||
result</td><td>
|
||||
订阅为数组类型</td><td>
|
||||
结果集,订阅为推送类型</td></tr></tbody></table>
|
||||
| 系统参数名 | 类型 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| channel | 整数 | 通道ID,和SendExecute返回值一致 |
|
||||
| recvtype | 整数 | 参阅:服务器返回信息类型 |
|
||||
| errno | 整数 | 错误号,非0错误 |
|
||||
| errmsg | 字符串 | 错误信息 |
|
||||
| result | 订阅为数组类型 | 结果集,订阅为推送类型 |
|
||||
|
||||
#### 服务器返回信息类型
|
||||
|
||||
<table><tbody><tr><td>
|
||||
返回类型</td><td>
|
||||
值</td><td>
|
||||
说明</td></tr><tr><td>
|
||||
执行函数返回</td><td>
|
||||
0x0201</td><td>
|
||||
</td></tr><tr><td>
|
||||
执行委托函数返回</td><td>
|
||||
0x0301</td><td>
|
||||
</td></tr><tr><td>
|
||||
ECHO返回</td><td>
|
||||
0x0401</td><td>
|
||||
</td></tr><tr><td>
|
||||
客户请求返回</td><td>
|
||||
0x0402</td><td>
|
||||
</td></tr><tr><td>
|
||||
实时订阅返回</td><td>
|
||||
0x0501</td><td>
|
||||
</td></tr><tr><td>
|
||||
错误信息返回</td><td>
|
||||
0</td><td>
|
||||
</td></tr></tbody></table>
|
||||
| 返回类型 | 值 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| 执行函数返回 | 0x0201 | |
|
||||
| 执行委托函数返回 | 0x0301 | |
|
||||
| ECHO返回 | 0x0401 | |
|
||||
| 客户请求返回 | 0x0402 | |
|
||||
| 实时订阅返回 | 0x0501 | |
|
||||
| 错误信息返回 | 0 | |
|
||||
|
||||
#### EndExecute
|
||||
|
||||
|
|
@ -238,31 +153,21 @@ ECHO返回</td><td>
|
|||
|
||||
范例
|
||||
|
||||
```text
|
||||
```tsl
|
||||
####python交互范例,python代码
|
||||
|
||||
import sys
|
||||
|
||||
sys.path.append('D:\\tinysoft\\Analyse.NET\\')
|
||||
|
||||
import TSLPy3 as ts
|
||||
|
||||
data=ts.DefaultConnectAndLogin("test")
|
||||
|
||||
data := ts.DefaultConnectAndLogin("test")
|
||||
print(ts.Logined())
|
||||
|
||||
print("远程登录地址",ts.RemoteAddress())
|
||||
|
||||
print("服务器设置:",ts.GetService())
|
||||
|
||||
print("远程登录地址", ts.RemoteAddress())
|
||||
print("服务器设置:", ts.GetService())
|
||||
ts.SetComputeBitsOption(64) #设置计算单位
|
||||
|
||||
print("计算位数设置:",ts.GetComputeBitsOption())
|
||||
|
||||
print("计算位数设置:", ts.GetComputeBitsOption())
|
||||
ts.Disconnect() #断开连接
|
||||
```
|
||||
|
||||
//结果
|
||||
结果
|
||||
|
||||
#### RemotePort
|
||||
|
||||
|
|
@ -295,13 +200,11 @@ ts.Disconnect() #断开连接
|
|||
|
||||
范例
|
||||
|
||||
```text
|
||||
rdo2 TSTaskAdmin("oa",CmdReturn,BroadCastMsg,ErrMsg,3000,1000);
|
||||
|
||||
```tsl
|
||||
rdo2 TSTaskAdmin("oa", CmdReturn, BroadCastMsg, ErrMsg, 3000, 1000);
|
||||
return CmdReturn;
|
||||
```
|
||||
|
||||
返回结果:
|
||||
|
||||
#### SetComputeService
|
||||
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -49,25 +49,13 @@ ECHO和WRITE,WRITELN等输出函数被重定向,不再输出,用UnSetEchoStr
|
|||
|
||||
范例
|
||||
|
||||
```text
|
||||
//先输出111222,接着另起一行显示空白,再接着另起一行输出333
|
||||
|
||||
|
||||
writeln("111","222");
|
||||
|
||||
|
||||
```tsl
|
||||
// 先输出111222,接着另起一行显示空白,再接着另起一行输出333
|
||||
writeln("111", "222");
|
||||
writeln("333");
|
||||
|
||||
|
||||
{结果页面中,运行信息下打印:
|
||||
|
||||
|
||||
111222
|
||||
|
||||
|
||||
333
|
||||
|
||||
|
||||
}
|
||||
```
|
||||
|
||||
|
|
@ -75,26 +63,14 @@ writeln("333");
|
|||
|
||||
范例
|
||||
|
||||
```text
|
||||
//先输出123456,接着另起一行输出789
|
||||
|
||||
|
||||
write("123","456");
|
||||
|
||||
|
||||
write("789");
|
||||
|
||||
|
||||
return ;
|
||||
|
||||
|
||||
{在结果页面中打印:
|
||||
|
||||
|
||||
123456
|
||||
|
||||
|
||||
789}
|
||||
```tsl
|
||||
// 先输出123456,接着另起一行输出789
|
||||
write("123", "456");
|
||||
write("789");
|
||||
return;
|
||||
{在结果页面中打印:
|
||||
123456
|
||||
789}
|
||||
```
|
||||
|
||||
#### CGI变量以及环境相关函数
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -105,140 +105,52 @@ tsl --buildexe=TSLDemo01.tsl --output=test01.exe
|
|||
|
||||
Windows命令集
|
||||
|
||||
<table><tbody><tr><td>
|
||||
命令</td><td>
|
||||
功能说明</td><td>
|
||||
备注</td></tr><tr><td>
|
||||
tsl.exe /?</td><td>
|
||||
查看命令列表帮助,或TSL /?</td><td>
|
||||
注意/前有一个空格</td></tr><tr><td>
|
||||
-COMPILE|-COMPILEC [/S] [-S] tslfiename</td><td>
|
||||
将tsl/tsf文件编译为二进制格式文件。
|
||||
-COMPILE命令生成的文件后缀为.TSB
|
||||
- COMPILEC命令生成的文件后缀为.TSC
|
||||
可选项
|
||||
/S:递归模式,即加上该可选命令后,会从子目录中查找该函数。默认只在当前目录下查找。
|
||||
-S:安静模式,不打印执行结果的信息</td><td>
|
||||
默认生成的文件与原文件同目录,如:
|
||||
Tsl -COMPILE TsfDemo01.tsf
|
||||
作用:编译成二进制文件后,函数与脚本照样可以正常调用,可以用于隐藏源代码。</td></tr><tr><td>
|
||||
编译指令</td><td></td><td></td></tr><tr><td>
|
||||
--buildexe=tslfilename</td><td>
|
||||
将指定tsl文件编译成可执行(.exe)文件,默认生成文件名为default.exe,可执行文件默认图标为tsl编译器图标</td><td>
|
||||
</td></tr><tr><td>
|
||||
其可选项</td><td>
|
||||
-buildgui
|
||||
指定编译的可执行文件为Windows UI应用程序</td><td>
|
||||
默认为控制台应用程序</td></tr><tr><td>
|
||||
</td><td>
|
||||
--buildico=xxx.ico
|
||||
指定可执行文件的图标</td><td>
|
||||
默认为TSL.exe的图标</td></tr><tr><td>
|
||||
--buildlib=tsl(tsf)filename</td><td>
|
||||
将指定tsl/tsf文件编译成动态库(.dll)文件</td><td>
|
||||
默认生成文件名为default.dll</td></tr><tr><td>
|
||||
其可选项</td><td>
|
||||
--exports=func1[:exp1][,…]
|
||||
将指定函数名输出在动态库中</td><td>
|
||||
指定多个函数用逗号分割</td></tr><tr><td>
|
||||
--build=tslfilename</td><td>
|
||||
将指定tsl文件编译成.tsg包文件,默认生成文件名为default.tsg</td><td>
|
||||
可以通过函数获取包中资源内容rs:
|
||||
getglobalcache("@@tsl-resource@@",rs)</td></tr><tr><td>
|
||||
编译指令的可选项</td><td>
|
||||
--buildexe|--buildlib|--build通用的可选项</td><td></td></tr><tr><td>
|
||||
--output=filename</td><td>
|
||||
给输出目标指定文件路径与名称</td><td>
|
||||
默认为
|
||||
default.exe|default.dll|default.tsg
|
||||
默认生成在当前路径下</td></tr><tr><td>
|
||||
-strong</td><td>
|
||||
编译所有引用,将所有依赖的引用都进行编译
|
||||
缺省为仅编译调用的</td><td>
|
||||
解决调用了某些动态库不能被检测到的函数。</td></tr><tr><td>
|
||||
--depends=fun1,fun2,…</td><td>
|
||||
指定额外需要编译的函数列表</td><td>
|
||||
多个函数或路径用,分隔</td></tr><tr><td>
|
||||
--dependsdir=dir1,dir2,…</td><td>
|
||||
指定额外需要编译的函数路径</td><td>
|
||||
</td></tr><tr><td>
|
||||
--excludes=fun1,fun2,…</td><td>
|
||||
不编译某些函数</td><td>
|
||||
</td></tr><tr><td>
|
||||
--resourcedir=foldername</td><td>
|
||||
指定编译资源文件目录</td><td>
|
||||
</td></tr><tr><td>
|
||||
--resourcepat=pat1,pat2,…</td><td>
|
||||
指定资源文件的匹配串</td><td>
|
||||
需要搭配--resourcedir=一起使用</td></tr><tr><td>
|
||||
-resourcekeepdir</td><td>
|
||||
资源名保留相对路径</td><td>
|
||||
</td></tr><tr><td>
|
||||
--extresource=filename1
|
||||
[:keyname1],filename2…</td><td>
|
||||
指定额外的资源</td><td>
|
||||
</td></tr><tr><td>
|
||||
运行指令</td><td></td><td></td></tr><tr><td>
|
||||
--runpkg=packagename</td><td>
|
||||
执行包文件</td><td>
|
||||
如:tsl --runpkg=runpkg.tsg</td></tr><tr><td>
|
||||
-eval tslstring</td><td>
|
||||
执行TSL脚本串</td><td>
|
||||
如:tsl -eval “inttostr(100)”</td></tr><tr><td>
|
||||
tslfilename</td><td>
|
||||
执行TSL脚本文件</td><td>
|
||||
如:tsl test.tsl</td></tr><tr><td>
|
||||
其可选项</td><td>
|
||||
-LIBPATH </td><td>
|
||||
扩展函数查找路径</td></tr><tr><td>
|
||||
</td><td>
|
||||
-TESTMULTITHREAD N</td><td>
|
||||
线程调用,N为线程数</td></tr><tr><td>
|
||||
</td><td>
|
||||
-NODEBUGSERVER</td><td>
|
||||
不启用调试服务器</td></tr><tr><td>
|
||||
</td><td>
|
||||
-DEBUGSERVER</td><td>
|
||||
开启调试服务器</td></tr><tr><td>
|
||||
</td><td>
|
||||
-DEBUGPORT port</td><td>
|
||||
指定调试监听端口</td></tr><tr><td>
|
||||
</td><td>
|
||||
-DEBUGLISTEN ip</td><td>
|
||||
指定调试监听地址</td></tr><tr><td>
|
||||
</td><td>
|
||||
-DEBUGTHREADS N</td><td>
|
||||
指定调试用于网络通信的线程数</td></tr><tr><td>
|
||||
</td><td>
|
||||
-WAITATTACH</td><td>
|
||||
运行时等待调试程序连接</td></tr><tr><td>
|
||||
</td><td>
|
||||
-DEBUGLOGIN 1|0</td><td>
|
||||
是否需要进行用户登陆</td></tr><tr><td>
|
||||
</td><td>
|
||||
--data-dir=datapath</td><td>
|
||||
使用指定文件夹中的配置文件</td></tr><tr><td>
|
||||
</td><td>
|
||||
--pkg=pgk1,pkg2…</td><td>
|
||||
加载指定包中的函数</td></tr><tr><td>
|
||||
其它指令</td><td></td><td></td></tr><tr><td>
|
||||
-ENCODE configstring</td><td>
|
||||
生成加密串</td><td>
|
||||
用于数据库配置串加密</td></tr><tr><td>
|
||||
-ENCODEDEBUGPASS</td><td>
|
||||
生成密码串的加密串</td><td>
|
||||
用于远程调试配置中密码的加密</td></tr></tbody></table>
|
||||
| 命令 | 功能说明 | 备注 |
|
||||
| --- | --- | --- |
|
||||
| tsl.exe /? | 查看命令列表帮助,或TSL /? | 注意/前有一个空格 |
|
||||
| -COMPILE\|-COMPILEC [/S] [-S] tslfiename | 将tsl/tsf文件编译为二进制格式文件。<br>-COMPILE命令生成的文件后缀为.TSB<br>- COMPILEC命令生成的文件后缀为.TSC<br>可选项<br>/S:递归模式,即加上该可选命令后,会从子目录中查找该函数。默认只在当前目录下查找。<br>-S:安静模式,不打印执行结果的信息 | 默认生成的文件与原文件同目录,如:<br>Tsl -COMPILE TsfDemo01.tsf<br>作用:编译成二进制文件后,函数与脚本照样可以正常调用,可以用于隐藏源代码。 |
|
||||
| 编译指令 | | |
|
||||
| --buildexe=tslfilename | 将指定tsl文件编译成可执行(.exe)文件,默认生成文件名为default.exe,可执行文件默认图标为tsl编译器图标 | |
|
||||
| 其可选项 | -buildgui<br>指定编译的可执行文件为Windows UI应用程序 | 默认为控制台应用程序 |
|
||||
| | --buildico=xxx.ico<br>指定可执行文件的图标 | 默认为TSL.exe的图标 |
|
||||
| --buildlib=tsl(tsf)filename | 将指定tsl/tsf文件编译成动态库(.dll)文件 | 默认生成文件名为default.dll |
|
||||
| 其可选项 | `--exports=func1[:exp1][,…]`<br>将指定函数名输出在动态库中 | 指定多个函数用逗号分割 |
|
||||
| --build=tslfilename | 将指定tsl文件编译成.tsg包文件,默认生成文件名为default.tsg | 可以通过函数获取包中资源内容rs:<br>getglobalcache("@@tsl-resource@@",rs) |
|
||||
| 编译指令的可选项 | --buildexe\|--buildlib\|--build通用的可选项 | |
|
||||
| --output=filename | 给输出目标指定文件路径与名称 | 默认为<br>default.exe\|default.dll\|default.tsg<br>默认生成在当前路径下 |
|
||||
| -strong | 编译所有引用,将所有依赖的引用都进行编译<br>缺省为仅编译调用的 | 解决调用了某些动态库不能被检测到的函数。 |
|
||||
| --depends=fun1,fun2,… | 指定额外需要编译的函数列表 | 多个函数或路径用,分隔 |
|
||||
| --dependsdir=dir1,dir2,… | 指定额外需要编译的函数路径 | |
|
||||
| --excludes=fun1,fun2,… | 不编译某些函数 | |
|
||||
| --resourcedir=foldername | 指定编译资源文件目录 | |
|
||||
| --resourcepat=pat1,pat2,… | 指定资源文件的匹配串 | 需要搭配--resourcedir=一起使用 |
|
||||
| -resourcekeepdir | 资源名保留相对路径 | |
|
||||
| --extresource=filename1<br>[:keyname1],filename2… | 指定额外的资源 | |
|
||||
| 运行指令 | | |
|
||||
| --runpkg=packagename | 执行包文件 | 如:tsl --runpkg=runpkg.tsg |
|
||||
| -eval tslstring | 执行TSL脚本串 | 如:tsl -eval “inttostr(100)” |
|
||||
| tslfilename | 执行TSL脚本文件 | 如:tsl test.tsl |
|
||||
| 其可选项 | -LIBPATH | 扩展函数查找路径 |
|
||||
| | -TESTMULTITHREAD N | 线程调用,N为线程数 |
|
||||
| | -NODEBUGSERVER | 不启用调试服务器 |
|
||||
| | -DEBUGSERVER | 开启调试服务器 |
|
||||
| | -DEBUGPORT port | 指定调试监听端口 |
|
||||
| | -DEBUGLISTEN ip | 指定调试监听地址 |
|
||||
| | -DEBUGTHREADS N | 指定调试用于网络通信的线程数 |
|
||||
| | -WAITATTACH | 运行时等待调试程序连接 |
|
||||
| | -DEBUGLOGIN 1\|0 | 是否需要进行用户登陆 |
|
||||
| | --data-dir=datapath | 使用指定文件夹中的配置文件 |
|
||||
| | --pkg=pgk1,pkg2… | 加载指定包中的函数 |
|
||||
| 其它指令 | | |
|
||||
| -ENCODE configstring | 生成加密串 | 用于数据库配置串加密 |
|
||||
| -ENCODEDEBUGPASS | 生成密码串的加密串 | 用于远程调试配置中密码的加密 |
|
||||
|
||||
Linux命令集
|
||||
|
||||
<table><tbody><tr><td>
|
||||
命令</td><td>
|
||||
说明</td><td>
|
||||
备注</td></tr><tr><td>
|
||||
TSL /?</td><td>
|
||||
查看命令列表帮助</td><td>
|
||||
注意TSL后有一个空格</td></tr><tr><td>
|
||||
其它命令参考Windows命令集,注意大小写</td><td></td><td></td></tr></tbody></table>
|
||||
| 命令 | 说明 | 备注 |
|
||||
| --- | --- | --- |
|
||||
| TSL /? | 查看命令列表帮助 | 注意TSL后有一个空格 |
|
||||
| 其它命令参考Windows命令集,注意大小写 | | |
|
||||
|
||||
##### 命令集详细解析
|
||||
|
||||
|
|
@ -291,15 +203,10 @@ tsl -COMPILE C:\DoTSL\CompileToExe\TsfDemo01.tsf
|
|||
|
||||
如:被编译的文件TsfFuncB.tsf在C:\DoTSL\CompileToExe\AAA目录下,命令运行当前路径是在C:\DoTSL\CompileToExe\,执行以下操作进行对比:
|
||||
|
||||
<table><tbody><tr><td>
|
||||
执行命令</td><td>
|
||||
结果说明</td></tr><tr><td>
|
||||
默认情况下进行编译
|
||||
命令行:tsl -COMPILE TsfFuncB.tsf</td><td>
|
||||
执行结果:编译失败,找不到目标文件,原因是默认只在当前路径下查找。</td></tr><tr><td>
|
||||
在递归模式下进行编译
|
||||
命令行:tsl -COMPILE /S TsfFuncB.tsf</td><td>
|
||||
执行结果:编译成功,递归模式下,还会在当前目录下的子目录下进行查找。</td></tr></tbody></table>
|
||||
| 执行命令 | 结果说明 |
|
||||
| --- | --- |
|
||||
| 默认情况下进行编译<br>命令行:tsl -COMPILE TsfFuncB.tsf | 执行结果:编译失败,找不到目标文件,原因是默认只在当前路径下查找。 |
|
||||
| 在递归模式下进行编译<br>命令行:tsl -COMPILE /S TsfFuncB.tsf | 执行结果:编译成功,递归模式下,还会在当前目录下的子目录下进行查找。 |
|
||||
|
||||
执行具体表现如下:
|
||||
|
||||
|
|
@ -350,30 +257,19 @@ tsl -COMPILE C:\DoTSL\CompileToExe\TsfDemo01.tsf
|
|||
|
||||
以下是上述Test_GUIexe.tsl文件中的代码,仅供参考。执行下述案例中用到了界面tslvcl工具包。
|
||||
|
||||
```text
|
||||
```tsl
|
||||
uses tslvcl;
|
||||
|
||||
app := initializeapplication();
|
||||
|
||||
app.createform(class(tfm),fm);
|
||||
|
||||
app.createform(class(tfm), fm);
|
||||
fm.show();
|
||||
|
||||
app.run();
|
||||
|
||||
type tfm=class(TVCForm)
|
||||
|
||||
uses tslvcl;
|
||||
|
||||
function Create(AOwner);
|
||||
|
||||
begin
|
||||
|
||||
type tfm = class(TVCForm)
|
||||
uses tslvcl;
|
||||
function Create(AOwner);
|
||||
begin
|
||||
inherited;
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
end;
|
||||
end;
|
||||
```
|
||||
|
||||
####### 可选项:--buildico= 指定图标
|
||||
|
|
@ -488,55 +384,34 @@ ExePath
|
|||
|
||||
其中,TestDemo01.tsl?的源代码如下:
|
||||
|
||||
```text
|
||||
```tsl
|
||||
uses TSLUnitDemo01;
|
||||
|
||||
a:=10;
|
||||
|
||||
t:=FuncA(a);
|
||||
|
||||
echo "TSLUnitDemo01.FuncA",t;
|
||||
|
||||
sleep(10*1000);
|
||||
|
||||
a := 10;
|
||||
t := FuncA(a);
|
||||
echo "TSLUnitDemo01.FuncA", t;
|
||||
sleep(10 * 1000);
|
||||
return t;
|
||||
```
|
||||
|
||||
TSLUnitDemo01单元的源代码如下:
|
||||
|
||||
```text
|
||||
Unit TSLUnitDemo01;
|
||||
|
||||
Interface
|
||||
|
||||
```tsl
|
||||
unit TSLUnitDemo01;
|
||||
interface
|
||||
function FuncA(a);
|
||||
|
||||
function FuncB(a);
|
||||
|
||||
Implementation
|
||||
|
||||
implementation
|
||||
function FuncA(a);
|
||||
|
||||
begin
|
||||
|
||||
return a+20;
|
||||
|
||||
return a + 20;
|
||||
end;
|
||||
|
||||
function FuncB(a);
|
||||
|
||||
begin
|
||||
|
||||
a:=TD_Test(a);
|
||||
|
||||
return a*a;
|
||||
|
||||
a := TD_Test(a);
|
||||
return a * a;
|
||||
end;
|
||||
|
||||
Initialization
|
||||
|
||||
FuncA(2);
|
||||
|
||||
FuncA(2);
|
||||
Finalizationend.
|
||||
```
|
||||
|
||||
|
|
@ -613,17 +488,12 @@ Finalizationend.
|
|||
|
||||
Test_resourcepat.tsl中代码如下:
|
||||
|
||||
```text
|
||||
```tsl
|
||||
echo "\r\n";
|
||||
|
||||
echo "Running!!\r\n";
|
||||
|
||||
getglobalcache("@@tsl-resource@@",rs);//获取可执行文件中的所有资源文件信息
|
||||
|
||||
getglobalcache("@@tsl-resource@@", rs); // 获取可执行文件中的所有资源文件信息
|
||||
echo tostn(rs);
|
||||
|
||||
sleep(20 * 1000);
|
||||
|
||||
return 1;
|
||||
```
|
||||
|
||||
|
|
@ -671,17 +541,12 @@ return 1;
|
|||
|
||||
其中Test01_TD.tsl?的源程序如下:
|
||||
|
||||
```text
|
||||
```tsl
|
||||
echo "\r\n";
|
||||
|
||||
echo "Running!!\r\n";
|
||||
|
||||
getglobalcache("@@tsl-resource@@",rs);//获取包中的资源文件信息
|
||||
|
||||
getglobalcache("@@tsl-resource@@", rs); // 获取包中的资源文件信息
|
||||
echo tostn(rs);
|
||||
|
||||
sleep(20 * 1000);
|
||||
|
||||
return 1;
|
||||
```
|
||||
|
||||
|
|
@ -699,11 +564,9 @@ return 1;
|
|||
|
||||
其中,包中目标文件的的源代码如下:
|
||||
|
||||
```text
|
||||
content:="test_runpkg";
|
||||
|
||||
writefile(rwraw(),"","D:\\test\\tslCmdTest\\runpkg\\test_runpkg.txt",0,1000,content);
|
||||
|
||||
```tsl
|
||||
content := "test_runpkg";
|
||||
writefile(rwraw(), "", "D:\\test\\tslCmdTest\\runpkg\\test_runpkg.txt", 0, 1000, content);
|
||||
return 1;
|
||||
```
|
||||
|
||||
|
|
@ -727,70 +590,45 @@ return 1;
|
|||
|
||||
包main.tsg对应的TSL代码如下:
|
||||
|
||||
```text
|
||||
echo evalData(0);
|
||||
|
||||
function evalData(n)
|
||||
|
||||
begin
|
||||
|
||||
```tsl
|
||||
echo evalData(0);
|
||||
function evalData(n)
|
||||
begin
|
||||
data := data();
|
||||
|
||||
ret :=
|
||||
|
||||
ret :=
|
||||
case n of
|
||||
|
||||
0:SumVol(data);
|
||||
|
||||
1:AvgVol(data);
|
||||
|
||||
2:SumAmount(data);
|
||||
|
||||
3:AvgAmount(data);
|
||||
|
||||
0:SumVol(data);
|
||||
1:AvgVol(data);
|
||||
2:SumAmount(data);
|
||||
3:AvgAmount(data);
|
||||
end;
|
||||
|
||||
return ret;
|
||||
|
||||
end
|
||||
end;
|
||||
```
|
||||
|
||||
包data.tsg对应的TSL代码如下:
|
||||
|
||||
```text
|
||||
```tsl
|
||||
function data()
|
||||
|
||||
begin
|
||||
|
||||
return array(
|
||||
|
||||
("StockID":"SZ000002","收盘价":7.79,"成交量":189366181.0,"成交金额":1482908609.8),
|
||||
|
||||
("StockID":"SZ000002","收盘价":7.64,"成交量":145843421.0,"成交金额":1110094218.41),
|
||||
|
||||
("StockID":"SZ000002","收盘价":7.53,"成交量":136469106.0,"成交金额":1027113710.84),
|
||||
|
||||
("StockID":"SZ000002","收盘价":7.77,"成交量":211713302.0,"成交金额":1624520449.34),
|
||||
|
||||
("StockID":"SZ000002","收盘价":7.53,"成交量":159372804.0,"成交金额":1205270122.69),
|
||||
|
||||
("StockID":"SZ000002","收盘价":7.48,"成交量":97780993.0,"成交金额":732008884.19)
|
||||
|
||||
);
|
||||
|
||||
end
|
||||
return array(
|
||||
("StockID":"SZ000002", "收盘价":7.79, "成交量":189366181.0, "成交金额":1482908609.8),
|
||||
("StockID":"SZ000002", "收盘价":7.64, "成交量":145843421.0, "成交金额":1110094218.41),
|
||||
("StockID":"SZ000002", "收盘价":7.53, "成交量":136469106.0, "成交金额":1027113710.84),
|
||||
("StockID":"SZ000002", "收盘价":7.77, "成交量":211713302.0, "成交金额":1624520449.34),
|
||||
("StockID":"SZ000002", "收盘价":7.53, "成交量":159372804.0, "成交金额":1205270122.69),
|
||||
("StockID":"SZ000002", "收盘价":7.48, "成交量":97780993.0, "成交金额":732008884.19)
|
||||
);
|
||||
end;
|
||||
```
|
||||
|
||||
包SumVol.tsg对应的TSL代码如下:
|
||||
|
||||
```text
|
||||
```tsl
|
||||
function SumVol(data)
|
||||
|
||||
begin
|
||||
|
||||
return sum(data[:,"成交量"]);
|
||||
|
||||
end
|
||||
return sum(data[:, "成交量"]);
|
||||
end;
|
||||
```
|
||||
|
||||
###### 生成加密串
|
||||
|
|
@ -910,15 +748,12 @@ TsfFuncA函数的路径如下:
|
|||
|
||||
范例01:查找函数的依赖关系
|
||||
|
||||
```text
|
||||
obj:=Findfunction("stockzf");
|
||||
|
||||
v:=SysGetFuncdepends(obj,2+4+8,v1,v2);
|
||||
|
||||
return array("依赖的函数信息":v,"二进制函数信息":v1,"二进制类信息":v2);
|
||||
```tsl
|
||||
obj := Findfunction("stockzf");
|
||||
v := SysGetFuncdepends(obj, 2 + 4 + 8, v1, v2);
|
||||
return array("依赖的函数信息":v, "二进制函数信息":v1, "二进制类信息":v2);
|
||||
```
|
||||
|
||||
返回结果:
|
||||
|
||||
其中,依赖的函数信息结果截图如下:
|
||||
|
||||
|
|
@ -926,12 +761,10 @@ return array("依赖的函数信息":v,"二进制函数信息":v1,"二进制类
|
|||
|
||||
范例02:查找类相关函数的依赖关系
|
||||
|
||||
```text
|
||||
obj:=Findfunction("getPYStringList");
|
||||
|
||||
v:=SysGetFuncdepends(obj,2+4+8,v1,v2);
|
||||
|
||||
return array("依赖的函数信息":v,"二进制函数信息":v1,"二进制类信息":v2);
|
||||
```tsl
|
||||
obj := Findfunction("getPYStringList");
|
||||
v := SysGetFuncdepends(obj, 2 + 4 + 8, v1, v2);
|
||||
return array("依赖的函数信息":v, "二进制函数信息":v1, "二进制类信息":v2);
|
||||
```
|
||||
|
||||
其中,函数getPYStringList调用了天软内置类THashedStringList。
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -18,23 +18,19 @@
|
|||
|
||||
##### 介绍
|
||||
|
||||
TSL可用于Web开发,下面是一个简单的示例
|
||||
TSL 可用于 Web 开发,下面是一个简单示例:
|
||||
|
||||
```text
|
||||
<?tslx>
|
||||
|
||||
<HTML>
|
||||
|
||||
<Title>TSL Web Page</Title>
|
||||
|
||||
<Body>
|
||||
|
||||
<html>
|
||||
<title>TSL Web Page</title>
|
||||
<body>
|
||||
<?tsl
|
||||
|
||||
writeln("First Tsl Web page");
|
||||
|
||||
>
|
||||
|
||||
</Body>
|
||||
WriteLn("First TSL Web page");
|
||||
?>
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
与 PHP类似, TSL代码被嵌入HTML代码中做一些事情,
|
||||
|
||||
|
|
@ -81,41 +77,42 @@ Apache 2.2与其2.0版本做了比较大的修改,所以TSL取消了模块对2
|
|||
|
||||
####### Apache 2.2 Module模式:
|
||||
|
||||
在httpd.conf中加入:
|
||||
在 httpd.conf 中加入:
|
||||
|
||||
LoadModule tsl_module C:/Tinysoft/tsl/MOD_TSL2.dll
|
||||
|
||||
AddType tslscript-handler .tsl
|
||||
|
||||
AddHandler tslscript-handler .tsl
|
||||
```text
|
||||
LoadModule tsl_module C:/Tinysoft/tsl/MOD_TSL2.dll
|
||||
AddType tslscript-handler .tsl
|
||||
AddHandler tslscript-handler .tsl
|
||||
```
|
||||
|
||||
####### Apache 2.X CGI模式:
|
||||
|
||||
在httpd.conf中加入:
|
||||
在 httpd.conf 中加入:
|
||||
|
||||
```text
|
||||
<Directory "C:/Tinysoft/tsl">
|
||||
|
||||
AllowOverride None
|
||||
|
||||
Options None
|
||||
|
||||
Order allow,deny
|
||||
|
||||
Allow from all
|
||||
|
||||
</Directory>
|
||||
|
||||
AddHandler tslscript-handler .tsl
|
||||
AddHandler tslscript-handler .tsl
|
||||
ScriptAlias /tsl/ "c:/Tinysoft/tsl/"
|
||||
Action tslscript-handler "/tsl/TSLCgi.exe"
|
||||
```
|
||||
|
||||
ScriptAlias /tsl/ "c:/Tinysoft/tsl/"
|
||||
或者:
|
||||
|
||||
Action tslscript-handler "/tsl/TSLCgi.exe"
|
||||
```text
|
||||
AddHandler cgi-script .tsl
|
||||
```
|
||||
|
||||
或者在httpd.conf中加入:
|
||||
并在 `.tsl` 第一行加入:
|
||||
|
||||
AddHandler cgi-script .tsl
|
||||
|
||||
并且在.tsl的第一行加入#!C:/Tinysoft/tsl/tslCgi.exe
|
||||
```text
|
||||
#!C:/Tinysoft/tsl/tslCgi.exe
|
||||
```
|
||||
|
||||
###### Apache 1.x
|
||||
|
||||
|
|
@ -127,69 +124,66 @@ Apache 2.2与其2.0版本做了比较大的修改,所以TSL取消了模块对2
|
|||
|
||||
####### Apache 1.x Module模式:
|
||||
|
||||
在httpd.conf中加入:
|
||||
在 httpd.conf 中加入:
|
||||
|
||||
LoadModule tsl_module C:/tsl/mod_tsl1.dll
|
||||
|
||||
AddModule mod_tsl.c
|
||||
|
||||
AddType application/tslscript .tsl
|
||||
|
||||
AddHandler tslscript-handler .tsl
|
||||
```text
|
||||
LoadModule tsl_module C:/tsl/mod_tsl1.dll
|
||||
AddModule mod_tsl.c
|
||||
AddType application/tslscript .tsl
|
||||
AddHandler tslscript-handler .tsl
|
||||
```
|
||||
|
||||
####### Apache 1.x CGI模式:
|
||||
|
||||
在httpd.conf中加入:
|
||||
在 httpd.conf 中加入:
|
||||
|
||||
```text
|
||||
<Directory "C:/Tinysoft/tsl">
|
||||
|
||||
AllowOverride None
|
||||
|
||||
Options None
|
||||
|
||||
Order allow,deny
|
||||
|
||||
Allow from all
|
||||
|
||||
</Directory>
|
||||
|
||||
ScriptAlias /tsl/ "c:/Tinysoft/tsl/"
|
||||
ScriptAlias /tsl/ "c:/Tinysoft/tsl/"
|
||||
AddHandler application/tslcgi .tsl
|
||||
Action application/tslcgi "/tsl/tslcgi.exe"
|
||||
```
|
||||
|
||||
AddHandler application/tslcgi .tsl
|
||||
或者:
|
||||
|
||||
Action application/tslcgi "/tsl/tslcgi.exe"
|
||||
```text
|
||||
AddHandler cgi-script .tsl
|
||||
```
|
||||
|
||||
或者在httpd.conf中加入:
|
||||
并在 `.tsl` 第一行加入:
|
||||
|
||||
AddHandler cgi-script .tsl
|
||||
|
||||
并且在.tsl的第一行加入#!C:/Tinysoft/tsl/tslCgi.exe
|
||||
```text
|
||||
#!C:/Tinysoft/tsl/tslCgi.exe
|
||||
```
|
||||
|
||||
##### 程序结构
|
||||
|
||||
与PHP不同TSL脚本默认是程序,而非HTML文本。
|
||||
与 PHP 不同,TSL 脚本默认是程序而非 HTML 文本。
|
||||
|
||||
下面的脚本会直接执行
|
||||
下面的脚本会直接执行:
|
||||
|
||||
s:="this is a tsl script";
|
||||
```tsl
|
||||
message := "this is a tsl script";
|
||||
WriteLn(message);
|
||||
```
|
||||
|
||||
writeln(s);
|
||||
若要输出完整 HTML 结构,可显式输出:
|
||||
|
||||
如果要输出完整的HTML结构,需要编写下面的代码
|
||||
|
||||
write("
|
||||
|
||||
<HTML>
|
||||
|
||||
<Body>
|
||||
|
||||
<p>TSL Script</p>
|
||||
|
||||
</Body>
|
||||
|
||||
</HTML>
|
||||
|
||||
");
|
||||
```tsl
|
||||
Write(
|
||||
"<html>\n" +
|
||||
"<body>\n" +
|
||||
"<p>TSL Script</p>\n" +
|
||||
"</body>\n" +
|
||||
"</html>\n"
|
||||
);
|
||||
```
|
||||
|
||||
###### 内容
|
||||
- <?tslx> 标记
|
||||
|
|
@ -199,103 +193,84 @@ write("
|
|||
|
||||
###### <?tslx> 标记
|
||||
|
||||
标记下面文字是HTML代码,代码将会原文输出到网页上.直到出现<?tsl ,
|
||||
标记后续文本为 HTML 代码,原文输出到网页上,直到出现 `<?tsl`。
|
||||
|
||||
上面的代码可以使用这种标记方式:
|
||||
|
||||
```text
|
||||
<?tslx>
|
||||
|
||||
<HTML>
|
||||
|
||||
<Body>
|
||||
|
||||
<html>
|
||||
<body>
|
||||
<p>TSL Script</p>
|
||||
|
||||
</Body>
|
||||
|
||||
</HTML>
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
###### <?tsl … ?>块
|
||||
|
||||
```text
|
||||
<?tsl
|
||||
|
||||
//这里可以写TSL代码…
|
||||
|
||||
>
|
||||
这里可以写 TSL 代码…
|
||||
?>
|
||||
```
|
||||
|
||||
当代码应用了<?tslx>标记后,以后的代码都被解析成文本,如果仍然需要在<?tslx>后执行TSL代码,就需要把代码写在<?tsl和 ?>中间。标识符和代码可以写在一行或多行,如果写在一行,<?tsl和代码必须用空格分开。代码中可以出现多次<?tsl … ?>块。但是不能嵌套。
|
||||
|
||||
上面的代码可以写成:
|
||||
|
||||
```text
|
||||
<?tslx>
|
||||
|
||||
<HTML>
|
||||
|
||||
<Body>
|
||||
|
||||
<html>
|
||||
<body>
|
||||
<p>
|
||||
|
||||
<?tsl write("TSL Script");?>
|
||||
|
||||
<?tsl Write("TSL Script");?>
|
||||
</p>
|
||||
|
||||
</Body>
|
||||
|
||||
</HTML>
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
###### <?= ?>块
|
||||
|
||||
在<?tslx>环境下,可以使用<?= ?>来简化输出,输出的模式为:
|
||||
在 `<?tslx>` 环境下,可以使用 `<?= ?>` 简化输出,模式为:
|
||||
|
||||
<?=<p1>[,p2..pn]?>
|
||||
```text
|
||||
<?= <p1>[, p2 .. pn] ?>
|
||||
```
|
||||
|
||||
例如要输出当前时间:
|
||||
|
||||
<?="现在是:",DateTimeToStr(Now())?>
|
||||
```text
|
||||
<?="现在是:", DateTimeToStr(Now())?>
|
||||
```
|
||||
|
||||
##### 输出
|
||||
|
||||
TSL使用Write()和Writeln()2个函数把内容输出到网页中。
|
||||
TSL 使用 `Write()`/`WriteLn()` 输出内容,格式为 `Write(p1, p2, ..., pn)`。
|
||||
`WriteLn()` 会追加换行,但浏览器可能忽略连续空白。
|
||||
|
||||
格式为 Write(p1,p2,…,pn);
|
||||
|
||||
把参数p1、p2、…、pn连接起来输出.
|
||||
|
||||
Writeln()和write的参数一样,同时输出回车和换行。但是浏览器解释HTML有时会忽略换行回车,把连在一起的空白字符解析成一个空格,这一点需要注意。
|
||||
|
||||
TSL还可以使用echo操作符号输出内容,使用的效果和write相同,但是:
|
||||
|
||||
格式为Echo <p1>[,p2…pn]
|
||||
|
||||
此外,在<?TSLX>块中还可以采用<?=<p1>[,p2..pn] ?>的模式来输出。
|
||||
TSL 也支持 `echo` 操作符:`echo <p1>[, p2 .. pn]`。
|
||||
在 `<?tslx>` 块中还可使用 `<?= <p1>[, p2 .. pn] ?>` 简化输出。
|
||||
|
||||
##### HTML表单处理
|
||||
|
||||
当一个表单体交给 TSL 脚本时,表单中的信息会自动在脚本中可用。TSL可以轻松的访问这些信息,例如下面的表单:
|
||||
|
||||
```text
|
||||
<form action="foo.tsl" method="POST">
|
||||
|
||||
Name: <input type="text" name="username"><br />
|
||||
|
||||
Email: <input type="text" name="email"><br />
|
||||
|
||||
<input type="submit" name="submit" value="Submit me!" />
|
||||
|
||||
Name: <input type="text" name="username"><br />
|
||||
Email: <input type="text" name="email"><br />
|
||||
<input type="submit" name="submit" value="Submit me!" />
|
||||
</form>
|
||||
```
|
||||
|
||||
Tsl可以提取上面表单的数据,方法是使用
|
||||
|
||||
HttpGetQueryValueByName(Name:String):String
|
||||
TSL 可以通过 `HttpGetQueryValueByName(name: string): string` 取表单字段。
|
||||
|
||||
示例:
|
||||
|
||||
<?tsl
|
||||
|
||||
write("Name:",HttpGetQueryValueByName("name"),"<br>");
|
||||
|
||||
write("Email:",HttpGetQueryValueByName("email"));
|
||||
|
||||
>
|
||||
```tsl
|
||||
Write("Name:", HttpGetQueryValueByName("name"), "<br>");
|
||||
Write("Email:", HttpGetQueryValueByName("email"));
|
||||
```
|
||||
|
||||
为了使用简单,TSL使用HttpGetQueryValueByName方法,也可以提取get表单数据,和
|
||||
|
||||
|
|
@ -303,7 +278,9 @@ Query_String 方式(URL中在之后的信息)的数据。
|
|||
|
||||
示例:
|
||||
|
||||
```text
|
||||
http://www.webiste.com/foo.tsl?name=jack&email=jack@abc.com
|
||||
```
|
||||
|
||||
可以用上面的方式提取数据
|
||||
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -10,40 +10,29 @@
|
|||
|
||||
范例
|
||||
|
||||
```text
|
||||
```tsl
|
||||
// "MA110C2375"在20210322日的开仓手续费额
|
||||
|
||||
|
||||
SetSysParam(PN_Date(),20210322T);
|
||||
|
||||
|
||||
return GetDataByMd("MA110C2375.SP",1);
|
||||
|
||||
//结果:0.5
|
||||
SetSysParam(PN_Date(), 20210322T);
|
||||
return GetDataByMd("MA110C2375.SP", 1);
|
||||
// 结果:0.5
|
||||
```
|
||||
|
||||
##### GetDataByMd2
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
```tsl
|
||||
// "MA110C2375"在20210322日的开仓手续费额
|
||||
|
||||
|
||||
SetSysParam(PN_Date(),20210322T);
|
||||
|
||||
|
||||
return GetDataByMd2("MA110C2375.SP",1);
|
||||
|
||||
//结果:0.5
|
||||
SetSysParam(PN_Date(), 20210322T);
|
||||
return GetDataByMd2("MA110C2375.SP", 1);
|
||||
// 结果:0.5
|
||||
```
|
||||
|
||||
##### StockIndustryLowerArr
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
```tsl
|
||||
// 在20201207的申万一级行业列表
|
||||
|
||||
return StockIndustryLowerArr("SWHY110000",20201207T);
|
||||
return StockIndustryLowerArr("SWHY110000", 20201207T);
|
||||
```
|
||||
|
|
|
|||
|
|
@ -8,10 +8,8 @@
|
|||
|
||||
范例
|
||||
|
||||
```text
|
||||
data:=spec(FundNAWZFQk(20240308t,20240831t,cy_day(),0,0), "OF000001");
|
||||
|
||||
t := sselect ["净值收益率(%)"] from data end;
|
||||
|
||||
return Hurst(t);// 0.47
|
||||
```tsl
|
||||
data := spec(FundNAWZFQk(20240308t, 20240831t, cy_day(), 0, 0), "OF000001");
|
||||
t := sselect ["净值收益率(%)"] from data end;
|
||||
return Hurst(t); // 0.47
|
||||
```
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -15,101 +15,83 @@
|
|||
|
||||
###### ForExrateMidPrice
|
||||
|
||||
用途:汇率相关函数。
|
||||
参数:arg1(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
//2020年4月20日美元/人民币的中间价
|
||||
|
||||
SetSysParam(PN_Stock(),'FXUSDCNY');
|
||||
|
||||
return ForExrateMidPrice(20200420T);
|
||||
|
||||
//返回7.0657
|
||||
```tsl
|
||||
// 2020年4月20日美元/人民币的中间价
|
||||
SetSysParam(PN_Stock(), 'FXUSDCNY');
|
||||
return ForExrateMidPrice(20200420T);
|
||||
// 返回7.0657
|
||||
```
|
||||
|
||||
###### ForExrateMidPriceBegTEndT
|
||||
|
||||
用途:汇率相关函数。
|
||||
参数:arg1,arg2(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
//2020年4月20日到4月30日美元/人民币的中间价数据
|
||||
|
||||
SetSysParam(PN_Stock(),'FXUSDCNY');
|
||||
|
||||
begt:=20200420T;
|
||||
|
||||
endt:=20200430T;
|
||||
|
||||
return ForExrateMidPriceBegTEndT(begt,endt);
|
||||
```tsl
|
||||
// 2020年4月20日到4月30日美元/人民币的中间价数据
|
||||
SetSysParam(PN_Stock(), 'FXUSDCNY');
|
||||
begt := 20200420T;
|
||||
endt := 20200430T;
|
||||
return ForExrateMidPriceBegTEndT(begt, endt);
|
||||
```
|
||||
|
||||
//返回:
|
||||
|
||||
<table><tbody><tr><td>
|
||||
日期</td><td>
|
||||
代码</td><td>
|
||||
中间价</td></tr><tr><td>
|
||||
20200420</td><td>
|
||||
FXUSDCNY</td><td>
|
||||
7.0657</td></tr><tr><td>
|
||||
20200421</td><td>
|
||||
FXUSDCNY</td><td>
|
||||
7.0752</td></tr><tr><td>
|
||||
20200422</td><td>
|
||||
FXUSDCNY</td><td>
|
||||
7.0903</td></tr><tr><td>
|
||||
20200423</td><td>
|
||||
FXUSDCNY</td><td>
|
||||
7.0887</td></tr><tr><td>
|
||||
20200424</td><td>
|
||||
FXUSDCNY</td><td>
|
||||
7.0803</td></tr><tr><td>
|
||||
20200427</td><td>
|
||||
FXUSDCNY</td><td>
|
||||
7.0703</td></tr><tr><td>
|
||||
20200428</td><td>
|
||||
FXUSDCNY</td><td>
|
||||
7.071</td></tr><tr><td>
|
||||
20200429</td><td>
|
||||
FXUSDCNY</td><td>
|
||||
7.0704</td></tr><tr><td>
|
||||
20200430</td><td>
|
||||
FXUSDCNY</td><td>
|
||||
7.0571</td></tr></tbody></table>
|
||||
| 日期 | 代码 | 中间价 |
|
||||
| --- | --- | --- |
|
||||
| 20200420 | FXUSDCNY | 7.0657 |
|
||||
| 20200421 | FXUSDCNY | 7.0752 |
|
||||
| 20200422 | FXUSDCNY | 7.0903 |
|
||||
| 20200423 | FXUSDCNY | 7.0887 |
|
||||
| 20200424 | FXUSDCNY | 7.0803 |
|
||||
| 20200427 | FXUSDCNY | 7.0703 |
|
||||
| 20200428 | FXUSDCNY | 7.071 |
|
||||
| 20200429 | FXUSDCNY | 7.0704 |
|
||||
| 20200430 | FXUSDCNY | 7.0571 |
|
||||
|
||||
###### GetCurrencyCodeBySecurityCode
|
||||
|
||||
用途:汇率相关函数。
|
||||
参数:arg1(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
//港股长和00001对应的货币对代码
|
||||
|
||||
```tsl
|
||||
// 港股长和00001对应的货币对代码
|
||||
return GetCurrencyCodeBySecurityCode('HK00001');
|
||||
|
||||
//返回 HKD
|
||||
// 返回 HKD
|
||||
```
|
||||
|
||||
###### ForExRateZf
|
||||
|
||||
用途:汇率相关函数。
|
||||
参数:arg1,arg2(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
算法
|
||||
|
||||
(V2-V1)/V1
|
||||
|
||||
其中V2是货币对在endt的中间价,V1是begt(需要大于首个交易日,否则begt=首个交易日)的中间价。范例
|
||||
|
||||
```text
|
||||
//2020年4月20日到4月30日美元/人民币的收益率
|
||||
|
||||
SetSysParam(PN_Stock(),'FXUSDCNY');
|
||||
|
||||
|
||||
begt:=20200420T;
|
||||
|
||||
|
||||
endt:=20200430T;
|
||||
|
||||
|
||||
return ForExRateZf(BegT,EndT);
|
||||
|
||||
//返回 -0.20786786956644
|
||||
```tsl
|
||||
// 2020年4月20日到4月30日美元/人民币的收益率
|
||||
SetSysParam(PN_Stock(), 'FXUSDCNY');
|
||||
begt := 20200420T;
|
||||
endt := 20200430T;
|
||||
return ForExRateZf(BegT, EndT);
|
||||
// 返回 -0.20786786956644
|
||||
```
|
||||
|
|
|
|||
|
|
@ -19,28 +19,24 @@
|
|||
|
||||
####### GetTreeSumByClassPath
|
||||
|
||||
用途:进行数值统计计算。
|
||||
参数:arg1,arg2,arg3,arg4,arg5,arg6(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
Data:=array(
|
||||
|
||||
("名称":"风格收益(%)","取值":1.2,"分类路径":"总收益(%)"),
|
||||
|
||||
("名称":"Alpha(%)","取值":0.6,"分类路径":"总收益(%)\\选股Alpha(%)"),
|
||||
|
||||
("名称":"残差(%)","取值":0.2,"分类路径":"总收益(%)\\选股Alpha(%)"));
|
||||
|
||||
NodeName:="名称";
|
||||
|
||||
PathName:="分类路径";
|
||||
|
||||
SumName:="取值";
|
||||
|
||||
IfLever0:=0;
|
||||
|
||||
IfTreeID:=1;
|
||||
|
||||
return GetTreeSumByClassPath(Data,NodeName,PathName,SumName,IfLever0,IfTreeID);
|
||||
```tsl
|
||||
Data := array(
|
||||
("名称":"风格收益(%)", "取值":1.2, "分类路径":"总收益(%)"),
|
||||
("名称":"Alpha(%)", "取值":0.6, "分类路径":"总收益(%)\\选股Alpha(%)"),
|
||||
("名称":"残差(%)", "取值":0.2, "分类路径":"总收益(%)\\选股Alpha(%)"));
|
||||
NodeName := "名称";
|
||||
PathName := "分类路径";
|
||||
SumName := "取值";
|
||||
IfLever0 := 0;
|
||||
IfTreeID := 1;
|
||||
return GetTreeSumByClassPath(Data, NodeName, PathName, SumName, IfLever0, IfTreeID);
|
||||
```
|
||||
|
||||
##### 参数调整
|
||||
|
|
@ -51,20 +47,23 @@ Data:=array(
|
|||
|
||||
###### pmstand_array
|
||||
|
||||
用途:参数调整相关函数。
|
||||
参数:arg1(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
范例1
|
||||
|
||||
```text
|
||||
V:=2;
|
||||
|
||||
return pmstand_array(v);//array(2);
|
||||
```tsl
|
||||
V := 2;
|
||||
return pmstand_array(v); // array(2);
|
||||
```
|
||||
|
||||
范例2
|
||||
|
||||
```text
|
||||
V:="abc";
|
||||
|
||||
return pmstand_array(v);//array("abc");
|
||||
```tsl
|
||||
V := "abc";
|
||||
return pmstand_array(v); // array("abc");
|
||||
```
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -10,47 +10,17 @@
|
|||
|
||||
接口汇总:
|
||||
|
||||
<table><tbody><tr><td>
|
||||
所属分类</td><td>
|
||||
接口名称</td><td>
|
||||
说明</td><td>
|
||||
备注</td></tr><tr><td>
|
||||
总接口</td><td>
|
||||
<a href="http://www.tinysoft.com.cn/tsdn/helpdoc/SearchContent.tsl?KeyWord=Fastmap" target="_blank">fastmap</a></td><td>
|
||||
调用网格执行函数</td><td>
|
||||
</td></tr><tr><td>
|
||||
日志</td><td>
|
||||
<a href="http://www.tinysoft.com.cn/tsdn/helpdoc/SearchContent.tsl?KeyWord=GridLogo" target="_blank">gridLogo</a></td><td>
|
||||
网格写日志</td><td>
|
||||
</td></tr><tr><td>
|
||||
等分划分方式</td><td>
|
||||
<a href="http://www.tinysoft.com.cn/tsdn/helpdoc/SearchContent.tsl?KeyWord=SplitDiv" target="_blank">splitDiv</a></td><td>
|
||||
度等分划分</td><td>
|
||||
参数为度(int)</td></tr><tr><td>
|
||||
</td><td>
|
||||
<a href="http://www.tinysoft.com.cn/tsdn/helpdoc/SearchContent.tsl?KeyWord=SplitDiv2" target="_blank">splitDiv2</a></td><td>
|
||||
长度等分划分</td><td>
|
||||
</td></tr><tr><td>
|
||||
</td><td>
|
||||
<a href="http://www.tinysoft.com.cn/tsdn/helpdoc/SearchContent.tsl?KeyWord=DeleteTablebyReg" target="_blank">SplitArrayQK</a></td><td>
|
||||
数组等分划分</td><td>
|
||||
参数为数组(array)</td></tr><tr><td>
|
||||
</td><td>
|
||||
<a href="http://www.tinysoft.com.cn/tsdn/helpdoc/SearchContent.tsl?KeyWord=SplitArrayQK2" target="_blank">SplitArrayQK2</a></td><td>
|
||||
数组等分划分</td><td>
|
||||
</td></tr><tr><td>
|
||||
用户数据相关</td><td>
|
||||
<a href="http://www.tinysoft.com.cn/tsdn/helpdoc/SearchContent.tsl?KeyWord=DeleteTablebyReg" target="_blank">DeleteTablebyReg</a></td><td>
|
||||
批量删除用户数据</td><td>
|
||||
正则匹配</td></tr><tr><td>
|
||||
</td><td>
|
||||
<a href="http://www.tinysoft.com.cn/tsdn/helpdoc/SearchContent.tsl?KeyWord=GettablebyReg" target="_blank">GettablebyReg</a></td><td>
|
||||
获取用户数据</td><td>
|
||||
正则匹配</td></tr><tr><td>
|
||||
</td><td>
|
||||
<a href="http://www.tinysoft.com.cn/tsdn/helpdoc/SearchContent.tsl?KeyWord=TryInsetTable" target="_blank">TryInsetTable</a></td><td>
|
||||
添加用户数据</td><td>
|
||||
正则匹配</td></tr></tbody></table>
|
||||
| 所属分类 | 接口名称 | 说明 | 备注 |
|
||||
| --- | --- | --- | --- |
|
||||
| 总接口 | fastmap | 调用网格执行函数 | |
|
||||
| 日志 | gridLogo | 网格写日志 | |
|
||||
| 等分划分方式 | splitDiv | 度等分划分 | 参数为度(int) |
|
||||
| | splitDiv2 | 长度等分划分 | |
|
||||
| | SplitArrayQK | 数组等分划分 | 参数为数组(array) |
|
||||
| | SplitArrayQK2 | 数组等分划分 | |
|
||||
| 用户数据相关 | DeleteTablebyReg | 批量删除用户数据 | 正则匹配 |
|
||||
| | GettablebyReg | 获取用户数据 | 正则匹配 |
|
||||
| | TryInsetTable | 添加用户数据 | 正则匹配 |
|
||||
|
||||
网格使用经验:
|
||||
|
||||
|
|
@ -86,127 +56,67 @@ VS 0.4s
|
|||
|
||||
####### 提取50的5日涨幅
|
||||
|
||||
```text
|
||||
//**********************参数设置***********************//
|
||||
|
||||
N := 5;
|
||||
|
||||
endt := today();
|
||||
|
||||
stocks := getbk("上证50");
|
||||
|
||||
|
||||
//**********************网格模版*********************//
|
||||
|
||||
gridNo := 3; //网格个数,0:表示只使用本地服务器
|
||||
|
||||
func := FunctionName() + '.tsubbystocks'; //网格函数
|
||||
|
||||
parms := array(N,endt,stocks);
|
||||
|
||||
parmstype := array(0, 0, 1);
|
||||
|
||||
return unit(MultiProc_unit).fastmap(gridNo,func,parms,parmstype);
|
||||
|
||||
//***********************子函数**********************//
|
||||
|
||||
function tsubbystocks(N, endt,stocks);
|
||||
|
||||
```tsl
|
||||
// **********************参数设置***********************//
|
||||
N := 5;
|
||||
endt := today();
|
||||
stocks := getbk("上证50");
|
||||
// **********************网格模版*********************//
|
||||
gridNo := 3; // 网格个数,0:表示只使用本地服务器
|
||||
func := FunctionName() + '.tsubbystocks'; // 网格函数
|
||||
parms := array(N, endt, stocks);
|
||||
parmstype := array(0, 0, 1);
|
||||
return unit(MultiProc_unit).fastmap(gridNo, func, parms, parmstype);
|
||||
// ***********************子函数**********************//
|
||||
function tsubbystocks(N, endt, stocks);
|
||||
begin
|
||||
|
||||
sp_s(pn_date(),endt);
|
||||
|
||||
i := 0;
|
||||
|
||||
ret := array();
|
||||
|
||||
|
||||
for _,stk in stocks do
|
||||
|
||||
begin
|
||||
|
||||
sp_s(PN_Stock(),stk);
|
||||
|
||||
for j := 0 to N do
|
||||
|
||||
begin
|
||||
|
||||
ret[I,'截止日'] := ref(sp_time(),j);
|
||||
|
||||
ret[i,'代码'] := stk;
|
||||
|
||||
ret[i,'名称'] := stockname(stk);
|
||||
|
||||
ret[I,'涨幅(%)'] := ref(stockzf3(),j);
|
||||
|
||||
i++;
|
||||
|
||||
end
|
||||
|
||||
|
||||
end;
|
||||
|
||||
return ret;
|
||||
|
||||
sp_s(pn_date(), endt);
|
||||
i := 0;
|
||||
ret := array();
|
||||
for _, stk in stocks do
|
||||
begin
|
||||
sp_s(PN_Stock(), stk);
|
||||
for j := 0 to N do
|
||||
begin
|
||||
ret[I, '截止日'] := ref(sp_time(), j);
|
||||
ret[i, '代码'] := stk;
|
||||
ret[i, '名称'] := stockname(stk);
|
||||
ret[I, '涨幅(%)'] := ref(stockzf3(), j);
|
||||
i++;
|
||||
end;
|
||||
end;
|
||||
return ret;
|
||||
end;
|
||||
```
|
||||
|
||||
//返回
|
||||
返回
|
||||
|
||||
####### 提取50的历史涨幅矩阵
|
||||
|
||||
```text
|
||||
//**********************参数设置***********************//
|
||||
|
||||
N := 5;
|
||||
|
||||
endt := today();
|
||||
|
||||
stocks := getbk("上证50");
|
||||
|
||||
|
||||
//**********************网格模版*********************//
|
||||
|
||||
|
||||
//**********************网格模版*********************//
|
||||
|
||||
gridNo := 3; //网格个数,0:表示只使用本地服务器
|
||||
|
||||
func := FunctionName() + '.tsubbystock'; //网格函数
|
||||
|
||||
parms := array(N,endt,stocks);
|
||||
|
||||
parmstype := array(0, 0, 2);
|
||||
|
||||
return unit(MultiProc_unit).fastmap(gridNo,func,parms,parmstype);
|
||||
|
||||
|
||||
```tsl
|
||||
// **********************参数设置***********************//
|
||||
N := 5;
|
||||
endt := today();
|
||||
stocks := getbk("上证50");
|
||||
// **********************网格模版*********************//
|
||||
// **********************网格模版*********************//
|
||||
gridNo := 3; // 网格个数,0:表示只使用本地服务器
|
||||
func := FunctionName() + '.tsubbystock'; // 网格函数
|
||||
parms := array(N, endt, stocks);
|
||||
parmstype := array(0, 0, 2);
|
||||
return unit(MultiProc_unit).fastmap(gridNo, func, parms, parmstype);
|
||||
end;
|
||||
|
||||
function tsubbystock(N, endt,stock);
|
||||
|
||||
function tsubbystock(N, endt, stock);
|
||||
begin
|
||||
|
||||
sp_s(PN_Stock(),stock);
|
||||
|
||||
sp_s(pn_date(),endt);
|
||||
|
||||
ret := array(
|
||||
|
||||
"代码":stock,
|
||||
|
||||
"名称":stockname(stock),
|
||||
|
||||
"截止日":endt,
|
||||
|
||||
);
|
||||
|
||||
for i := 1 to N do
|
||||
|
||||
ret["T_" $ i] := ref(stockzf3(),i);
|
||||
|
||||
return ret;
|
||||
|
||||
sp_s(PN_Stock(), stock);
|
||||
sp_s(pn_date(), endt);
|
||||
ret := array(
|
||||
"代码":stock,
|
||||
"名称":stockname(stock),
|
||||
"截止日":endt,
|
||||
);
|
||||
for i := 1 to N do ret["T_"$ i] := ref(stockzf3(), i);
|
||||
return ret;
|
||||
end;
|
||||
```
|
||||
|
||||
|
|
@ -218,12 +128,16 @@ end;
|
|||
|
||||
####### GridLogo
|
||||
|
||||
用途:MultiProc_unit相关函数。
|
||||
参数:arg1(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
//在C:\\temp\\Gridlog默认路径下写日志文件
|
||||
|
||||
Return unit(MultiProc_unit).gridLogo('测试');
|
||||
```tsl
|
||||
// 在C:\\temp\\Gridlog默认路径下写日志文件
|
||||
return unit(MultiProc_unit).gridLogo('测试');
|
||||
```
|
||||
|
||||
###### 中间函数
|
||||
|
|
@ -242,60 +156,82 @@ Return unit(MultiProc_unit).gridLogo('测试');
|
|||
|
||||
范例
|
||||
|
||||
```text
|
||||
Return unit(MultiProc_unit).splitDiv(14,5); // array(0,2,4,6,8,14)
|
||||
```tsl
|
||||
return unit(MultiProc_unit).splitDiv(14, 5); // array(0,2,4,6,8,14)
|
||||
```
|
||||
|
||||
####### SplitDiv2
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
Return unit(MultiProc_unit).splitDiv2(14,5); // array(0,3,6,9,12,14)
|
||||
```tsl
|
||||
return unit(MultiProc_unit).splitDiv2(14, 5); // array(0,3,6,9,12,14)
|
||||
```
|
||||
|
||||
####### SplitArrayQK
|
||||
|
||||
用途:MultiProc_unit相关函数。
|
||||
参数:arg1,arg2(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
arr := array(2,1,3,4,9,5,7,8,9,10,11,12,13,15);
|
||||
|
||||
return unit(MultiProc_unit).SplitArrayQK(arr,5); //array((2,1),(3,4),(9,5),(7,8),(9,15))
|
||||
```tsl
|
||||
arr := array(2, 1, 3, 4, 9, 5, 7, 8, 9, 10, 11, 12, 13, 15);
|
||||
return unit(MultiProc_unit).SplitArrayQK(arr, 5); // array((2,1),(3,4),(9,5),(7,8),(9,15))
|
||||
```
|
||||
|
||||
####### SplitArrayQK2
|
||||
|
||||
用途:MultiProc_unit相关函数。
|
||||
参数:arg1,arg2(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
arr := array(2,1,3,4,9,5,7,8,9,10,11,12,13,15);
|
||||
|
||||
return unit(MultiProc_unit).SplitArrayQK2(arr,5);
|
||||
|
||||
```tsl
|
||||
arr := array(2, 1, 3, 4, 9, 5, 7, 8, 9, 10, 11, 12, 13, 15);
|
||||
return unit(MultiProc_unit).SplitArrayQK2(arr, 5);
|
||||
// array((2,3),(4,5),(7,9),(10,12),(13,15))
|
||||
```
|
||||
|
||||
####### DeleteTablebyReg
|
||||
|
||||
用途:MultiProc_unit相关函数。
|
||||
参数:arg1(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
Return unit(MultiProc_unit).DeleteTablebyReg('test');
|
||||
```tsl
|
||||
return unit(MultiProc_unit).DeleteTablebyReg('test');
|
||||
```
|
||||
|
||||
####### GettablebyReg
|
||||
|
||||
用途:MultiProc_unit相关函数。
|
||||
参数:arg1(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
Return unit(MultiProc_unit).GettablebyReg('test');
|
||||
```tsl
|
||||
return unit(MultiProc_unit).GettablebyReg('test');
|
||||
```
|
||||
|
||||
####### TryInsetTable
|
||||
|
||||
用途:MultiProc_unit相关函数。
|
||||
参数:arg1,arg2(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
Return unit(MultiProc_unit).TryInsetTable('test',array(1,2,3));
|
||||
```tsl
|
||||
return unit(MultiProc_unit).TryInsetTable('test', array(1, 2, 3));
|
||||
```
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -11,42 +11,36 @@
|
|||
|
||||
范例
|
||||
|
||||
```text
|
||||
```tsl
|
||||
logger_debug(1234);
|
||||
|
||||
return 1;
|
||||
return 1;
|
||||
```
|
||||
|
||||
//结果:
|
||||
|
||||
##### logger_info
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
```tsl
|
||||
logger_info("当前执行第100个");
|
||||
|
||||
return 1;
|
||||
return 1;
|
||||
```
|
||||
|
||||
//结果:
|
||||
|
||||
##### logger_warning
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
```tsl
|
||||
logger_warning("当前执行第100个");
|
||||
|
||||
return 1;
|
||||
return 1;
|
||||
```
|
||||
|
||||
//结果:
|
||||
|
||||
##### logger_info2
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
logger_info2("异常","类型不能大于",3);
|
||||
```tsl
|
||||
logger_info2("异常", "类型不能大于", 3);
|
||||
```
|
||||
|
|
|
|||
|
|
@ -22,12 +22,16 @@
|
|||
|
||||
###### CU_ChinaCode
|
||||
|
||||
用途:基本信息相关函数。
|
||||
参数:无。
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
```tsl
|
||||
return CU_ChinaCode();
|
||||
|
||||
//结果:SS.000001
|
||||
// 结果:SS.000001
|
||||
```
|
||||
|
||||
##### 财政支出
|
||||
|
|
@ -280,34 +284,43 @@ return CU_ChinaCode();
|
|||
|
||||
###### HG_StockSettlementBalance
|
||||
|
||||
用途:银证转账相关函数。
|
||||
参数:arg1,arg2(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
//返回2017年1月1日到2018年10月8日的区间证券交易结算资金余额
|
||||
|
||||
setsysparam(pn_stock(),"HG000001");
|
||||
|
||||
Return HG_StockSettlementBalance(20170101T,20181008T);
|
||||
|
||||
//结果:
|
||||
```tsl
|
||||
// 返回2017年1月1日到2018年10月8日的区间证券交易结算资金余额
|
||||
setsysparam(pn_stock(), "HG000001");
|
||||
return HG_StockSettlementBalance(20170101T, 20181008T);
|
||||
// 结果:
|
||||
```
|
||||
|
||||
###### HG_StockSettlementBalanceByEndT
|
||||
|
||||
用途:银证转账相关函数。
|
||||
参数:arg1(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
//返回2018年10月8日的证券交易结算资金余额
|
||||
|
||||
setsysparam(pn_stock(),"HG000001");
|
||||
|
||||
Return HG_StockSettlementBalanceByEndT(20181008T);
|
||||
|
||||
//结果:1220500000000
|
||||
```tsl
|
||||
// 返回2018年10月8日的证券交易结算资金余额
|
||||
setsysparam(pn_stock(), "HG000001");
|
||||
return HG_StockSettlementBalanceByEndT(20181008T);
|
||||
// 结果:1220500000000
|
||||
```
|
||||
|
||||
###### HG_StockPeriodBalance
|
||||
|
||||
用途:银证转账相关函数。
|
||||
参数:arg1,arg2(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
算法
|
||||
|
||||
从证券及股票期权投资者资金余额及变动(813)表中获取三个表:
|
||||
|
|
@ -321,108 +334,119 @@ setsysparam(pn_stock(),"HG000001");
|
|||
|
||||
返回三个表中‘截止日’相同的数据。范例
|
||||
|
||||
```text
|
||||
//返回2017年1月1日到2018年10月8日的区间证券交易结算资金、融资融券担保资金、股票期权保证金余额情况
|
||||
|
||||
setsysparam(pn_stock(),"HG000001");
|
||||
|
||||
Return HG_StockPeriodBalance(20170101T,20181008T);
|
||||
|
||||
//结果:
|
||||
```tsl
|
||||
// 返回2017年1月1日到2018年10月8日的区间证券交易结算资金、融资融券担保资金、股票期权保证金余额情况
|
||||
setsysparam(pn_stock(), "HG000001");
|
||||
return HG_StockPeriodBalance(20170101T, 20181008T);
|
||||
// 结果:
|
||||
```
|
||||
|
||||
###### HG_OptionMarginBalanceByEndT
|
||||
|
||||
用途:银证转账相关函数。
|
||||
参数:arg1(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
//返回2018年10月8日的股票期权保证金余额
|
||||
|
||||
setsysparam(pn_stock(),"HG000001");
|
||||
|
||||
Return HG_OptionMarginBalanceByEndT(20181008T);
|
||||
|
||||
//结果:5974000000
|
||||
```tsl
|
||||
// 返回2018年10月8日的股票期权保证金余额
|
||||
setsysparam(pn_stock(), "HG000001");
|
||||
return HG_OptionMarginBalanceByEndT(20181008T);
|
||||
// 结果:5974000000
|
||||
```
|
||||
|
||||
###### HG_MoneyRollIn
|
||||
|
||||
用途:银证转账相关函数。
|
||||
参数:arg1,arg2(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
//返回2017年1月1日到2018年10月8日的区间资金转入额
|
||||
|
||||
setsysparam(pn_stock(),"HG000001");
|
||||
|
||||
Return HG_MoneyRollIn(20170101T,20181008T);
|
||||
|
||||
//结果:11452969000000
|
||||
```tsl
|
||||
// 返回2017年1月1日到2018年10月8日的区间资金转入额
|
||||
setsysparam(pn_stock(), "HG000001");
|
||||
return HG_MoneyRollIn(20170101T, 20181008T);
|
||||
// 结果:11452969000000
|
||||
```
|
||||
|
||||
###### HG_OptionMarginBalance
|
||||
|
||||
用途:银证转账相关函数。
|
||||
参数:arg1,arg2(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
//返回2017年1月1日到2018年10月8日的区间股票期权保证金余额
|
||||
|
||||
setsysparam(pn_stock(),"HG000001");
|
||||
|
||||
Return HG_OptionMarginBalance(20170101T,20181008T);
|
||||
|
||||
//结果:
|
||||
```tsl
|
||||
// 返回2017年1月1日到2018年10月8日的区间股票期权保证金余额
|
||||
setsysparam(pn_stock(), "HG000001");
|
||||
return HG_OptionMarginBalance(20170101T, 20181008T);
|
||||
// 结果:
|
||||
```
|
||||
|
||||
###### HG_StockGuaranteeBalanceByEndT
|
||||
|
||||
用途:银证转账相关函数。
|
||||
参数:arg1(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
//返回2018年10月8日的融资融券担保资金余额
|
||||
|
||||
setsysparam(pn_stock(),"HG000001");
|
||||
|
||||
Return HG_StockGuaranteeBalanceByEndT(20181008T);
|
||||
|
||||
//结果:147600000000
|
||||
```tsl
|
||||
// 返回2018年10月8日的融资融券担保资金余额
|
||||
setsysparam(pn_stock(), "HG000001");
|
||||
return HG_StockGuaranteeBalanceByEndT(20181008T);
|
||||
// 结果:147600000000
|
||||
```
|
||||
|
||||
###### HG_MoneyNetRollIn
|
||||
|
||||
用途:银证转账相关函数。
|
||||
参数:arg1,arg2(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
//返回2017年1月1日到2018年10月8日的区间资金净转入额
|
||||
|
||||
|
||||
Return HG_MoneyNetRollIn(20170101T,20181008T);
|
||||
|
||||
|
||||
//结果:-248651000000
|
||||
```tsl
|
||||
// 返回2017年1月1日到2018年10月8日的区间资金净转入额
|
||||
return HG_MoneyNetRollIn(20170101T, 20181008T);
|
||||
// 结果:-248651000000
|
||||
```
|
||||
|
||||
###### HG_MoneyRollOut
|
||||
|
||||
用途:银证转账相关函数。
|
||||
参数:arg1,arg2(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
//返回2017年1月1日到2018年10月8日的区间资金转出额
|
||||
|
||||
|
||||
Return HG_MoneyRollOut(20170101T,20181008T);
|
||||
|
||||
//结果:11701620000000
|
||||
```tsl
|
||||
// 返回2017年1月1日到2018年10月8日的区间资金转出额
|
||||
return HG_MoneyRollOut(20170101T, 20181008T);
|
||||
// 结果:11701620000000
|
||||
```
|
||||
|
||||
###### HG_StockGuaranteeBalance
|
||||
|
||||
用途:银证转账相关函数。
|
||||
参数:arg1,arg2(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
//返回2017年1月1日到2018年10月8日的区间融资融券担保资金余额列表。
|
||||
|
||||
|
||||
Return HG_StockGuaranteeBalance(20170101T,20181008T);
|
||||
```tsl
|
||||
// 返回2017年1月1日到2018年10月8日的区间融资融券担保资金余额列表。
|
||||
return HG_StockGuaranteeBalance(20170101T, 20181008T);
|
||||
```
|
||||
|
||||
##### 行业宏观
|
||||
|
|
@ -776,14 +800,16 @@ Return HG_MoneyRollOut(20170101T,20181008T);
|
|||
|
||||
###### HG_DL_InterestRate
|
||||
|
||||
用途:人民币存贷款利率相关函数。
|
||||
参数:无。
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
//活期存款在20210302的人民币存贷款利率
|
||||
|
||||
setsysparam(pn_stock(),"IR000001");
|
||||
|
||||
setsysparam(pn_date(),20210302T);
|
||||
|
||||
return HG_DL_InterestRate(); //结果: 0.35
|
||||
```tsl
|
||||
// 活期存款在20210302的人民币存贷款利率
|
||||
setsysparam(pn_stock(), "IR000001");
|
||||
setsysparam(pn_date(), 20210302T);
|
||||
return HG_DL_InterestRate(); // 结果: 0.35
|
||||
```
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -42,34 +42,29 @@
|
|||
|
||||
范例
|
||||
|
||||
```text
|
||||
```tsl
|
||||
ManagerID := "1533";
|
||||
|
||||
FMtype := 1; //股混型
|
||||
|
||||
RDate := 20220630;
|
||||
|
||||
return FundManager_GetStockHoldings(ManagerID,FMtype,RDate);
|
||||
FMtype := 1; // 股混型
|
||||
RDate := 20220630;
|
||||
return FundManager_GetStockHoldings(ManagerID, FMtype, RDate);
|
||||
```
|
||||
|
||||
########## FundManager_js_gpgmjz
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
```tsl
|
||||
EndT := 20220812T;
|
||||
|
||||
return FundManager_js_gpgmjz(EndT);
|
||||
return FundManager_js_gpgmjz(EndT);
|
||||
```
|
||||
|
||||
########## FundManager_js_hyjqd
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
```tsl
|
||||
RDate := 20220630;
|
||||
|
||||
return FundManager_js_hyjqd(RDate);
|
||||
return FundManager_js_hyjqd(RDate);
|
||||
```
|
||||
|
||||
##### 基金
|
||||
|
|
@ -96,16 +91,12 @@ RDate := 20220630;
|
|||
|
||||
范例
|
||||
|
||||
```text
|
||||
```tsl
|
||||
FundID := "OF000001";
|
||||
|
||||
begt := 20200101t;
|
||||
|
||||
endt := 20240301t;
|
||||
|
||||
RollNYearArr := array(1,3); //持有1年,持有3年
|
||||
|
||||
return Fund_PF_HoldFeeling_Stat(FundID,begt,endt,RollNYearArr);
|
||||
begt := 20200101t;
|
||||
endt := 20240301t;
|
||||
RollNYearArr := array(1, 3); // 持有1年,持有3年
|
||||
return Fund_PF_HoldFeeling_Stat(FundID, begt, endt, RollNYearArr);
|
||||
```
|
||||
|
||||
返回:
|
||||
|
|
@ -114,18 +105,13 @@ FundID := "OF000001";
|
|||
|
||||
范例
|
||||
|
||||
```text
|
||||
FundID := "OF000001";
|
||||
|
||||
begt := 20200101t;
|
||||
|
||||
endt := 20240301t;
|
||||
|
||||
MANum := 60;
|
||||
|
||||
delta := 20;
|
||||
|
||||
return Fund_PF_HoldFeeling_Trend(FundID,begt,endt,MANum,delta);
|
||||
```tsl
|
||||
FundID := "OF000001";
|
||||
begt := 20200101t;
|
||||
endt := 20240301t;
|
||||
MANum := 60;
|
||||
delta := 20;
|
||||
return Fund_PF_HoldFeeling_Trend(FundID, begt, endt, MANum, delta);
|
||||
```
|
||||
|
||||
返回:
|
||||
|
|
@ -138,11 +124,16 @@ FundID := "OF000001";
|
|||
|
||||
####### GetAllThemespools
|
||||
|
||||
用途:基金相关函数。
|
||||
参数:
|
||||
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
```tsl
|
||||
EndT := 20230919T;
|
||||
|
||||
return GetAllThemespools(EndT);
|
||||
```
|
||||
|
||||
|
|
@ -164,22 +155,18 @@ return GetAllThemespools(EndT);
|
|||
|
||||
范例01:获取指定ETF在指定日的资金净流入
|
||||
|
||||
```text
|
||||
return ETF_MT_NetINflowAmount(20250922T,array("OF512000"));
|
||||
```tsl
|
||||
return ETF_MT_NetINflowAmount(20250922T, array("OF512000"));
|
||||
```
|
||||
|
||||
返回:920.088,单位为:万元
|
||||
|
||||
范例02:获取2022-02-17所有跟踪沪深300ETF基金资金净流入金额
|
||||
|
||||
```text
|
||||
fundArr := getbk("上证基金;深证基金;开放式基金;已退市基金");
|
||||
|
||||
etfArr := sselect ["StockID"] from infotable 302 of fundArr
|
||||
|
||||
where ["交易方式"]="ETF" and ["标的指数代码"]="SH000300"end;
|
||||
|
||||
endt := 20220217t;
|
||||
|
||||
return ETF_MT_NetInflowAmount(endt,ETFArr,r);// -223296.48
|
||||
```tsl
|
||||
fundArr := getbk("上证基金;深证基金;开放式基金;已退市基金");
|
||||
etfArr := sselect ["StockID"] from infotable 302 of fundArr
|
||||
where ["交易方式"] = "ETF" and ["标的指数代码"] = "SH000300"end;
|
||||
endt := 20220217t;
|
||||
return ETF_MT_NetInflowAmount(endt, ETFArr, r); // -223296.48
|
||||
```
|
||||
|
|
|
|||
|
|
@ -9,9 +9,11 @@
|
|||
|
||||
### 核心函数库
|
||||
|
||||
- **[TSL函数](./tsl/index.md)** - 数学、系统、基础、图形等通用函数
|
||||
- **[金融函数](./financial/index.md)** - 股票、行情、技术分析、财务等金融专用函数
|
||||
- **[数据仓库函数](./03_datawarehouse.md)**
|
||||
- **[01 TSL函数](./01_tsl_functions.md)** - 数学、系统、基础、图形等通用函数
|
||||
- 详细内容:[tsl/index.md](./tsl/index.md) (10个子文件,34,113行)
|
||||
- **[02 金融函数](./02_financial_functions.md)** - 股票、行情、技术分析、财务等金融专用函数
|
||||
- 详细内容:[financial/index.md](./financial/index.md) (23个子文件,169,893行)
|
||||
- **[03 数据仓库函数](./03_datawarehouse.md)**
|
||||
(7,270行) - 数据查询、时间序列、市场板块函数
|
||||
|
||||
### 专业领域
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -82,23 +82,35 @@
|
|||
|
||||
####### DelPrecodeCallBack
|
||||
|
||||
用途:结果处理相关函数。
|
||||
参数:
|
||||
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
```tsl
|
||||
return DelPrecodeCallBack('SH600000');
|
||||
```
|
||||
|
||||
//结果:’ 600000’
|
||||
结果:’ 600000’
|
||||
|
||||
####### IncPrecodeCallBack
|
||||
|
||||
用途:结果处理相关函数。
|
||||
参数:
|
||||
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
```tsl
|
||||
return IncPrecodeCallBack('000002.SZ');
|
||||
```
|
||||
|
||||
//结果:’SZ000002’
|
||||
结果:’SZ000002’
|
||||
|
||||
###### 层次表格的展开
|
||||
|
||||
|
|
@ -115,87 +127,86 @@ return IncPrecodeCallBack('000002.SZ');
|
|||
|
||||
####### ExtractData
|
||||
|
||||
用途:结果处理相关函数。
|
||||
参数:
|
||||
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
r:=Query("","SH600000;SZ000002",True,"","代码",DefaultStockID(),
|
||||
|
||||
"名称",CurrentStockName(),
|
||||
|
||||
"股票.分红送股",infoarray(18));
|
||||
|
||||
return ExtractData(r,1,0);
|
||||
```tsl
|
||||
r := Query("", "SH600000;SZ000002", true, "", "代码", DefaultStockID(),
|
||||
"名称", CurrentStockName(),
|
||||
"股票.分红送股", infoarray(18));
|
||||
return ExtractData(r, 1, 0);
|
||||
```
|
||||
|
||||
结果:
|
||||
|
||||
####### ExtractDataEx
|
||||
|
||||
用途:结果处理相关函数。
|
||||
参数:
|
||||
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
r:=Query("","SH600000;SZ000002",True,"","代码",DefaultStockID(),
|
||||
|
||||
"名称",CurrentStockName(),
|
||||
|
||||
"名称2",CurrentStockName(),
|
||||
|
||||
"名称3f",CurrentStockName(),
|
||||
|
||||
"股票.分红送股",infoarray(18));
|
||||
|
||||
return ExtractDataEx(r,1,0,1);
|
||||
```tsl
|
||||
r := Query("", "SH600000;SZ000002", true, "", "代码", DefaultStockID(),
|
||||
"名称", CurrentStockName(),
|
||||
"名称2", CurrentStockName(),
|
||||
"名称3f", CurrentStockName(),
|
||||
"股票.分红送股", infoarray(18));
|
||||
return ExtractDataEx(r, 1, 0, 1);
|
||||
```
|
||||
|
||||
//结果:
|
||||
|
||||
####### ExtractDataEx2
|
||||
|
||||
用途:结果处理相关函数。
|
||||
参数:
|
||||
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
```tsl
|
||||
// 数据展开范例
|
||||
|
||||
r:=Query("","SH600000;SZ000002",True,"","代码",DefaultStockID(),
|
||||
|
||||
"名称",CurrentStockName(),
|
||||
|
||||
"名称2",CurrentStockName(),
|
||||
|
||||
"名称3f",CurrentStockName(),
|
||||
|
||||
"股票.分红送股",infoarray(18));
|
||||
|
||||
return ExtractDataEx2(r,1,0,1,1);
|
||||
r := Query("", "SH600000;SZ000002", true, "", "代码", DefaultStockID(),
|
||||
"名称", CurrentStockName(),
|
||||
"名称2", CurrentStockName(),
|
||||
"名称3f", CurrentStockName(),
|
||||
"股票.分红送股", infoarray(18));
|
||||
return ExtractDataEx2(r, 1, 0, 1, 1);
|
||||
```
|
||||
|
||||
//结果:
|
||||
|
||||
####### ExtractDataLocalRun
|
||||
|
||||
####### ExtractDataLocalRun2
|
||||
|
||||
用途:结果处理相关函数。
|
||||
参数:
|
||||
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
```tsl
|
||||
// 数据展开范例
|
||||
|
||||
r:=Query("","SH600000;SZ000002",True,"","代码",DefaultStockID(),
|
||||
|
||||
"名称",CurrentStockName(),
|
||||
|
||||
"名称2",CurrentStockName(),
|
||||
|
||||
"名称3f",CurrentStockName(),
|
||||
|
||||
"股票.分红送股",infoarray(18));
|
||||
|
||||
setsysparam(pn_data(),r);
|
||||
|
||||
return ExtractDataLocalRun2(0,1);
|
||||
r := Query("", "SH600000;SZ000002", true, "", "代码", DefaultStockID(),
|
||||
"名称", CurrentStockName(),
|
||||
"名称2", CurrentStockName(),
|
||||
"名称3f", CurrentStockName(),
|
||||
"股票.分红送股", infoarray(18));
|
||||
setsysparam(pn_data(), r);
|
||||
return ExtractDataLocalRun2(0, 1);
|
||||
```
|
||||
|
||||
//结果:
|
||||
|
||||
###### 简单统计
|
||||
|
||||
|
|
@ -206,16 +217,19 @@ return ExtractDataLocalRun2(0,1);
|
|||
|
||||
####### SimpleStat
|
||||
|
||||
用途:结果处理相关函数。
|
||||
参数:
|
||||
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
data:=array(1,2,3,4,5);
|
||||
|
||||
|
||||
```tsl
|
||||
data := array(1, 2, 3, 4, 5);
|
||||
return SimpleStat(Data);
|
||||
```
|
||||
|
||||
结果:
|
||||
|
||||
####### SimpleStatLocal
|
||||
|
||||
|
|
@ -230,13 +244,19 @@ return SimpleStat(Data);
|
|||
|
||||
####### GetTypeOfStock
|
||||
|
||||
用途:结果处理相关函数。
|
||||
参数:
|
||||
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
Return GetTypeOfStock('OF000001');
|
||||
```tsl
|
||||
return GetTypeOfStock('OF000001');
|
||||
```
|
||||
|
||||
//结果:4
|
||||
结果:4
|
||||
|
||||
##### 错误处理
|
||||
|
||||
|
|
@ -262,23 +282,27 @@ Return GetTypeOfStock('OF000001');
|
|||
|
||||
范例
|
||||
|
||||
```text
|
||||
return RaiseError('function1','无效的语段');
|
||||
```tsl
|
||||
return raise Error('function1', '无效的语段');
|
||||
```
|
||||
|
||||
//结果:
|
||||
|
||||
###### ThisFuncOnlyForFund
|
||||
|
||||
###### ASSERT
|
||||
|
||||
用途:错误处理相关函数。
|
||||
参数:
|
||||
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
return ASSERT(0,'无效的语段');
|
||||
```tsl
|
||||
return ASSERT(0, '无效的语段');
|
||||
```
|
||||
|
||||
结果:
|
||||
|
||||
##### 客户端行为控制函数
|
||||
|
||||
|
|
@ -295,17 +319,14 @@ return ASSERT(0,'无效的语段');
|
|||
|
||||
范例
|
||||
|
||||
```text
|
||||
//在客户端内创建函数,函数名为TSExpert_ClientConfig,函数体内的函数如下
|
||||
|
||||
r:=array();
|
||||
|
||||
r["AutoRun"][0]:='TS_ClientDemo';// TS_ClientDemo为预先设定好的函数,在下次登陆客户端时会自动运行该函数。其中TS_ClientDemo的代码为rdo2 MessageBox("欢迎登陆天软客户端","您好",rdo2 mb_DefButton1());
|
||||
|
||||
return r;
|
||||
```tsl
|
||||
// 在客户端内创建函数,函数名为TSExpert_ClientConfig,函数体内的函数如下
|
||||
r := array();
|
||||
r["AutoRun"][0] := 'TS_ClientDemo'; // TS_ClientDemo为预先设定好的函数,在下次登陆客户端时会自动运行该函数。其中TS_ClientDemo的代码为rdo2 MessageBox("欢迎登陆天软客户端","您好",rdo2 mb_DefButton1());
|
||||
return r;
|
||||
```
|
||||
|
||||
//效果: 重新启动客户端时,会弹出下面对话框
|
||||
效果: 重新启动客户端时,会弹出下面对话框
|
||||
|
||||
该函数的返回值为一个数组,该数组的下标定义如下:
|
||||
|
||||
|
|
@ -369,40 +390,23 @@ name列,类型为字符串,表示函数的名称。
|
|||
|
||||
范例
|
||||
|
||||
```text
|
||||
//在原窗口输出个数,无需加Nwdow参数
|
||||
|
||||
n:=0;
|
||||
|
||||
While n<100 do
|
||||
|
||||
Begin
|
||||
|
||||
Echo n;
|
||||
|
||||
SendRunningData(n);
|
||||
|
||||
n++;
|
||||
|
||||
End;
|
||||
|
||||
Return 1;
|
||||
|
||||
在新窗口输出数组,则需要加Nwdow参数,代码如下:
|
||||
|
||||
n:=0;
|
||||
|
||||
While n<100 do
|
||||
|
||||
Begin
|
||||
|
||||
Echo n;
|
||||
|
||||
SendRunningData(rand(10),"新窗口");
|
||||
|
||||
n++;
|
||||
|
||||
```tsl
|
||||
// 在原窗口输出个数,无需加Nwdow参数
|
||||
n := 0;
|
||||
while n < 100 do
|
||||
begin
|
||||
Echo n;
|
||||
SendRunningData(n);
|
||||
n++;
|
||||
end;
|
||||
|
||||
Return 1;
|
||||
return 1;
|
||||
// 在新窗口输出数组,则需要加Nwdow参数,代码如下:
|
||||
n := 0;
|
||||
while n < 100 do
|
||||
begin
|
||||
Echo n;
|
||||
SendRunningData(rand(10), "新窗口");
|
||||
n++;
|
||||
end;
|
||||
return 1;
|
||||
```
|
||||
|
|
|
|||
|
|
@ -18,13 +18,10 @@ ZIP和RAR是最常见的文件压缩格式,为此天软提供了ZIP文件压
|
|||
|
||||
范例
|
||||
|
||||
```text
|
||||
//把文件d:\a.txt压缩到d:\a.zip文件中的/hello/world/a.txt中
|
||||
|
||||
```tsl
|
||||
// 把文件d:\a.txt压缩到d:\a.zip文件中的/hello/world/a.txt中
|
||||
ZipCompress('', 'd:\\a.zip', '', 'd:\\a.txt', 'hello/world/a.txt');
|
||||
|
||||
//将d:\tmp目录压缩到d:\a.zip文件中
|
||||
|
||||
// 将d:\tmp目录压缩到d:\a.zip文件中
|
||||
ZipCompress('', 'd:\\a.zip', '', 'd:\\tmp', 'test');
|
||||
```
|
||||
|
||||
|
|
@ -32,19 +29,17 @@ ZipCompress('', 'd:\\a.zip', '', 'd:\\tmp', 'test');
|
|||
|
||||
范例
|
||||
|
||||
```text
|
||||
//将ZIP文件解压,可以使用ZipExtract函数,例如将d:\a.zip文件解压到d:\tmp目录
|
||||
|
||||
ZipExtract('', 'd:\\a.zip', '', 'd:\\tmp', '123') ;
|
||||
```tsl
|
||||
// 将ZIP文件解压,可以使用ZipExtract函数,例如将d:\a.zip文件解压到d:\tmp目录
|
||||
ZipExtract('', 'd:\\a.zip', '', 'd:\\tmp', '123');
|
||||
```
|
||||
|
||||
##### RarExtract
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
//将RAR文件解压,可以使用RarExtract函数,例如将d:\a.rar文件解压到d:\tmp目录
|
||||
|
||||
```tsl
|
||||
// 将RAR文件解压,可以使用RarExtract函数,例如将d:\a.rar文件解压到d:\tmp目录
|
||||
RarExtract('', 'd:\\a.rar', '', 'd:\\tmp', '123');
|
||||
```
|
||||
|
||||
|
|
@ -56,19 +51,27 @@ ZipCompress函数可以将由filename指定的文件或目录压缩到由zip_fil
|
|||
|
||||
函数中所指定的path是压缩文件或目录在ZIP文件中的路径。如同文件系统中文件是在树状的目录结构中存储一样,ZIP文件中所存储的文件也是树状结构的,通过指定path参数,我们可以将文件或目录压缩后存放到ZIP文件中指定的目录下,如果path参数为空(“”),就压缩到ZIP的根目录下。例如我们把文件d:\a.txt压缩到d:\a.zip文件中的/hello/world/a.txt中,可以使用下面的语句:
|
||||
|
||||
<table><tbody><tr><td>ZipCompress('', 'd:\\a.zip', '', 'd:\\a.txt', 'hello/world/a.txt');<br/></td></tr></tbody></table>
|
||||
```tsl
|
||||
ZipCompress('', 'd:\\a.zip', '', 'd:\\a.txt', 'hello/world/a.txt');
|
||||
```
|
||||
|
||||
又如我们要将d:\tmp目录压缩到d:\a.zip文件中的根下,可以使用这样的语句:
|
||||
|
||||
<table><tbody><tr><td>ZipCompress('', 'd:\\a.zip', '', 'd:\\tmp', 'test');<br/></td></tr></tbody></table>
|
||||
```tsl
|
||||
ZipCompress('', 'd:\\a.zip', '', 'd:\\tmp', 'test');
|
||||
```
|
||||
|
||||
要将ZIP文件解压,可以使用ZipExtract函数,例如将d:\a.zip文件解压到d:\tmp目录:
|
||||
|
||||
<table><tbody><tr><td>ZipExtract('', 'd:\\a.zip', '', 'd:\\tmp', '123') ;<br/></td></tr></tbody></table>
|
||||
```tsl
|
||||
ZipExtract('', 'd:\\a.zip', '', 'd:\\tmp', '123') ;
|
||||
```
|
||||
|
||||
要将RAR文件解压,可以使用RarExtract函数,例如将d:\a.rar文件解压到d:\tmp目录:
|
||||
|
||||
<table><tbody><tr><td>RarExtract('', 'd:\\a.rar', '', 'd:\\tmp', '123');<br/></td></tr></tbody></table>
|
||||
```tsl
|
||||
RarExtract('', 'd:\\a.rar', '', 'd:\\tmp', '123');
|
||||
```
|
||||
|
||||
##### unicompress
|
||||
|
||||
|
|
@ -76,15 +79,11 @@ ZipCompress函数可以将由filename指定的文件或目录压缩到由zip_fil
|
|||
|
||||
本地运行下面脚本:
|
||||
|
||||
```text
|
||||
data:="Holle Tinysoft天软";
|
||||
|
||||
s:=unicompress("zstd",data);
|
||||
|
||||
echo s,"\r\n";
|
||||
|
||||
echo uniuncompress("zstd",s),"\r\n";
|
||||
|
||||
```tsl
|
||||
data := "Holle Tinysoft天软";
|
||||
s := unicompress("zstd", data);
|
||||
echo s, "\r\n";
|
||||
echo uniuncompress("zstd", s), "\r\n";
|
||||
return 1;
|
||||
```
|
||||
|
||||
|
|
@ -92,16 +91,11 @@ return 1;
|
|||
|
||||
范例
|
||||
|
||||
```text
|
||||
data:="Holle Tinysoft天软";
|
||||
|
||||
len:=length(data);
|
||||
|
||||
s:=unicompress("zstd",data);
|
||||
|
||||
echo s,"\r\n";
|
||||
|
||||
echo uniuncompress("zstd",s,len),"\r\n";
|
||||
|
||||
```tsl
|
||||
data := "Holle Tinysoft天软";
|
||||
len := length(data);
|
||||
s := unicompress("zstd", data);
|
||||
echo s, "\r\n";
|
||||
echo uniuncompress("zstd", s, len), "\r\n";
|
||||
return 1;
|
||||
```
|
||||
|
|
|
|||
|
|
@ -19,10 +19,36 @@
|
|||
|
||||
###### 摘要函数使用说明
|
||||
|
||||
<table><tbody><tr><td>filename:="d:\\test.txt";<br/>teststr:="hello";<br/>alias:=""; //别名<br/><br/>return array(<br/>"filename":filename,<br/>"GetMsgDigest(crc32_str)":GetMsgDigest(teststr,0),<br/>"GetMsgDigest(md5_str)":GetMsgDigest(teststr,1),<br/>"GetMsgDigest(sha1_str)":GetMsgDigest(teststr,2),<br/>"GetMsgDigest(sha224_str)":GetMsgDigest(teststr,3),<br/>"GetMsgDigest(sha256_str)":GetMsgDigest(teststr,4),<br/>"GetMsgDigest(sha384_str)":GetMsgDigest(teststr,5),<br/>"GetMsgDigest(sha512_str)":GetMsgDigest(teststr,6),<br/>"GetMsgDigest(alias, filename, crc32_str)":GetMsgDigest(alias,filename,0),<br/>"GetMsgDigest(alias, filename, md5_str)":GetMsgDigest(alias,filename,1),<br/>"GetMsgDigest(alias, filename, sha1_str)":GetMsgDigest(alias,filename,2),<br/>"GetMsgDigest(alias, filename, sha224_str)":GetMsgDigest(alias,filename,3),<br/>"GetMsgDigest(alias, filename, sha256_str)":GetMsgDigest(alias,filename,4),<br/>"GetMsgDigest(alias, filename, sha384_str)":GetMsgDigest(alias,filename,5),<br/>"GetMsgDigest(alias, filename, sha512_str)":GetMsgDigest(alias,filename,6)<br/>);<br/></td></tr></tbody></table>
|
||||
```tsl
|
||||
filename := "d:\\test.txt";
|
||||
teststr := "hello";
|
||||
alias := ""; //别名
|
||||
return array(
|
||||
"filename":filename,
|
||||
"GetMsgDigest(crc32_str)":GetMsgDigest(teststr,0),
|
||||
"GetMsgDigest(md5_str)":GetMsgDigest(teststr,1),
|
||||
"GetMsgDigest(sha1_str)":GetMsgDigest(teststr,2),
|
||||
"GetMsgDigest(sha224_str)":GetMsgDigest(teststr,3),
|
||||
"GetMsgDigest(sha256_str)":GetMsgDigest(teststr,4),
|
||||
"GetMsgDigest(sha384_str)":GetMsgDigest(teststr,5),
|
||||
"GetMsgDigest(sha512_str)":GetMsgDigest(teststr,6),
|
||||
"GetMsgDigest(alias, filename, crc32_str)":GetMsgDigest(alias,filename,0),
|
||||
"GetMsgDigest(alias, filename, md5_str)":GetMsgDigest(alias,filename,1),
|
||||
"GetMsgDigest(alias, filename, sha1_str)":GetMsgDigest(alias,filename,2),
|
||||
"GetMsgDigest(alias, filename, sha224_str)":GetMsgDigest(alias,filename,3),
|
||||
"GetMsgDigest(alias, filename, sha256_str)":GetMsgDigest(alias,filename,4),
|
||||
"GetMsgDigest(alias, filename, sha384_str)":GetMsgDigest(alias,filename,5),
|
||||
"GetMsgDigest(alias, filename, sha512_str)":GetMsgDigest(alias,filename,6)
|
||||
);
|
||||
```
|
||||
|
||||
###### GetMsgDigest
|
||||
|
||||
用途:信息摘要函数相关函数。
|
||||
参数:arg1(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
- 摘要函数使用说明
|
||||
- GetMsgDigest
|
||||
- GetMsgDigest(文件)
|
||||
|
|
@ -41,22 +67,38 @@
|
|||
|
||||
###### BASE64编码函数使用说明
|
||||
|
||||
<table><tbody><tr><td>//常量定义<br/>test_str:='hello world';<br/>//BASE64<br/>base64:=StrToBase64(test_str); //转换为BASE64编码<br/>orig_str:=Base64ToStr(base64); //BASE64编码转换为字符串<br/></td></tr></tbody></table>
|
||||
```tsl
|
||||
//常量定义
|
||||
test_str := 'hello world';
|
||||
//BASE64
|
||||
base64 := StrToBase64(test_str); //转换为BASE64编码
|
||||
orig_str := Base64ToStr(base64); //BASE64编码转换为字符串
|
||||
```
|
||||
|
||||
###### StrToBase64
|
||||
|
||||
用途:将字符串转换为对应类型。
|
||||
参数:arg1(按示例顺序传入)。
|
||||
返回:转换后的数值或日期。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
return rdo2 strtobase64('a12');//返回字符串:YTEy
|
||||
```tsl
|
||||
return rdo2 StrToBase64('a12'); // 返回字符串:YTEy
|
||||
```
|
||||
|
||||
###### Base64ToStr
|
||||
|
||||
用途:将输入值转换为字符串。
|
||||
参数:arg1(按示例顺序传入)。
|
||||
返回:字符串。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
return rdo2 base64tostr('YTEy');//返回字符串:a12
|
||||
```tsl
|
||||
return rdo2 Base64ToStr('YTEy'); // 返回字符串:a12
|
||||
```
|
||||
|
||||
##### URI EnCode函数
|
||||
|
|
@ -106,66 +148,69 @@ encoderadixstr("天软","0x",0x40000000+16)结果为"0xcc0xec0xc80xed" 小写字
|
|||
|
||||
###### EncodeRadixstr
|
||||
|
||||
用途:进制编码函数相关函数。
|
||||
参数:arg1,arg2,arg3(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
return encoderadixstr("1122","0x",16);//结果为’ 0x310x310x320x32’,前缀,16进制
|
||||
|
||||
return encoderadixstr("1122","h",0x80000000+16);//’ 31h31h32h32h’,后缀,16进制
|
||||
|
||||
return encoderadixstr("天软","ox",0x80000000+16);
|
||||
|
||||
//’ CCoxECoxC8oxEDox’,后缀,默认为大写字母,16进制
|
||||
|
||||
return encoderadixstr("天软","0X",0x80000000+0x40000000+16);
|
||||
|
||||
//’ cc0Xec0Xc80Xed0X’,后缀,小写字母,16进制
|
||||
|
||||
return Encoderadixstr("18","B",2);//’ B00110001B00111000’,二进制
|
||||
```tsl
|
||||
return EncodeRadixstr("1122", "0x", 16); // 结果为’ 0x310x310x320x32’,前缀,16进制
|
||||
return EncodeRadixstr("1122", "h", 0x80000000 + 16); // ’ 31h31h32h32h’,后缀,16进制
|
||||
return EncodeRadixstr("天软", "ox", 0x80000000 + 16);
|
||||
// ’ CCoxECoxC8oxEDox’,后缀,默认为大写字母,16进制
|
||||
return EncodeRadixstr("天软", "0X", 0x80000000 + 0x40000000 + 16);
|
||||
// ’ cc0Xec0Xc80Xed0X’,后缀,小写字母,16进制
|
||||
return EncodeRadixstr("18", "B", 2); // ’ B00110001B00111000’,二进制
|
||||
```
|
||||
|
||||
###### DecodeRadixstr
|
||||
|
||||
用途:进制编码函数相关函数。
|
||||
参数:arg1,arg2,arg3(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
return decoderadixstr('0x310x310x320x32',2,16); //返回'1122'
|
||||
|
||||
//注:这里的第二个参数是前缀或后缀的串的长度,并非指定串
|
||||
```tsl
|
||||
return DecodeRadixstr('0x310x310x320x32', 2, 16); // 返回'1122'
|
||||
// 注:这里的第二个参数是前缀或后缀的串的长度,并非指定串
|
||||
```
|
||||
|
||||
###### Decoderadixwstr
|
||||
|
||||
用途:进制编码函数相关函数。
|
||||
参数:arg1,arg2,arg3(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
return decoderadixwstr('0x00310x00310x00320x0032',2,16); //返回'1122'
|
||||
|
||||
//注:这里的第二个参数是前缀或后缀的串的长度,并非指定串
|
||||
```tsl
|
||||
return Decoderadixwstr('0x00310x00310x00320x0032', 2, 16); // 返回'1122'
|
||||
// 注:这里的第二个参数是前缀或后缀的串的长度,并非指定串
|
||||
```
|
||||
|
||||
###### Encoderadixwstr
|
||||
|
||||
用途:进制编码函数相关函数。
|
||||
参数:arg1,arg2,arg3(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
return encoderadixwstr("1122","0x",16);
|
||||
|
||||
//结果为'0x00310x00310x00320x0032',前缀,16进制
|
||||
|
||||
return encoderadixwstr("1122","h",0x80000000+16);
|
||||
|
||||
//'0031h0031h0032h0032h',后缀,16进制
|
||||
|
||||
return encoderadixwstr("天软","ox",0x80000000+16);//''
|
||||
|
||||
//'5929ox8F6Fox',后缀,默认为大写字母,16进制
|
||||
|
||||
return encoderadixwstr("天软","0X",0x80000000+0x40000000+16);
|
||||
|
||||
//'59290X8f6f0X',后缀,小写字母,16进制
|
||||
|
||||
return Encoderadixwstr("18","B",2);
|
||||
|
||||
//'B0000000000110001B0000000000111000',二进制
|
||||
```tsl
|
||||
return Encoderadixwstr("1122", "0x", 16);
|
||||
// 结果为'0x00310x00310x00320x0032',前缀,16进制
|
||||
return Encoderadixwstr("1122", "h", 0x80000000 + 16);
|
||||
// '0031h0031h0032h0032h',后缀,16进制
|
||||
return Encoderadixwstr("天软", "ox", 0x80000000 + 16); // ''
|
||||
// '5929ox8F6Fox',后缀,默认为大写字母,16进制
|
||||
return Encoderadixwstr("天软", "0X", 0x80000000 + 0x40000000 + 16);
|
||||
// '59290X8f6f0X',后缀,小写字母,16进制
|
||||
return Encoderadixwstr("18", "B", 2);
|
||||
// 'B0000000000110001B0000000000111000',二进制
|
||||
```
|
||||
|
|
|
|||
|
|
@ -28,103 +28,76 @@
|
|||
|
||||
###### Graph
|
||||
|
||||
用途:作图函数相关函数。
|
||||
参数:arg1,arg2,arg3(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
范例一:
|
||||
|
||||
```text
|
||||
//K线图
|
||||
|
||||
setsysparam(pn_stock(),'SZ000002');
|
||||
|
||||
setsysparam(pn_date(),inttodate(20140117));
|
||||
|
||||
setsysparam(pn_nday(),250);
|
||||
|
||||
t1:=NDay2(gfopen(), Open() ,
|
||||
|
||||
gfclose(), close(),
|
||||
|
||||
gfhigh(), high(),
|
||||
|
||||
gflow(), low(),
|
||||
|
||||
gftime(), datetimetostr(sp_time()),
|
||||
|
||||
//KLine颜色
|
||||
|
||||
gfColor(), IfThen3(Close(), Open(),
|
||||
|
||||
ClRed() , //涨颜色
|
||||
|
||||
clYellow() , //平颜色
|
||||
|
||||
ClLime() //跌颜色
|
||||
|
||||
),
|
||||
|
||||
gffill(),ifThen3(Close(), Open(), flClear(), flSolid(),flSolid())
|
||||
|
||||
);
|
||||
|
||||
t2:=NDay2('MA10',Ma(Close(),10));
|
||||
|
||||
g1:=graph(gtKline(),'KLine',t1);
|
||||
|
||||
g2:=graph(gtline(),'MA10',t2);
|
||||
|
||||
return graphgroup(g1,g2);
|
||||
```tsl
|
||||
// K线图
|
||||
setsysparam(pn_stock(), 'SZ000002');
|
||||
setsysparam(pn_date(), inttodate(20140117));
|
||||
setsysparam(pn_nday(), 250);
|
||||
t1 := NDay2(gfopen(), Open() ,
|
||||
gfclose(), close(),
|
||||
gfhigh(), high(),
|
||||
gflow(), low(),
|
||||
gftime(), datetimetostr(sp_time()),
|
||||
// KLine颜色
|
||||
gfColor(), IfThen3(Close(), Open(),
|
||||
ClRed() ,//涨颜色
|
||||
clYellow() ,//平颜色
|
||||
ClLime()//跌颜色
|
||||
),
|
||||
gffill(), ifThen3(Close(), Open(), flClear(), flSolid(), flSolid())
|
||||
);
|
||||
t2 := NDay2('MA10', Ma(Close(), 10));
|
||||
g1 := Graph(gtKline(), 'KLine', t1);
|
||||
g2 := Graph(gtline(), 'MA10', t2);
|
||||
return graphgroup(g1, g2);
|
||||
```
|
||||
|
||||
结果:
|
||||
|
||||
范例二:
|
||||
|
||||
```text
|
||||
//折线图
|
||||
|
||||
setsysparam(pn_stock(),'SZ000002');
|
||||
|
||||
setsysparam(pn_date(),inttodate(20140117));
|
||||
|
||||
setsysparam(pn_nday(),250);
|
||||
|
||||
GData1:=Nday2(gfclose(),close());
|
||||
|
||||
GData2:=Nday2('MA5',MA(close(),5));
|
||||
|
||||
GData3:=Nday2('MA20',MA(close(),20));
|
||||
|
||||
g1:=graph( gtLine(),gfclose(), Gdata1, gfColor() , clBlue());
|
||||
|
||||
g2:=graph( gtLine(),"MA5", Gdata2, gfColor() , clGreen());
|
||||
|
||||
g3:=graph( gtLine(),"MA20", Gdata3, gfColor() , clRed());
|
||||
|
||||
return graphgroup(g1,g2,g3);
|
||||
```tsl
|
||||
// 折线图
|
||||
setsysparam(pn_stock(), 'SZ000002');
|
||||
setsysparam(pn_date(), inttodate(20140117));
|
||||
setsysparam(pn_nday(), 250);
|
||||
GData1 := Nday2(gfclose(), close());
|
||||
GData2 := Nday2('MA5', MA(close(), 5));
|
||||
GData3 := Nday2('MA20', MA(close(), 20));
|
||||
g1 := Graph( gtLine(), gfclose(), Gdata1, gfColor() , clBlue());
|
||||
g2 := Graph( gtLine(), "MA5", Gdata2, gfColor() , clGreen());
|
||||
g3 := Graph( gtLine(), "MA20", Gdata3, gfColor() , clRed());
|
||||
return graphgroup(g1, g2, g3);
|
||||
```
|
||||
|
||||
结果:
|
||||
|
||||
参考GraphGroup DecodeGraphGroup EncodeGraphGroup DecodeGraph EncodeGraph
|
||||
|
||||
###### GraphGroup
|
||||
|
||||
用途:作图函数相关函数。
|
||||
参数:arg1,arg2,arg3,arg4(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
VolData := Nday2(GfVol() , Vol() , gfColor() , ifthen ( Close()> Open() , ClRed() , ClGreen() ) );
|
||||
|
||||
```tsl
|
||||
VolData := Nday2(GfVol() , Vol() , gfColor() , ifthen ( Close() > Open() , ClRed() , ClGreen() ) );
|
||||
MAVOL := Nday2('MA5', MA ( Vol() , 5 ) );
|
||||
|
||||
VOLGraph:=Graph(gtBar(),'VOLGraph',VolData);
|
||||
|
||||
MAVOLGraph:=Graph(gtLine(),'MA5Graph',MAVOL,gfColor(),clBlue());
|
||||
|
||||
Return GraphGroup(VOLGraph,MAVOLGraph,gfMinValue(),0);
|
||||
VOLGraph := Graph(gtBar(), 'VOLGraph', VolData);
|
||||
MAVOLGraph := Graph(gtLine(), 'MA5Graph', MAVOL, gfColor(), clBlue());
|
||||
return GraphGroup(VOLGraph, MAVOLGraph, gfMinValue(), 0);
|
||||
```
|
||||
|
||||
结果:
|
||||
|
||||
结果说明:GraphGroup包含了两个TGraph图形,一个是VOLGraph成交量图形,另一个是MAVOLGraph成交量的5日均线的折线图形。这两个图形具有的共有属性是gfMinValue(),就是最小值为0。gfColor在VolData中作为了数据字段,用来指示每一个数据点的颜色。因此柱子会根据开盘和收盘的差异来决定色彩的显示。而在MAVOLGraph又作为了图形的属性,因此MAVOLGraph在显示的时候会呈现出蓝色。gfMinValue在返回的图形组合里作为了图形组合的属性,因此决定了图形会用0来作为最小的值来显示,而不会用区间内的最小成交量作为最小值显示。
|
||||
|
||||
|
|
@ -135,223 +108,162 @@ DecodeGraphGroup EncodeGraphGroup DecodeGraph EncodeGraph
|
|||
|
||||
###### MergeGraph
|
||||
|
||||
用途:作图函数相关函数。
|
||||
参数:arg1,arg2,arg3,arg4(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
setsysparam(pn_stock(),'SZ000063');
|
||||
|
||||
setsysparam(pn_date(),20190301T);
|
||||
|
||||
setsysparam(pn_nday(),100);
|
||||
|
||||
t1:=NDay2(gfopen(), Open() ,
|
||||
|
||||
gfclose(), close(),
|
||||
|
||||
gfhigh(), high(),
|
||||
|
||||
gflow(), low(),
|
||||
|
||||
gftime(), datetimetostr(sp_time()),
|
||||
|
||||
//KLine颜色
|
||||
|
||||
gfColor(), IfThen3(Close(), Open(),
|
||||
|
||||
ClRed() , //涨颜色
|
||||
|
||||
clYellow() , //平颜色
|
||||
|
||||
ClLime() //跌颜色
|
||||
|
||||
),
|
||||
|
||||
gffill(),ifThen3(Close(), Open(), flClear(), flSolid(),flSolid())
|
||||
|
||||
);
|
||||
|
||||
t2:=NDay2('MA5',Ma(Close(),5)); //5日均线
|
||||
|
||||
t3:=NDay2('MA10',Ma(Close(),10)); //10日均线
|
||||
|
||||
t4:=NDay2('MA20',Ma(Close(),20)); //20日均线
|
||||
|
||||
g1:=graph(gtKline(),'KLine',t1);
|
||||
|
||||
g2:=graph(gtline(),'MA5',t2);
|
||||
|
||||
g3:=graph(gtline(),'MA10',t3);
|
||||
|
||||
g4:=graph(gtline(),'MA20',t4);
|
||||
|
||||
return MergeGraph(g1,g2,g3,g4);
|
||||
```tsl
|
||||
setsysparam(pn_stock(), 'SZ000063');
|
||||
setsysparam(pn_date(), 20190301T);
|
||||
setsysparam(pn_nday(), 100);
|
||||
t1 := NDay2(gfopen(), Open() ,
|
||||
gfclose(), close(),
|
||||
gfhigh(), high(),
|
||||
gflow(), low(),
|
||||
gftime(), datetimetostr(sp_time()),
|
||||
// KLine颜色
|
||||
gfColor(), IfThen3(Close(), Open(),
|
||||
ClRed() ,//涨颜色
|
||||
clYellow() ,//平颜色
|
||||
ClLime()//跌颜色
|
||||
),
|
||||
gffill(), ifThen3(Close(), Open(), flClear(), flSolid(), flSolid())
|
||||
);
|
||||
t2 := NDay2('MA5', Ma(Close(), 5)); // 5日均线
|
||||
t3 := NDay2('MA10', Ma(Close(), 10)); // 10日均线
|
||||
t4 := NDay2('MA20', Ma(Close(), 20)); // 20日均线
|
||||
g1 := graph(gtKline(), 'KLine', t1);
|
||||
g2 := graph(gtline(), 'MA5', t2);
|
||||
g3 := graph(gtline(), 'MA10', t3);
|
||||
g4 := graph(gtline(), 'MA20', t4);
|
||||
return MergeGraph(g1, g2, g3, g4);
|
||||
```
|
||||
|
||||
返回:
|
||||
|
||||
###### EncodeGraphGroup
|
||||
|
||||
用途:作图函数相关函数。
|
||||
参数:arg1,arg2(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
//取万科A 截止至2014年1月17日的250个交易日的K线数据与10日移动平均数据的图形组合
|
||||
|
||||
setsysparam(pn_stock(),'SZ000002');
|
||||
|
||||
setsysparam(pn_date(),inttodate(20140117));
|
||||
|
||||
setsysparam(pn_nday(),250);
|
||||
|
||||
t1:=NDay2(gfopen(), Open() ,
|
||||
|
||||
gfclose(), close(),
|
||||
|
||||
gfhigh(), high(),
|
||||
|
||||
gflow(), low(),
|
||||
|
||||
gftime(), datetimetostr(sp_time()),
|
||||
|
||||
//KLine颜色
|
||||
|
||||
gfColor(), IfThen3(Close(), Open(),
|
||||
|
||||
ClRed() , //涨颜色
|
||||
|
||||
clYellow() , //平颜色
|
||||
|
||||
Clblue() //跌颜色
|
||||
|
||||
),
|
||||
|
||||
gffill(),ifThen3(Close(), Open(), flClear(), flSolid(),flSolid())
|
||||
|
||||
);
|
||||
|
||||
t2:=NDay2('MA10',Ma(Close(),10));
|
||||
|
||||
g1:=graph(gtKline(),'KLine',t1);
|
||||
|
||||
g2:=graph(gtline(),'MA10',t2);
|
||||
|
||||
return EncodeGraphGroup(array(g1,g2),array());
|
||||
```tsl
|
||||
// 取万科A 截止至2014年1月17日的250个交易日的K线数据与10日移动平均数据的图形组合
|
||||
setsysparam(pn_stock(), 'SZ000002');
|
||||
setsysparam(pn_date(), inttodate(20140117));
|
||||
setsysparam(pn_nday(), 250);
|
||||
t1 := NDay2(gfopen(), Open() ,
|
||||
gfclose(), close(),
|
||||
gfhigh(), high(),
|
||||
gflow(), low(),
|
||||
gftime(), datetimetostr(sp_time()),
|
||||
// KLine颜色
|
||||
gfColor(), IfThen3(Close(), Open(),
|
||||
ClRed() ,//涨颜色
|
||||
clYellow() ,//平颜色
|
||||
Clblue()//跌颜色
|
||||
),
|
||||
gffill(), ifThen3(Close(), Open(), flClear(), flSolid(), flSolid())
|
||||
);
|
||||
t2 := NDay2('MA10', Ma(Close(), 10));
|
||||
g1 := graph(gtKline(), 'KLine', t1);
|
||||
g2 := graph(gtline(), 'MA10', t2);
|
||||
return EncodeGraphGroup(array(g1, g2), array());
|
||||
```
|
||||
|
||||
结果:
|
||||
|
||||
参考Graph GraphGroup DecodeGraphGroup DecodeGraph EncodeGraph
|
||||
|
||||
###### DecodeGraphGroup
|
||||
|
||||
用途:作图函数相关函数。
|
||||
参数:arg1,arg2,arg3(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
VolData := Nday2(GfVol() , Vol() , gfColor() , ifthen ( Close()> Open() , ClRed() , ClGreen() ) );
|
||||
|
||||
```tsl
|
||||
VolData := Nday2(GfVol() , Vol() , gfColor() , ifthen ( Close() > Open() , ClRed() , ClGreen() ) );
|
||||
MAVOL := Nday2('MA5', MA ( Vol() , 5 ) );
|
||||
|
||||
VOLGraph:=Graph(gtBar(),'VOLGraph',VolData);
|
||||
|
||||
MAVOLGraph:=Graph(gtLine(),'MA5Graph',MAVOL,gfColor(),clBlue());
|
||||
|
||||
DATAARR:=GraphGroup(VOLGraph,MAVOLGraph,gfMinValue(),0);
|
||||
|
||||
DecodeGraphGroup(DATAARR,x,y);
|
||||
|
||||
return x;//返回分解后的柱状图
|
||||
VOLGraph := Graph(gtBar(), 'VOLGraph', VolData);
|
||||
MAVOLGraph := Graph(gtLine(), 'MA5Graph', MAVOL, gfColor(), clBlue());
|
||||
DATAARR := GraphGroup(VOLGraph, MAVOLGraph, gfMinValue(), 0);
|
||||
DecodeGraphGroup(DATAARR, x, y);
|
||||
return x; // 返回分解后的柱状图
|
||||
```
|
||||
|
||||
结果:
|
||||
|
||||
参考Graph GraphGroup EncodeGraphGroup DecodeGraph EncodeGraph
|
||||
|
||||
###### DecodeGraph
|
||||
|
||||
用途:作图函数相关函数。
|
||||
参数:arg1,arg2,arg3,arg4,arg5(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
setsysparam(pn_stock(),'SZ000002');
|
||||
|
||||
setsysparam(pn_date(),inttodate(20140117));
|
||||
|
||||
setsysparam(pn_nday(),250);
|
||||
|
||||
t1:=NDay2(gfopen(), Open() ,
|
||||
|
||||
gfclose(), close(),
|
||||
|
||||
gfhigh(), high(),
|
||||
|
||||
gflow(), low(),
|
||||
|
||||
gftime(), datetimetostr(sp_time()),
|
||||
|
||||
//KLine颜色
|
||||
|
||||
gfColor(), IfThen3(Close(), Open(),
|
||||
|
||||
ClRed() , //涨颜色
|
||||
|
||||
clYellow() , //平颜色
|
||||
|
||||
Clblue() //跌颜色
|
||||
|
||||
),
|
||||
|
||||
gffill(),ifThen3(Close(), Open(), flClear(), flSolid(),flSolid())
|
||||
|
||||
);
|
||||
|
||||
g1:=graph(gtKline(),'KLine',t1);
|
||||
|
||||
DecodeGraph(g1,ty,na,da,pr);
|
||||
|
||||
return array(ty,na,da,pr);
|
||||
```tsl
|
||||
setsysparam(pn_stock(), 'SZ000002');
|
||||
setsysparam(pn_date(), inttodate(20140117));
|
||||
setsysparam(pn_nday(), 250);
|
||||
t1 := NDay2(gfopen(), Open() ,
|
||||
gfclose(), close(),
|
||||
gfhigh(), high(),
|
||||
gflow(), low(),
|
||||
gftime(), datetimetostr(sp_time()),
|
||||
// KLine颜色
|
||||
gfColor(), IfThen3(Close(), Open(),
|
||||
ClRed() ,//涨颜色
|
||||
clYellow() ,//平颜色
|
||||
Clblue()//跌颜色
|
||||
),
|
||||
gffill(), ifThen3(Close(), Open(), flClear(), flSolid(), flSolid())
|
||||
);
|
||||
g1 := graph(gtKline(), 'KLine', t1);
|
||||
DecodeGraph(g1, ty, na, da, pr);
|
||||
return array(ty, na, da, pr);
|
||||
```
|
||||
|
||||
参考Graph GraphGroup DecodeGraphGroup EncodeGraphGroup EncodeGraph
|
||||
|
||||
###### EncodeGraph
|
||||
|
||||
用途:作图函数相关函数。
|
||||
参数:arg1,arg2,arg3,arg4(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
setsysparam(pn_stock(),'SZ000002');
|
||||
|
||||
setsysparam(pn_date(),inttodate(20140117));
|
||||
|
||||
setsysparam(pn_nday(),250);
|
||||
|
||||
t1:=NDay2(gfopen(), Open() ,
|
||||
|
||||
gfclose(), close(),
|
||||
|
||||
gfhigh(), high(),
|
||||
|
||||
gflow(), low(),
|
||||
|
||||
gftime(), datetimetostr(sp_time()),
|
||||
|
||||
//KLine颜色
|
||||
|
||||
gfColor(), IfThen3(Close(), Open(),
|
||||
|
||||
ClRed() , //涨颜色
|
||||
|
||||
clYellow() , //平颜色
|
||||
|
||||
Clblue() //跌颜色
|
||||
|
||||
),
|
||||
|
||||
gffill(),ifThen3(Close(), Open(), flClear(), flSolid(),flSolid())
|
||||
|
||||
);
|
||||
|
||||
return EncodeGraph(gtkline(),'KLine',t1,array());
|
||||
```tsl
|
||||
setsysparam(pn_stock(), 'SZ000002');
|
||||
setsysparam(pn_date(), inttodate(20140117));
|
||||
setsysparam(pn_nday(), 250);
|
||||
t1 := NDay2(gfopen(), Open() ,
|
||||
gfclose(), close(),
|
||||
gfhigh(), high(),
|
||||
gflow(), low(),
|
||||
gftime(), datetimetostr(sp_time()),
|
||||
// KLine颜色
|
||||
gfColor(), IfThen3(Close(), Open(),
|
||||
ClRed() ,//涨颜色
|
||||
clYellow() ,//平颜色
|
||||
Clblue()//跌颜色
|
||||
),
|
||||
gffill(), ifThen3(Close(), Open(), flClear(), flSolid(), flSolid())
|
||||
);
|
||||
return EncodeGraph(gtkline(), 'KLine', t1, array());
|
||||
```
|
||||
|
||||
结果:
|
||||
|
||||
参考Graph GraphGroup DecodeGraphGroup EncodeGraphGroup DecodeGraph
|
||||
|
||||
|
|
@ -375,12 +287,16 @@ return EncodeGraph(gtkline(),'KLine',t1,array());
|
|||
|
||||
###### GetColorByIndex
|
||||
|
||||
用途:作图函数相关函数。
|
||||
参数:arg1(按示例顺序传入)。
|
||||
返回:整数。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
```tsl
|
||||
return GetColorByIndex(1);
|
||||
|
||||
//返回:16711680
|
||||
// 返回:16711680
|
||||
```
|
||||
|
||||
##### 图形类型函数
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -24,9 +24,14 @@
|
|||
|
||||
###### LoadTableEx
|
||||
|
||||
用途:自有数据维护函数相关函数。
|
||||
参数:arg1(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
```tsl
|
||||
return LoadTableEx('repitle');
|
||||
```
|
||||
|
||||
|
|
@ -42,54 +47,77 @@ return LoadTableEx('repitle');
|
|||
|
||||
####### UserDataUpLoad
|
||||
|
||||
用途:自有数据维护函数相关函数。
|
||||
参数:
|
||||
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
//dir为用户本地用户数据的存贮目录
|
||||
|
||||
Filedir:='C:\\Users\\xxxx\\Tinysoft\\Analyse.NET\\D254A848\\xxx\\UserDB\\hex_74657374646174613031.stm';
|
||||
|
||||
return UserDataUpLoad(Filedir); //返回上传结果提示信息。
|
||||
```tsl
|
||||
// dir为用户本地用户数据的存贮目录
|
||||
Filedir := 'C:\\Users\\xxxx\\Tinysoft\\Analyse.NET\\D254A848\\xxx\\UserDB\\hex_74657374646174613031.stm';
|
||||
return UserDataUpLoad(Filedir); // 返回上传结果提示信息。
|
||||
```
|
||||
|
||||
####### HexToString
|
||||
|
||||
用途:将输入值转换为字符串。
|
||||
参数:
|
||||
|
||||
返回:字符串。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
//将用户数据名转化为可读串
|
||||
|
||||
str:='hex_74657374646174613031.stm';
|
||||
|
||||
return HexToString(str); //返回testdata01
|
||||
```tsl
|
||||
// 将用户数据名转化为可读串
|
||||
str := 'hex_74657374646174613031.stm';
|
||||
return HexToString(str); // 返回testdata01
|
||||
```
|
||||
|
||||
####### TransFileName
|
||||
|
||||
用途:自有数据维护函数相关函数。
|
||||
参数:
|
||||
|
||||
返回:整数。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
//获取本地用户数据列表
|
||||
|
||||
dir:='C:\\Users\\xxxx\\Tinysoft\\Analyse.NET\\D254A848\\xxx\\UserDB';
|
||||
|
||||
return TransFileName(dir); //返回用户数据列表
|
||||
```tsl
|
||||
// 获取本地用户数据列表
|
||||
dir := 'C:\\Users\\xxxx\\Tinysoft\\Analyse.NET\\D254A848\\xxx\\UserDB';
|
||||
return TransFileName(dir); // 返回用户数据列表
|
||||
```
|
||||
|
||||
###### LoadTable
|
||||
|
||||
用途:自有数据维护函数相关函数。
|
||||
参数:
|
||||
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
//将savetable范例中保存的用户数据testA提取出来
|
||||
|
||||
Return loadTable('testA');
|
||||
```tsl
|
||||
// 将savetable范例中保存的用户数据testA提取出来
|
||||
return LoadTable('testA');
|
||||
```
|
||||
|
||||
参考TestTable SaveTable ListTable DeleteTable
|
||||
|
||||
###### SaveTable
|
||||
|
||||
用途:自有数据维护函数相关函数。
|
||||
参数:
|
||||
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
注意:
|
||||
|
||||
在保存用户数据的时候可以分目录保存,只需在目录层次间添加‘\\’即可;在不同的目录下可以将数据保存为相同的数据名称。
|
||||
|
|
@ -100,30 +128,22 @@ Return loadTable('testA');
|
|||
|
||||
范例一:直接在根目录下保存
|
||||
|
||||
```text
|
||||
//将r保存为用户数据testA
|
||||
|
||||
r:=rand(10,10);
|
||||
|
||||
Return savetable('testA',r);
|
||||
|
||||
//结果:-1
|
||||
```tsl
|
||||
// 将r保存为用户数据testA
|
||||
r := rand(10, 10);
|
||||
return SaveTable('testA', r);
|
||||
// 结果:-1
|
||||
```
|
||||
|
||||
范例二:保存到指定目录下
|
||||
|
||||
```text
|
||||
//将生成的10行10列的随机数据保存到目录:mydata\目录下,保存
|
||||
|
||||
//文件名称为testA
|
||||
|
||||
r:=rand(10,10);
|
||||
|
||||
ret:=savetable('mydata\\testA',r);
|
||||
|
||||
```tsl
|
||||
// 将生成的10行10列的随机数据保存到目录:mydata\目录下,保存
|
||||
// 文件名称为testA
|
||||
r := rand(10, 10);
|
||||
ret := SaveTable('mydata\\testA', r);
|
||||
return ret;
|
||||
|
||||
//结果:-1
|
||||
// 结果:-1
|
||||
```
|
||||
|
||||
用户数据的查看:
|
||||
|
|
@ -132,16 +152,12 @@ return ret;
|
|||
|
||||
范例三:新旧流格式数据保存操作及结果对比,在新版客户端+下一代服务器下执行以下操作
|
||||
|
||||
```text
|
||||
t:=getdatademo();//返回一个数组--测试者数据举例
|
||||
|
||||
r1:= savetable("TestSTData01",t);//缺省情况下保存用户数据
|
||||
|
||||
r2:= savetable("TestSTData02",t,0);//指定保存为原始流格式
|
||||
|
||||
r3:= savetable("TestSTData03",t,1);//指定保存为新流格式
|
||||
|
||||
return array(r1,r2,r3);
|
||||
```tsl
|
||||
t := getdatademo(); // 返回一个数组--测试者数据举例
|
||||
r1 := SaveTable("TestSTData01", t); // 缺省情况下保存用户数据
|
||||
r2 := SaveTable("TestSTData02", t, 0); // 指定保存为原始流格式
|
||||
r3 := SaveTable("TestSTData03", t, 1); // 指定保存为新流格式
|
||||
return array(r1, r2, r3);
|
||||
```
|
||||
|
||||
保存后,用户数据中列表大小显示如下:新流格式数据大小为源始流格式的55%,数据大小有明显的变小
|
||||
|
|
@ -158,21 +174,32 @@ return array(r1,r2,r3);
|
|||
|
||||
###### TestTable
|
||||
|
||||
用途:自有数据维护函数相关函数。
|
||||
参数:
|
||||
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
Return testTable('testA');//测试用户数据"testA"是否存在。返回值为1,即存在,0即不存在。
|
||||
```tsl
|
||||
return TestTable('testA'); // 测试用户数据"testA"是否存在。返回值为1,即存在,0即不存在。
|
||||
```
|
||||
|
||||
参考SaveTable LoadTable ListTable DeleteTable
|
||||
|
||||
###### SaveBk
|
||||
|
||||
用途:自有数据维护函数相关函数。
|
||||
参数:
|
||||
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
SaveBk("MySector","我的一级分类\\我的二级分类",Array("SZ000001","SZ000002"));
|
||||
|
||||
```tsl
|
||||
SaveBk("MySector", "我的一级分类\\我的二级分类", array("SZ000001", "SZ000002"));
|
||||
{在"我的一级分类\\我的二级分类"目录生成一个名为"MySector "的板块,该板块的成分为SZ000001,SZ000002}
|
||||
```
|
||||
|
||||
|
|
@ -180,10 +207,16 @@ SaveBk("MySector","我的一级分类\\我的二级分类",Array("SZ000001","SZ0
|
|||
|
||||
###### DeleteBk
|
||||
|
||||
用途:自有数据维护函数相关函数。
|
||||
参数:
|
||||
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
DeleteBk ("MySector");
|
||||
```tsl
|
||||
DeleteBk("MySector");
|
||||
```
|
||||
|
||||
参考SaveBk
|
||||
|
|
@ -191,9 +224,14 @@ http://www.tinysoft.com.cn/TSDN/HelpDoc/SearchContent.tsl?r=ref&KeyWord=
|
|||
|
||||
###### ListTable
|
||||
|
||||
用途:自有数据维护函数相关函数。
|
||||
参数:无。
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
```tsl
|
||||
return ListTable();
|
||||
```
|
||||
|
||||
|
|
@ -203,42 +241,36 @@ return ListTable();
|
|||
|
||||
###### DeleteTable
|
||||
|
||||
用途:自有数据维护函数相关函数。
|
||||
参数:
|
||||
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
范例一:删除指定目录下的用户数据
|
||||
|
||||
```text
|
||||
//删除存在目录:“mydata\目录下”的用户数据testA
|
||||
|
||||
ret:=deleteTable('mydata\\testA');
|
||||
|
||||
```tsl
|
||||
// 删除存在目录:“mydata\目录下”的用户数据testA
|
||||
ret := DeleteTable('mydata\\testA');
|
||||
return ret;
|
||||
|
||||
//结果:-1
|
||||
// 结果:-1
|
||||
```
|
||||
|
||||
范例二:删除同一规则命名的用户数据
|
||||
|
||||
```text
|
||||
//删除存在目录:“mydata\目录下”以test开头命名的用户数据
|
||||
|
||||
data:= listTable();
|
||||
|
||||
for i:=0 to length(data)-1 do
|
||||
|
||||
begin
|
||||
|
||||
if pos('mydata\\test',data[i])>0 then
|
||||
|
||||
begin
|
||||
|
||||
deleteTable(data[i]);
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
return listtable();
|
||||
```tsl
|
||||
// 删除存在目录:“mydata\目录下”以test开头命名的用户数据
|
||||
data := listTable();
|
||||
for i := 0 to length(data) - 1 do
|
||||
begin
|
||||
if pos('mydata\\test', data[i]) > 0 then
|
||||
begin
|
||||
DeleteTable(data[i]);
|
||||
end;
|
||||
end;
|
||||
return listtable();
|
||||
```
|
||||
|
||||
参考TestTable SaveTable LoadTable ListTable
|
||||
|
|
@ -264,57 +296,68 @@ deleteTable(data[i]);
|
|||
|
||||
###### tsAppServer
|
||||
|
||||
用途:平台执行信息相关函数。
|
||||
参数:无。
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
a:=rand(10,10);
|
||||
|
||||
|
||||
```tsl
|
||||
a := rand(10, 10);
|
||||
return tsAppServer();
|
||||
|
||||
|
||||
//结果:192.168.101.45:3328(Z:\server\bin5)
|
||||
// 结果:192.168.101.45:3328(Z:\server\bin5)
|
||||
```
|
||||
|
||||
###### TsAppServerName
|
||||
|
||||
用途:平台执行信息相关函数。
|
||||
参数:无。
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
```tsl
|
||||
return TsAppServerName();
|
||||
```
|
||||
|
||||
//结果:192.168.101.26:z:\server\bin\exec64.exe
|
||||
结果:192.168.101.26:z:\server\bin\exec64.exe
|
||||
|
||||
###### SendToClient
|
||||
|
||||
用途:平台执行信息相关函数。
|
||||
参数:
|
||||
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
//1)执行命令:return 100+1
|
||||
|
||||
return SendToClient("getdo","return 100 + 1;",nil,nil);
|
||||
|
||||
//结果:101
|
||||
|
||||
//2)采用系统参数取得数据,将取得的数据相加,并设置超时时间为30s
|
||||
|
||||
return SendToClient("getdo","return getsysparam('a') + getsysparam('b');",nil,array("a":10,"b":30),30);
|
||||
|
||||
//结果:40
|
||||
```tsl
|
||||
// 1)执行命令:return 100+1
|
||||
return SendToClient("getdo", "return 100 + 1;", nil, nil);
|
||||
// 结果:101
|
||||
// 2)采用系统参数取得数据,将取得的数据相加,并设置超时时间为30s
|
||||
return SendToClient("getdo", "return getsysparam('a') + getsysparam('b');", nil, array("a":10, "b":30), 30);
|
||||
// 结果:40
|
||||
```
|
||||
|
||||
参考平台和客户端交互。
|
||||
|
||||
###### TS_ModuleInfo
|
||||
|
||||
用途:平台执行信息相关函数。
|
||||
参数:无。
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
```tsl
|
||||
return TS_ModuleInfo();
|
||||
```
|
||||
|
||||
//结果:
|
||||
|
||||
差异说明Windows:任何版本。
|
||||
|
||||
|
|
@ -335,19 +378,21 @@ Linux:自2024-07-10之后的版本,开始支持;之前的版本不支持
|
|||
|
||||
###### User
|
||||
|
||||
用途:用户和函数相关函数相关函数。
|
||||
参数:
|
||||
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
//执行用户jrtzsupport 共享的大师策略的函数Show_DSXG_211
|
||||
|
||||
begt:=inttodate(20130101);
|
||||
|
||||
endt:=inttodate(20140101);
|
||||
|
||||
return user('jrtzsupport').Show_DSXG_211(begt,endt,0);
|
||||
```tsl
|
||||
// 执行用户jrtzsupport 共享的大师策略的函数Show_DSXG_211
|
||||
begt := inttodate(20130101);
|
||||
endt := inttodate(20140101);
|
||||
return User('jrtzsupport').Show_DSXG_211(begt, endt, 0);
|
||||
```
|
||||
|
||||
结果:
|
||||
|
||||
参考SYSTEM
|
||||
|
||||
|
|
@ -387,25 +432,18 @@ return user('jrtzsupport').Show_DSXG_211(begt,endt,0);
|
|||
|
||||
我们看一个案例,这个案例就是获得每个股票的Beta值:
|
||||
|
||||
Stks:=GetBk("深证A股;上证A股");
|
||||
|
||||
Result:=Array();
|
||||
|
||||
for i:=0 to length(Stks)-1 do
|
||||
|
||||
```tsl
|
||||
Stks := GetBk("深证A股;上证A股");
|
||||
Result := array();
|
||||
for i := 0 to length(Stks) - 1 do
|
||||
begin
|
||||
|
||||
SetSysParam(pn_Stock(),Stks[i]);
|
||||
|
||||
Result[i]["StockID"]:=Stks[i];
|
||||
|
||||
Result[i]["Beta"]:= StockBeta4("SH000300",10); //最近一年的Beta
|
||||
|
||||
Echo Result[i]["StockID"],"->",Result[i]["Beta"];
|
||||
|
||||
SetSysParam(pn_Stock(), Stks[i]);
|
||||
Result[i]["StockID"] := Stks[i];
|
||||
Result[i]["Beta"] := StockBeta4("SH000300", 10); // 最近一年的Beta
|
||||
Echo Result[i]["StockID"], "->", Result[i]["Beta"];
|
||||
end;
|
||||
|
||||
Return Result;
|
||||
return Result;
|
||||
```
|
||||
|
||||
由于调用Beta的时候,计算效率会稍微低,我们利用Echo把当前运行的信息打印到了客户端,客户端的窗口内容如下:
|
||||
|
||||
|
|
@ -413,25 +451,18 @@ Return Result;
|
|||
|
||||
对于运行中间得到的结果是一个复杂结果的,例如数组等内容,那么就没办法直接Echo这个结果,这就要结合tostn函数来输出调试了。
|
||||
|
||||
Stks:=GetBk("深证A股;上证A股");
|
||||
|
||||
Result:=Array();
|
||||
|
||||
for i:=0 to length(Stks)-1 do
|
||||
|
||||
```tsl
|
||||
Stks := GetBk("深证A股;上证A股");
|
||||
Result := array();
|
||||
for i := 0 to length(Stks) - 1 do
|
||||
begin
|
||||
|
||||
SetSysParam(pn_Stock(),Stks[i]);
|
||||
|
||||
Result[i]["StockID"]:=Stks[i];
|
||||
|
||||
Result[i]["Beta"]:= StockBeta4("SH000300",10); //最近一年的Beta
|
||||
|
||||
Echo tostn(Result);
|
||||
|
||||
SetSysParam(pn_Stock(), Stks[i]);
|
||||
Result[i]["StockID"] := Stks[i];
|
||||
Result[i]["Beta"] := StockBeta4("SH000300", 10); // 最近一年的Beta
|
||||
Echo tostn(Result);
|
||||
end;
|
||||
|
||||
Return Result;
|
||||
return Result;
|
||||
```
|
||||
|
||||
每一行的内容会显示在右边部分,这个时候我们可以利用转换数据按钮把字符串以数据的方式来显示。
|
||||
|
||||
|
|
@ -449,25 +480,16 @@ Return Result;
|
|||
|
||||
例如:我们在运行的时候要导出一组股票的交易明细数据到客户机上。
|
||||
|
||||
```text
|
||||
Stks:=GetBK("深证A股;上证A股");
|
||||
|
||||
Day:=Today();
|
||||
|
||||
for i:=0 to length(Stks)-1 do
|
||||
|
||||
```tsl
|
||||
Stks := GetBK("深证A股;上证A股");
|
||||
Day := Today();
|
||||
for i := 0 to length(Stks) - 1 do
|
||||
begin
|
||||
|
||||
SetSysParam(pn_Stock(),Stks[i]);
|
||||
|
||||
if not isTradeDay(Day) then continue;//如果没有交易则下一个
|
||||
|
||||
Data:=select DateTimeToStr(["date"]) as "Time",["close"],["vol"] from tradetable DateKey Day to Day+1 of Stks[i] where ["vol"]>0 end; //取出时间,收盘价,成交量
|
||||
|
||||
|
||||
RDo2
|
||||
ExportFile(ftCSV(),"","C:\\DataStore\\"+IntToStr(DateToInt(Day))+"\\"+Stks[i]+".csv",Data);//导出数据
|
||||
|
||||
SetSysParam(pn_Stock(), Stks[i]);
|
||||
if not isTradeDay(Day) then continue; // 如果没有交易则下一个
|
||||
Data := select DateTimeToStr(["date"]) as"Time", ["close"], ["vol"] from tradetable DateKey Day to Day + 1 of Stks[i] where ["vol"] > 0 end; // 取出时间,收盘价,成交量
|
||||
RDo2
|
||||
ExportFile(ftCSV(), "", "C:\\DataStore\\" + IntToStr(DateToInt(Day)) + "\\" + Stks[i] + ".csv", Data); // 导出数据
|
||||
end;
|
||||
```
|
||||
|
||||
|
|
@ -511,7 +533,7 @@ RDo2调用的默认是300秒超时的,也就是说默认情况下当客户端
|
|||
|
||||
如果需要设置超时的时间,可以用TimeOut来设置超时,例如RDo2
|
||||
ImportFile(ftCsv(),"","C:\\1.csv",Data) TimeOut 30;
|
||||
//调用ImportFile函数的超时时间为30秒。
|
||||
调用ImportFile函数的超时时间为30秒。
|
||||
|
||||
参考:RDo,RDo2
|
||||
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -43,44 +43,42 @@ version=3
|
|||
|
||||
###### PyRun
|
||||
|
||||
用途:Python支持函数相关函数。
|
||||
参数:arg1(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
s:="a=1
|
||||
|
||||
b=1
|
||||
|
||||
if a==1:
|
||||
|
||||
b=2
|
||||
|
||||
```tsl
|
||||
s := "a=1
|
||||
b := 1
|
||||
if a == 1:
|
||||
b := 2
|
||||
";
|
||||
|
||||
pyrun(s);
|
||||
|
||||
return array("a":pygetvar("a"),"b":pygetvar("b"));
|
||||
PyRun(s);
|
||||
return array("a":pygetvar("a"), "b":pygetvar("b"));
|
||||
```
|
||||
|
||||
本地执行返回结果:
|
||||
|
||||
###### PyCall
|
||||
|
||||
用途:Python支持函数相关函数。
|
||||
参数:arg1,arg2,arg3,arg4(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
```tsl
|
||||
rdo2 PyRun("import numpy");
|
||||
|
||||
//不给状态值,默认方式下调用python的randint函数
|
||||
|
||||
return rdo2 pycall('numpy.random','randint',6,9);
|
||||
|
||||
//参数通过数组方式传入
|
||||
|
||||
return pycall(2,'numpy.random','randint',array('high':9,'low':6));
|
||||
|
||||
//一个个指定参数方式传入
|
||||
|
||||
return pycall('numpy.random','randint',high:9,low:6);
|
||||
// 不给状态值,默认方式下调用python的randint函数
|
||||
return rdo2 PyCall('numpy.random', 'randint', 6, 9);
|
||||
// 参数通过数组方式传入
|
||||
return PyCall(2, 'numpy.random', 'randint', array('high':9, 'low':6));
|
||||
// 一个个指定参数方式传入
|
||||
return PyCall('numpy.random', 'randint', high:9, low:6);
|
||||
```
|
||||
|
||||
###### PyRelease
|
||||
|
|
@ -91,44 +89,36 @@ return pycall('numpy.random','randint',high:9,low:6);
|
|||
|
||||
例1:
|
||||
|
||||
```text
|
||||
a:=2;
|
||||
|
||||
pyputvar("a",a);//送入变量
|
||||
|
||||
pyrun("a = a+1"); //计算
|
||||
|
||||
b := pygetvar("a");//获取变量返回结果为 3
|
||||
|
||||
|
||||
例2:
|
||||
|
||||
PyRun("import math"); //执行python语句 :导入python的math模块
|
||||
|
||||
a := PyCall("math","sqrt",2) ; //a = 1.4142135623731
|
||||
|
||||
//调用math模块下的sqrt(开方)函数,参数为2;
|
||||
|
||||
b := PyCall("math","pow",2,3) ;//b = 8;
|
||||
|
||||
//调用math模块下的pow函数,参数为2,3 ;
|
||||
|
||||
Return C := a*b;
|
||||
```tsl
|
||||
a := 2;
|
||||
pyputvar("a", a); // 送入变量
|
||||
pyrun("a = a+1"); // 计算
|
||||
b := pygetvar("a"); // 获取变量返回结果为 3
|
||||
// 例2:
|
||||
PyRun("import math"); // 执行python语句 :导入python的math模块
|
||||
a := PyCall("math", "sqrt", 2); // a = 1.4142135623731
|
||||
// 调用math模块下的sqrt(开方)函数,参数为2;
|
||||
b := PyCall("math", "pow", 2, 3); // b = 8;
|
||||
// 调用math模块下的pow函数,参数为2,3;
|
||||
return C := a * b;
|
||||
```
|
||||
|
||||
###### PyError
|
||||
|
||||
用途:获取最近一次 Python 调用错误信息。
|
||||
参数:无。
|
||||
返回:错误信息字符串。
|
||||
|
||||
范例
|
||||
|
||||
本地执行以下脚本
|
||||
|
||||
```text
|
||||
pyrun("a=math.pi");//此处会报错因为没有 import math
|
||||
|
||||
return pyerror();
|
||||
```tsl
|
||||
pyrun("a=math.pi"); // 此处会报错因为没有 import math
|
||||
return PyError();
|
||||
```
|
||||
|
||||
//返回: name 'math' is not defined
|
||||
返回: name 'math' is not defined
|
||||
|
||||
##### R支持函数
|
||||
|
||||
|
|
@ -320,15 +310,11 @@ b:=RDO2 MGetVar("MatlabB");
|
|||
|
||||
范例代码:
|
||||
|
||||
```text
|
||||
t:=CreateMatrix(3,4,array('s','d','f'),1,2,3,4,5,6,7,8,9,10,11,12);
|
||||
|
||||
rdo2 mPutVar("A",t);
|
||||
|
||||
rdo2 mPutVar("B",2);
|
||||
|
||||
```tsl
|
||||
t := CreateMatrix(3, 4, array('s', 'd', 'f'), 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);
|
||||
rdo2 mPutVar("A", t);
|
||||
rdo2 mPutVar("B", 2);
|
||||
rdo2 mEval("C=A+B");
|
||||
|
||||
return rdo2 mGetVar("C");
|
||||
```
|
||||
|
||||
|
|
@ -360,36 +346,23 @@ return rdo2 mGetVar("C");
|
|||
|
||||
###### BLP测试范例
|
||||
|
||||
//下属例子为订阅两支指数的最新价格,价格到达则回调hello函数。
|
||||
|
||||
a:=array();
|
||||
|
||||
a[0]:=array("FSSTI Index", "LAST_PRICE");
|
||||
|
||||
a[1]:=array("DAX Index", "LAST_PRICE");
|
||||
|
||||
blpcall(array("maxEvent":300),"//blp/mktdata","subscription",a,"hello");
|
||||
下属例子为订阅两支指数的最新价格,价格到达则回调hello函数。
|
||||
|
||||
```tsl
|
||||
a := array();
|
||||
a[0] := array("FSSTI Index", "LAST_PRICE");
|
||||
a[1] := array("DAX Index", "LAST_PRICE");
|
||||
blpcall(array("maxEvent":300), "//blp/mktdata", "subscription", a, "hello");
|
||||
function hello(b);
|
||||
|
||||
begin
|
||||
|
||||
echo "-----------------------------------\r\n";
|
||||
|
||||
if b["type"]=8 and b["msgs"][0,"id"]="FSSTI Index" then
|
||||
|
||||
c[0,1]:=b["msgs"][0,"value"]["LAST_PRICE"];
|
||||
|
||||
else if b["type"]=8 and b["msgs"][0,"id"]="DAX Index" then
|
||||
|
||||
c[1,1]:=b["msgs"][0,"value"]["LAST_PRICE"];
|
||||
|
||||
echo tostn(c),"\r\n";
|
||||
|
||||
return 1; //return
|
||||
false退出,如果一直返回真,就等到接收到系统结束的事件或者事件数达到maxEvent的规定。
|
||||
|
||||
echo "-----------------------------------\r\n";
|
||||
if b["type"] = 8 and b["msgs"][0, "id"] = "FSSTI Index"then c[0, 1] := b["msgs"][0, "value"]["LAST_PRICE"];
|
||||
else if b["type"] = 8 and b["msgs"][0, "id"] = "DAX Index"then c[1, 1] := b["msgs"][0, "value"]["LAST_PRICE"];
|
||||
echo tostn(c), "\r\n";
|
||||
return 1; // return
|
||||
false退出, 如果一直返回真,就等到接收到系统结束的事件或者事件数达到maxEvent的规定。
|
||||
end;
|
||||
```
|
||||
|
||||
##### Html
|
||||
|
||||
|
|
@ -402,52 +375,67 @@ end;
|
|||
|
||||
###### TextToHtml
|
||||
|
||||
用途:Html相关函数。
|
||||
参数:
|
||||
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
Src:= "The First LETTER won\'t be replaced by \'one\', but the Second letter will.";
|
||||
|
||||
```tsl
|
||||
Src := "The First LETTER won\'t be replaced by \'one\', but the Second letter will.";
|
||||
return TextToHtml(Src);
|
||||
|
||||
//结果:
|
||||
|
||||
// 结果:
|
||||
The First LETTER won't be replaced by 'one', but the Second letter will.
|
||||
```
|
||||
|
||||
###### TextToURL
|
||||
|
||||
用途:Html相关函数。
|
||||
参数:
|
||||
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
ASrc:= "#abcd 10";
|
||||
|
||||
```tsl
|
||||
ASrc := "#abcd 10";
|
||||
return TextToURL(ASrc);
|
||||
|
||||
//结果:%23abcd%20%2010
|
||||
// 结果:%23abcd%20%2010
|
||||
```
|
||||
|
||||
###### HtmlToText
|
||||
|
||||
用途:Html相关函数。
|
||||
参数:
|
||||
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
Src:="The First LETTER won't be replaced by 'one', but the Second letter will.";
|
||||
|
||||
RETURN HtmlToText(Src);
|
||||
|
||||
//结果:The First LETTER won't be replaced by 'one', but the Second letter will.
|
||||
```tsl
|
||||
Src := "The First LETTER won't be replaced by 'one', but the Second letter will.";
|
||||
return HtmlToText(Src);
|
||||
// 结果:The First LETTER won't be replaced by 'one', but the Second letter will.
|
||||
```
|
||||
|
||||
###### URLToText
|
||||
|
||||
用途:Html相关函数。
|
||||
参数:
|
||||
|
||||
返回:处理后的结果值。
|
||||
|
||||
|
||||
范例
|
||||
|
||||
```text
|
||||
aSrc:= "%23abcd%20%2010";
|
||||
|
||||
```tsl
|
||||
aSrc := "%23abcd%20%2010";
|
||||
return URLToText(aSrc);
|
||||
|
||||
//结果:#abcd 10
|
||||
// 结果:#abcd 10
|
||||
```
|
||||
|
||||
##### do方式对外部语言的调用
|
||||
|
|
@ -472,19 +460,13 @@ return URLToText(aSrc);
|
|||
|
||||
下面是一个调python语言的示例:
|
||||
|
||||
```text
|
||||
a:=3;
|
||||
|
||||
c:=2;
|
||||
|
||||
do python in a name "A",out b,var c
|
||||
|
||||
```tsl
|
||||
a := 3;
|
||||
c := 2;
|
||||
do python in a name"A", out b, var c
|
||||
%%
|
||||
|
||||
c=A*c
|
||||
|
||||
b=c*c
|
||||
|
||||
c := A * c
|
||||
b := c * c
|
||||
%%;
|
||||
```
|
||||
|
||||
|
|
@ -512,9 +494,8 @@ COM的调用和TSL的对象的调用是没有差异的,也非常类似于PASCA
|
|||
|
||||
例如:
|
||||
|
||||
```text
|
||||
GetOleObject(“Excel.Application”,0,Obj);
|
||||
|
||||
```tsl
|
||||
GetOleObject(“Excel.Application”, 0, Obj);
|
||||
Obj.WorkBooks.Open(“C:\\1.xls”);
|
||||
```
|
||||
|
||||
|
|
@ -532,31 +513,22 @@ JAVA类型在TSL语言中是一个内置的对象。
|
|||
|
||||
==========tjclass的使用范例=============
|
||||
|
||||
```text
|
||||
systemClass:=new TJClass("java/lang/System");
|
||||
|
||||
properties:=systemClass.getProperties();
|
||||
|
||||
```tsl
|
||||
systemClass := new TJClass("java/lang/System");
|
||||
properties := systemClass.getProperties();
|
||||
systemClass.out.println(properties.getProperty("java.class.path"));
|
||||
```
|
||||
|
||||
==========tjobject使用范例==============
|
||||
|
||||
```text
|
||||
//构造StringBuffer对象
|
||||
|
||||
sbObj:=new TJObject("java/lang/StringBuffer", "hello world");
|
||||
|
||||
//调用对象的insert方法
|
||||
|
||||
ret:=sbObj.insert(6, "天软");
|
||||
|
||||
//调用toString方法
|
||||
|
||||
str:=sbObj.toString();
|
||||
|
||||
//显示: hello 天软 world
|
||||
|
||||
```tsl
|
||||
// 构造StringBuffer对象
|
||||
sbObj := new TJObject("java/lang/StringBuffer", "hello world");
|
||||
// 调用对象的insert方法
|
||||
ret := sbObj.insert(6, "天软");
|
||||
// 调用toString方法
|
||||
str := sbObj.toString();
|
||||
// 显示: hello 天软 world
|
||||
echo str, "\r\n";
|
||||
```
|
||||
|
||||
|
|
@ -572,28 +544,18 @@ JavaDecode来实现的
|
|||
|
||||
==============JavaEncode JavaDecode范例==================
|
||||
|
||||
```text
|
||||
//char[]构造, Unicode字符集, JavaEncode负责生成Unicode编码的char数组
|
||||
|
||||
charArr:=JavaEncode("chararray", "Tinysoft天软");
|
||||
|
||||
strObj:=new TJObject("java/lang/String", charArr);
|
||||
|
||||
```tsl
|
||||
// char[]构造, Unicode字符集, JavaEncode负责生成Unicode编码的char数组
|
||||
charArr := JavaEncode("chararray", "Tinysoft天软");
|
||||
strObj := new TJObject("java/lang/String", charArr);
|
||||
SystemClass.out.println(strObj.toString());
|
||||
|
||||
//构造字符串
|
||||
|
||||
strObj:=new TJObject("java/lang/String", "天软科技");
|
||||
|
||||
//得到byte数组,系统默认字符集
|
||||
|
||||
byteArray:=strObj.getBytes();
|
||||
|
||||
//byte数组转换为字符串
|
||||
|
||||
str:=JavaDecode("String", byteArray);
|
||||
|
||||
echo str,"\r\n";
|
||||
// 构造字符串
|
||||
strObj := new TJObject("java/lang/String", "天软科技");
|
||||
// 得到byte数组,系统默认字符集
|
||||
byteArray := strObj.getBytes();
|
||||
// byte数组转换为字符串
|
||||
str := JavaDecode("String", byteArray);
|
||||
echo str, "\r\n";
|
||||
```
|
||||
|
||||
========================================================
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ rem
|
|||
rem Usage:
|
||||
rem install_codex_skills.bat
|
||||
rem install_codex_skills.bat style-cleanup code-review-workflow
|
||||
rem install_codex_skills.bat --local
|
||||
rem
|
||||
rem Notes:
|
||||
rem - Codex loads skills at startup; restart `codex` after installation.
|
||||
|
|
@ -17,7 +18,13 @@ set "SCRIPT_DIR=%~dp0"
|
|||
for %%I in ("%SCRIPT_DIR%..") do set "SRC=%%~fI"
|
||||
set "SKILLS_SRC_ROOT=%SRC%\\codex\\skills"
|
||||
|
||||
set "LOCAL_MODE=0"
|
||||
if /I "%~1"=="--local" set "LOCAL_MODE=1"
|
||||
if /I "%~1"=="-l" set "LOCAL_MODE=1"
|
||||
if "%LOCAL_MODE%"=="1" shift
|
||||
|
||||
set "CODEX_HOME=%CODEX_HOME%"
|
||||
if "%LOCAL_MODE%"=="1" if "%CODEX_HOME%"=="" set "CODEX_HOME=%CD%\\.codex"
|
||||
if "%CODEX_HOME%"=="" set "CODEX_HOME=%USERPROFILE%\\.codex"
|
||||
set "SKILLS_DST_ROOT=%CODEX_HOME%\\skills"
|
||||
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@
|
|||
# Usage:
|
||||
# powershell -File scripts/install_codex_skills.ps1
|
||||
# powershell -File scripts/install_codex_skills.ps1 style-cleanup code-review-workflow
|
||||
# powershell -File scripts/install_codex_skills.ps1 -Local
|
||||
#
|
||||
# Notes:
|
||||
# - Codex loads skills at startup; restart `codex` after installation.
|
||||
|
|
@ -12,6 +13,7 @@
|
|||
|
||||
[CmdletBinding()]
|
||||
param(
|
||||
[switch]$Local,
|
||||
[Parameter(Mandatory = $false, ValueFromRemainingArguments = $true)]
|
||||
[string[]]$Skills
|
||||
)
|
||||
|
|
@ -26,6 +28,10 @@ if (-not (Test-Path $SkillsSrcRoot)) {
|
|||
}
|
||||
|
||||
$CodexHome = $env:CODEX_HOME
|
||||
if ($Local) {
|
||||
$localHome = Join-Path (Get-Location) ".codex"
|
||||
if (-not $CodexHome) { $CodexHome = $localHome }
|
||||
}
|
||||
if (-not $CodexHome) {
|
||||
$homeDir = $HOME
|
||||
if (-not $homeDir) { $homeDir = $env:USERPROFILE }
|
||||
|
|
@ -67,4 +73,3 @@ if ($Skills -and $Skills.Count -gt 0) {
|
|||
}
|
||||
|
||||
Write-Host "Done. Skills installed to: $SkillsDstRoot"
|
||||
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ set -eu
|
|||
# Usage:
|
||||
# sh scripts/install_codex_skills.sh # install all skills
|
||||
# sh scripts/install_codex_skills.sh style-cleanup code-review-workflow
|
||||
# sh scripts/install_codex_skills.sh --local # install to <cwd>/.codex
|
||||
#
|
||||
# Notes:
|
||||
# - Codex loads skills at startup; restart `codex` after installation.
|
||||
|
|
@ -17,6 +18,17 @@ SCRIPT_DIR="$(CDPATH= cd -- "$(dirname -- "$0")" && pwd -P)"
|
|||
SRC="$(CDPATH= cd -- "$SCRIPT_DIR/.." && pwd -P)"
|
||||
SKILLS_SRC_ROOT="$SRC/codex/skills"
|
||||
|
||||
LOCAL_MODE=0
|
||||
if [ "${1:-}" = "--local" ] || [ "${1:-}" = "-l" ]; then
|
||||
LOCAL_MODE=1
|
||||
shift
|
||||
fi
|
||||
|
||||
if [ "$LOCAL_MODE" -eq 1 ]; then
|
||||
LOCAL_CODEX_HOME="$(pwd -P)/.codex"
|
||||
CODEX_HOME="${CODEX_HOME:-$LOCAL_CODEX_HOME}"
|
||||
fi
|
||||
|
||||
CODEX_HOME="${CODEX_HOME:-$HOME/.codex}"
|
||||
SKILLS_DST_ROOT="$CODEX_HOME/skills"
|
||||
|
||||
|
|
@ -61,4 +73,3 @@ else
|
|||
fi
|
||||
|
||||
echo "Done. Skills installed to: $SKILLS_DST_ROOT"
|
||||
|
||||
|
|
|
|||
|
|
@ -63,10 +63,10 @@ teardown() {
|
|||
# 验证必须文件
|
||||
[ -d ".agents/tsl" ]
|
||||
[ -f ".agents/tsl/index.md" ]
|
||||
[ -f ".agents/tsl/auth.md" ]
|
||||
[ -f ".agents/tsl/code_quality.md" ]
|
||||
[ -f ".agents/tsl/performance.md" ]
|
||||
[ -f ".agents/tsl/testing.md" ]
|
||||
[ ! -f ".agents/tsl/auth.md" ]
|
||||
[ ! -f ".agents/tsl/code_quality.md" ]
|
||||
[ ! -f ".agents/tsl/performance.md" ]
|
||||
[ ! -f ".agents/tsl/testing.md" ]
|
||||
}
|
||||
|
||||
@test "sync_standards.sh cpp - 同步 C++ 规则集" {
|
||||
|
|
@ -76,8 +76,10 @@ teardown() {
|
|||
# 验证必须文件
|
||||
[ -d ".agents/cpp" ]
|
||||
[ -f ".agents/cpp/index.md" ]
|
||||
[ -f ".agents/cpp/auth.md" ]
|
||||
[ -f ".agents/cpp/code_quality.md" ]
|
||||
[ ! -f ".agents/cpp/auth.md" ]
|
||||
[ ! -f ".agents/cpp/code_quality.md" ]
|
||||
[ ! -f ".agents/cpp/performance.md" ]
|
||||
[ ! -f ".agents/cpp/testing.md" ]
|
||||
}
|
||||
|
||||
@test "sync_standards.sh tsl cpp - 同步多个规则集" {
|
||||
|
|
|
|||
Loading…
Reference in New Issue