mirror of
https://gitcode.com/JianFeeeee/LuaCangjia_api.git
synced 2026-09-20 00:48:47 +00:00
feat: 实现loadFunction预加载函数能力 + AI辅助编程标识
- 新增 loadFunction/callFunction/unloadFunction 预加载函数 API - 预加载语义:加载文件→顶层执行一次→返回函数存入Lua Registry→可多次调用 - 与管道模式(load/runScript)存储完全解耦:funcs[]+Registry vs pkgs[]+虚拟栈 - 新增错误码 5023/5024/5025 - 新增单元测试:仓颉侧 8 个 + C++ GTest 侧 11 个 - 本机以 Cangjie 1.1.0 实编译并通过功能运行验证 - README/doc 增加 AI 辅助编程标识及预加载函数模式说明
This commit is contained in:
57
doc/api.md
57
doc/api.md
@ -20,8 +20,11 @@ Lua 虚拟机的主要管理类。
|
||||
|
||||
| 方法 | 描述 | 返回值 |
|
||||
| :--- | :--- | :--- |
|
||||
| `load(path: String, name: String): This` | 加载指定路径的 Lua 文件,编译后以 `name` 为标识压入内部栈。 | 实例本身 (`This`) |
|
||||
| `unload(name: String): This` | 从内部栈中卸载由 `name` 标识的模块。 | 实例本身 (`This`) |
|
||||
| `load(path: String, name: String): This` | **块压栈**。加载 Lua 文件、编译成 chunk、压入虚拟栈并记录栈位置。`name` 仅作为内部标识。与管道模式配套使用。 | 实例本身 (`This`) |
|
||||
| `loadFunction(path: String, name: String): This` | **预加载函数到内存**。加载文件 → 执行顶层代码(仅执行一次) → 捕获返回的函数对象 → 存入 Lua Registry。与 `load` 完全独立的两套存储(不共用 `pkgs` 栈),被加载的 Lua 文件顶层必须 `return` 一个函数。 | 实例本身 (`This`) |
|
||||
| `callFunction(name: String, arg: String): String` | **按名称调用预加载的函数**。从 Registry 取出函数后 `pcall`,**不消耗该函数**,可多次重复调用。与管道模式互不干扰。 | 函数执行的字符串结果 |
|
||||
| `unloadFunction(name: String): This` | 卸载预加载的函数(释放 Registry 引用)。 | 实例本身 (`This`) |
|
||||
| `unload(name: String): This` | 从内部栈中卸载由 `name` 标识的块(仅适用于 `load` 加载的块)。 | 实例本身 (`This`) |
|
||||
| `runScript(path: String, arg: String): String` | **核心执行方法**。 - 若 `path` 非空:加载并执行该脚本,`arg` 作为单参数传入。 - 若 `path` 为空:触发**管道模式**,调用栈顶函数,并按内部栈布局自动计算参数数量。 | 脚本执行的字符串结果 |
|
||||
| `doString(target: String): String` | 执行单条 Lua 代码字符串。`target` 为合法的 Lua 代码片段,必须返回字符串类型结果。 | 执行结果的字符串 |
|
||||
| `clear(): This` | 清理 Lua 状态机,清空全局变量和所有加载的库,恢复到初始状态。 | 实例本身 (`This`) |
|
||||
@ -63,6 +66,56 @@ Lua 虚拟机的主要管理类。
|
||||
| 5020 | `NAPI_ERROR_FUNCS` | 回调函数执行过程中发生错误(含 `doString` 语法错误)。 |
|
||||
| 5021 | `NAPI_CHDIR_ERROR` | 切换工作目录失败,可能导致包搜索错误,日志写入路径错误等。 |
|
||||
| 5022 | `NAPI_NOCHUNK_FOUND` | 没有找到待调用的函数。 |
|
||||
| 5023 | `NAPI_FUNCTION_NOT_FOUND` | `callFunction` 调用时未找到指定名称的预加载函数。 |
|
||||
| 5024 | `NAPI_LOAD_FUNCTION_OVER` | 预加载函数数量超过上限(最大 20 个)。 |
|
||||
| 5025 | `NAPI_FUNCTION_NOT_VALID` | 预加载的文件顶层返回的不是函数。 |
|
||||
|
||||
## 预加载函数模式 (Preload Function Mode)
|
||||
|
||||
与管道模式不同,预加载模式适合“加载一次、多次调用”的场景。
|
||||
|
||||
### 调用规范
|
||||
|
||||
1. **脚本编写**:被预加载的 Lua 文件**必须在顶层 `return` 一个函数**,函数的闭包状态(如计数器、配置)在预加载时初始化,后续调用不会重置。
|
||||
|
||||
```lua
|
||||
-- counter.lua
|
||||
local count = 0 -- 预加载时初始化一次
|
||||
return function(arg)
|
||||
count = count + 1
|
||||
return "arg=" .. arg .. " count=" .. count
|
||||
end
|
||||
```
|
||||
2. **预加载**:`runner.loadFunction("counter.lua", "counter")`
|
||||
3. **多次调用**:`runner.callFunction("counter", "x")` 可重复调用,`count` 持续累加。
|
||||
4. **卸载**:`runner.unloadFunction("counter")` 释放函数。
|
||||
|
||||
### 与管道模式的区别
|
||||
|
||||
| 维度 | `load` (管道模式) | `loadFunction` (预加载模式) |
|
||||
| :--- | :--- | :--- |
|
||||
| 存储位置 | 虚拟栈(`pkgs[]`,相对索引) | Lua Registry(`funcs[]`,绝对引用) |
|
||||
| 顶层代码 | 每次调用都重新执行 | 预加载时执行一次 |
|
||||
| 调用方式 | `runScript("", arg)` 触发 | `callFunction(name, arg)` |
|
||||
| 生命周期 | 调用后消耗(`pkg_cont--`) | 不消耗,可重复调用 |
|
||||
| 与另一方关系 | 互不干扰(存储完全解耦) | 互不干扰(存储完全解耦) |
|
||||
|
||||
### 示例
|
||||
|
||||
```cangjie
|
||||
let runner = LuaRunner()
|
||||
|
||||
// 预加载:顶层代码执行一次
|
||||
runner.loadFunction("./scripts/counter.lua", "counter")
|
||||
|
||||
// 多次调用:计数器持续累加
|
||||
println(runner.callFunction("counter", "a")) // arg=a count=1
|
||||
println(runner.callFunction("counter", "b")) // arg=b count=2
|
||||
println(runner.callFunction("counter", "c")) // arg=c count=3
|
||||
|
||||
// 卸载
|
||||
runner.unloadFunction("counter")
|
||||
```
|
||||
|
||||
## 管道模式 (Pipeline Mode)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user