diff --git a/lib/byteseek/kvlangbrief.kv b/lib/byteseek/kvlangbrief.kv deleted file mode 100644 index f49e4c3..0000000 --- a/lib/byteseek/kvlangbrief.kv +++ /dev/null @@ -1,124 +0,0 @@ -# kvlang 语法速览 —— 也是 KV 树里的数据。 -# 本文件被 byteseek 启动时 layout-and-run:顶层写语句被包进 byteseek.init, -# 执行后把整份速览作为字符串落在 /lib/byteseek.kvlangbrief。 -# 之后 llm·call 生成 kv 代码时,把这份速览拼进系统提示,让模型按 kvlang 语法产出程序。 - -lib byteseek { - """# kvlang 速览 - -kvlang 是一门全新语言,语法以下面示例为准,不要套用其它语言直觉。 - -## 程序结构 -顶层把代码包进 `rwfunc main() -> () { … }`,最后单独调用 `main()`。别把函数命名为 `init`。 -```kv -rwfunc main() -> () { - total = 0 # = 等价 <-,写左边这个槽 - 1 -> i # -> 写右边这个槽 - while (i <= 5) { total <- total + i; i + 1 -> i } - println(total) # 15 -} -main() -``` - -## 赋值三形式与调用 -- `x = e` / `x <- e`:写左边的槽;`e -> x`:写右边的槽。`=` 不是表达式,不能嵌进条件里。 -- 调用只能通过写参映射拿结果,没有返回值:`f(a,b) -> r`;丢弃 `-> _`;多个 `-> x, y`。 -- 写槽必须是位置:裸名(帧局部)、`/绝对/路径`(全局)、`base·name`(成员)。字面量不能当写槽。 - -## rwfunc 读参/写参 -- 读参 `(a:int64)` 只读,函数体内不能把读参放进写槽(含 `a[i] <- v`)。 -- 写参 `-> (acc:int64)` 体内可读可写——累加器、要被修改的数组都声明为写参。 -- **写参初值是 None,不是 0**:累加前必须先显式 `0 -> acc`,否则首次 `acc + x` 是 `None + x` 直接失败。 -```kv -lib mylib { rwfunc add(A:int64, B:int64) -> (C:int64) { A + B -> C } } -rwfunc sum(arr:[]int64) -> (acc:int64) { - 0 -> acc; 0 -> i - while (i < ndarray·numel(arr)) { xv·at(arr,i) -> e; acc + e -> acc; i + 1 -> i } -} -rwfunc main() -> () { - mylib·add(3,4) -> s; println(s) # 7 - a:[]int64 = [1,2,3,4,5]; sum(a) -> t; println(t) # 15 -} -main() -``` - -## 数值类型(只有定宽类型) -`int8/16/32/64 uint8/16/32/64 float32/64` 及 `char/utf8` 等;**没有 `int`/`float`**(会被拒)。 -构造器兼转换:`float32(3)`、`int8(300)`(窄化按补码回绕,float→int 向零截断)。变量声明 `x:int64 = 42`。 - -## 数组(关键:`[]` 前缀才是数组,裸 kind 是标量) -```kv -a:[]int64 = [7,2,9,4] # ✅ 一维数组。写成 a:int64=[...] 会报错(那是标量) -ndarray·numel(a) -> n # 4 -xv·at(a,2) -> e # 9(0 起) -xv·set(a,1,99) -> a # 改元素:a=[7,99,9,4] -``` -遍历/聚合用 `while + ndarray·numel + xv·at`。求最大值: -```kv -xv·at(a,0) -> hi; 1 -> i -while (i < ndarray·numel(a)) { xv·at(a,i) -> e; if (e > hi) { e -> hi }; i + 1 -> i } # hi=9 -``` - -## dict / 成员 / 指针 -```kv -d = {} # 空 object 容器 -d·name = "kv"; d·ver = 1 # 成员写(命名成员),成员在 p·name -d·name -> x # 成员读 -k = "name"; d·*k -> v # 动态键:读 d·name -a = {10, 20, 30} # 散 key map(stringkeymap),成员名是坐标段 "[i]" -a·[0] -> v0 # 坐标段成员读 -/n1 = {} # 跨函数共享的数据放绝对路径(object 容器) -/n1·val = 1; /n1·next = "/n2" -"/n1" -> p; p·val -> v # ✅ 引号=路径串(指针)·member 解引用;不加引号 /n1 读的是值非路径 -``` - -## 扩展世界:`@` 前缀 kindexpr -`@` 开头的 kindexpr 标记「元信息 key」——其真实 xvalue **不属于 kvspace 元存储**(kvspace 世界),而在 kvspace 的扩展世界。 -文件系统里的文件、GPU 里的 tensordata 都**不直接存进 kvspace**,kvspace 只存一条元信息(如大小、设备、外部路径),实体读写走扩展存储。 - -## 控制流(只能在 rwfunc 体内) -`while (c) {…}`、`if (c) {…} else {…}`。条件可为复合表达式。数组遍历用 `while` 配 `ndarray·numel`/`xv·at`(见上),不要用 for-in。 - -## 运算符(注意乘除号) -算术 `+ - × ÷ %`:**乘用 `×`、除用 `÷`,不要用 `*` `/`**(`/` 只用于路径,`*` 保留)。 -`÷`:两整数为整除(`7÷2`=3),任一为浮点则浮点除。比较 `== != < > <= >=`,逻辑 `&& || !`。 - -## IO 与字符串 -`print` / `println` 可用(扩展 rwir)。字符串用 `+` 拼接: -```kv -s = "hello" -string·len(s) -> n # 5 -string·char(s,1) -> c # 'e'(读第 i 个字符) -string·slice(s,0,2) -> p # "he" -string·find(s,"ll") -> i # 2(找不到返回 -1) -# 替换第 i 个字符:用 slice 拼接,不要用 string·char(s,i)=x -string·slice(s,0,1) + "a" -> t; string·slice(s,2,5) -> u; t + u -> r # "hallo" -``` - -**`+` 不混类型(定宽类型无隐式转换)**:`+` 只在两边同 kind 时成立——字符串+字符串=拼接、数字+数字=相加。 -`"标签" + 数字` 会 TypeError(`expected numeric, got char/utf32`)。 -打印带标签的数字,用 `println` 多参数(自动空格分隔),**不要**拼字符串: -```kv -n = 42 -println("answer =", n) # answer = 42(✅ 两个参数) -# "answer = " + n -> s; println(s) # ❌ TypeError:char + int -``` - -## 自举:代码即数据(生成/校验/入库/运行) -kv 代码是 KV 树里的数据,可运行时自产自运行: -```kv -kvlanglayout·vet(src) -> v # 校验源码:合法 "ok",否则错误信息 -kvlanglayout·format(src) -> f # 规范化源码(parse → 格式化文本) -kvlanglayout·layout(src) -> e # 源码入库 /lib:成功空串,失败 "error: …" -kvlanglayout·dump("/lib") -> d # /lib 子树导出为可运行源码(含 # 槽位注释) -vthread·run("pkg·func") # 运行已入库函数到结束(嵌套 vthread;裸名 = /lib/<名>) -``` - -## 调试 / 暂停 -```kv -debugger() # 内联断点:执行到此暂停(status 置 paused) -vthread·setstatus("paused") # 等价:设 vthread 状态(paused 即停住) -``` -暂停后由外部把 `/vthread/{vid}/·status` 改回 `running` 续跑。 -""" -> /lib/byteseek.kvlangbrief -}