marqdo

函数级调用:同一份文档成为工具ok

features/22-函数调用.mq.md

文档

main

说明

v2.2.0 增加一条命令:marqdo call。它不新增 Markdown 标记,也不另建一套技能系统。一个普通的 .mq.md 本来就是文档、知识和程序。缺的是从外部直接调用其中某个函数。

以前日常用法是运行整份文件。入口对象跑完,里面的函数要等文件自己去调用。要试验一个计算,往往得再写入口、打印和检查。现在最小可执行单位是函数。

code text
marqdo call examples/calculator.mq.md 计算器.加法 a=2 b=3

标准输出是 5。--json 给程序和 Agent 读:成功时是带结果的对象,失败时是带诊断码的对象,退出码非 0。--backend tree 与 --backend bytecode 执行同一个函数。文件里即使还有别的入口,也不会改去跑那个入口。

本页后半本身就是一份计算器。下面这条命令调用的就是这一页:

code text
marqdo call public/features/22-函数调用.mq.md 计算器.加法 a=2 b=3
---

它解决的是使用方式,不是再写一份说明书。

人打开这一页,读函数旁边的句子,知道加法在算什么。编译器解析同一批标记,检查参数和返回。开发者把函数嵌进别的程序。测试对这个函数传入输入,看输出是不是期望值,不必为它包一层只用来打印的程序。Agent 读到的是函数的用途,执行的是已经写好的实现,而不是读完说明再临时重写一遍。

这四件事共用一次调用。知识成为工具,是「知识即可执行」在函数这一层上的结果。文件不需要改名,也不需要声明自己是技能。运行时和工具清单都不会把一页普通文档挡在门外。

---

边界也写在命令里。

外部调用默认只执行纯函数。写文件、起进程、访问网络、加载插件,会在运行前被拒绝,副作用不会发生。要放宽权限,仍走项目里已有的验证,而不是在这条命令上新开一个开关。实例方法需要接收者,不能靠这条命令凭空调用。

函数名必须能唯一对上。没有这个函数,或同一个短名指向两个函数,都会返回结构化错误,不会擅自挑第一个。参数按函数已有的签名和契约绑定:缺了、多了、类型不对,都是诊断,不是静默猜一个值。

改一个函数之后,用原来的输入再调用一次。结果对了,这个实现就留下来;不对,就还是原来的实现。测试不能证明所有输入都正确。它让修改有一个可以重复的检查点。

计算器

说明

这是一个普通的 Marqdo 文档。

其中包含一些可以复用的数学计算知识。

加法

说明
ab

计算两个数字a和b的和。

* =计算结果a + b*

乘法

说明
ab

计算两个数字a和b的积。

* =计算结果a * b*
Functions
Variables
  • description text
    v2.2.0 的 marqdo call 让任意 .mq.md 里的函数可以带参数执行。说明、实现和调用是同一页。
  • markup text
    occlusion
  • title text
    函数级调用:同一份文档成为工具
可执行知识(辅助)

计算器.乘法 function

Target
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
Signature
(a: any, b: any) → any
Effects
pure
Verification
parse: passed; resolve: passed; contract: unchecked; tests: unknown; evidence: unverified(尚无来源记录)
制品摘要
sha256:afad3f7cf7102… (未检查锁定状态)
Depends on
none
Execution
尚无该知识的运行记录(知识预览不执行)。

计算器.加法 function

Target
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/%E5%8A%A0%E6%B3%95
Signature
(a: any, b: any) → any
Effects
pure
Verification
parse: passed; resolve: passed; contract: unchecked; tests: unknown; evidence: unverified(尚无来源记录)
制品摘要
sha256:f020e3d1b90c6… (未检查锁定状态)
Depends on
none
Execution
尚无该知识的运行记录(知识预览不执行)。

运行与结果

(no stdout)
完整源码
---
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)*

Variable