文档中的步骤
结构步骤(非实际执行时序)
marqdo
v2.2.0 增加一条命令:marqdo call。它不新增 Markdown 标记,也不另建一套技能系统。一个普通的 .mq.md 本来就是文档、知识和程序。缺的是从外部直接调用其中某个函数。
以前日常用法是运行整份文件。入口对象跑完,里面的函数要等文件自己去调用。要试验一个计算,往往得再写入口、打印和检查。现在最小可执行单位是函数。
marqdo call examples/calculator.mq.md 计算器.加法 a=2 b=3
标准输出是 5。--json 给程序和 Agent 读:成功时是带结果的对象,失败时是带诊断码的对象,退出码非 0。--backend tree 与 --backend bytecode 执行同一个函数。文件里即使还有别的入口,也不会改去跑那个入口。
本页后半本身就是一份计算器。下面这条命令调用的就是这一页:
marqdo call public/features/22-函数调用.mq.md 计算器.加法 a=2 b=3
它解决的是使用方式,不是再写一份说明书。
人打开这一页,读函数旁边的句子,知道加法在算什么。编译器解析同一批标记,检查参数和返回。开发者把函数嵌进别的程序。测试对这个函数传入输入,看输出是不是期望值,不必为它包一层只用来打印的程序。Agent 读到的是函数的用途,执行的是已经写好的实现,而不是读完说明再临时重写一遍。
这四件事共用一次调用。知识成为工具,是「知识即可执行」在函数这一层上的结果。文件不需要改名,也不需要声明自己是技能。运行时和工具清单都不会把一页普通文档挡在门外。
边界也写在命令里。
外部调用默认只执行纯函数。写文件、起进程、访问网络、加载插件,会在运行前被拒绝,副作用不会发生。要放宽权限,仍走项目里已有的验证,而不是在这条命令上新开一个开关。实例方法需要接收者,不能靠这条命令凭空调用。
函数名必须能唯一对上。没有这个函数,或同一个短名指向两个函数,都会返回结构化错误,不会擅自挑第一个。参数按函数已有的签名和契约绑定:缺了、多了、类型不对,都是诊断,不是静默猜一个值。
改一个函数之后,用原来的输入再调用一次。结果对了,这个实现就留下来;不对,就还是原来的实现。测试不能证明所有输入都正确。它让修改有一个可以重复的检查点。
这是一个普通的 Marqdo 文档。
其中包含一些可以复用的数学计算知识。
计算两个数字a和b的和。
a + b*计算两个数字a和b的积。
a * b*结构步骤(非实际执行时序)
mq://public/features%2F22-%E5%87%BD%E6%95%B0%E8%B0%83%E7%94%A8/function/%E8%AE%A1%E7%AE%97%E5%99%A8/%E4%B9%98%E6%B3%95(a: any, b: any) → anysha256:afad3f7cf7102… (未检查锁定状态)nonemq://public/features%2F22-%E5%87%BD%E6%95%B0%E8%B0%83%E7%94%A8/function/%E8%AE%A1%E7%AE%97%E5%99%A8/%E5%8A%A0%E6%B3%95(a: any, b: any) → anysha256:f020e3d1b90c6… (未检查锁定状态)none--- markup: occlusion title: 函数级调用:同一份文档成为工具 description: v2.2.0 的 marqdo call 让任意 .mq.md 里的函数可以带参数执行。说明、实现和调用是同一页。 --- # main v2.2.0 增加一条命令:`marqdo call`。它不新增 Markdown 标记,也不另建一套技能系统。一个普通的 .mq.md 本来就是文档、知识和程序。缺的是从外部直接调用其中某个函数。 以前日常用法是运行整份文件。入口对象跑完,里面的函数要等文件自己去调用。要试验一个计算,往往得再写入口、打印和检查。现在最小可执行单位是函数。 ```text marqdo call examples/calculator.mq.md 计算器.加法 a=2 b=3 ``` 标准输出是 5。`--json` 给程序和 Agent 读:成功时是带结果的对象,失败时是带诊断码的对象,退出码非 0。`--backend tree` 与 `--backend bytecode` 执行同一个函数。文件里即使还有别的入口,也不会改去跑那个入口。 本页后半本身就是一份计算器。下面这条命令调用的就是这一页: ```text marqdo call public/features/22-函数调用.mq.md 计算器.加法 a=2 b=3 ``` --- 它解决的是使用方式,不是再写一份说明书。 人打开这一页,读函数旁边的句子,知道加法在算什么。编译器解析同一批标记,检查参数和返回。开发者把函数嵌进别的程序。测试对这个函数传入输入,看输出是不是期望值,不必为它包一层只用来打印的程序。Agent 读到的是函数的用途,执行的是已经写好的实现,而不是读完说明再临时重写一遍。 这四件事共用一次调用。知识成为工具,是「知识即可执行」在函数这一层上的结果。文件不需要改名,也不需要声明自己是技能。运行时和工具清单都不会把一页普通文档挡在门外。 --- 边界也写在命令里。 外部调用默认只执行纯函数。写文件、起进程、访问网络、加载插件,会在运行前被拒绝,副作用不会发生。要放宽权限,仍走项目里已有的验证,而不是在这条命令上新开一个开关。实例方法需要接收者,不能靠这条命令凭空调用。 函数名必须能唯一对上。没有这个函数,或同一个短名指向两个函数,都会返回结构化错误,不会擅自挑第一个。参数按函数已有的签名和契约绑定:缺了、多了、类型不对,都是诊断,不是静默猜一个值。 改一个函数之后,用原来的输入再调用一次。结果对了,这个实现就留下来;不对,就还是原来的实现。测试不能证明所有输入都正确。它让修改有一个可以重复的检查点。 # 计算器 这是一个普通的 Marqdo 文档。 其中包含一些可以复用的数学计算知识。 ## 加法 计算两个数字`a`和`b`的和。 *[计算结果](a + b)* ## 乘法 计算两个数字`a`和`b`的积。 *[计算结果](a * b)*