Skip to content

Commit 76475f4

Browse files
authored
Merge pull request #307 from array2d/chore/kv-to-kvspace-rename
chore: kv·* 内建重命名为 kvspace·*
2 parents 7e1c233 + 697dfc9 commit 76475f4

82 files changed

Lines changed: 338 additions & 336 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

benchmark/cases/binary_search/binary_search.kv

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ rwfunc bsearch(arr:*[int64]·int64, n:int64, target:int64) -> (idx:int64) {
99
while (lo <= hi) {
1010
lo + hi -> s
1111
s ÷ 2 -> mid
12-
kv·get(arr, mid) -> mv
12+
kvspace·get(arr, mid) -> mv
1313
if (mv == target) {
1414
mid -> idx
1515
hi + 1 -> lo

benchmark/cases/binary_trees/binary_trees.kv

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ rwfunc test() -> () {
2121
top + 1 -> top
2222
while (top > 0) {
2323
top - 1 -> top
24-
kv·get(bid, top) -> cur
25-
kv·get(bdep, top) -> d
24+
kvspace·get(bid, top) -> cur
25+
kvspace·get(bdep, top) -> d
2626
if (d > 0) {
2727
nid + 1 -> nid
2828
nid -> lc
@@ -50,10 +50,10 @@ rwfunc test() -> () {
5050
tp + 1 -> tp
5151
while (tp > 0) {
5252
tp - 1 -> tp
53-
kv·get(tid, tp) -> cur
53+
kvspace·get(tid, tp) -> cur
5454
count + 1 -> count
55-
kv·get(L, cur) -> lc
56-
kv·get(R, cur) -> rc
55+
kvspace·get(L, cur) -> lc
56+
kvspace·get(R, cur) -> rc
5757
if (lc != 0) {
5858
lc -> tid·*tp
5959
tp + 1 -> tp

benchmark/cases/hash_table/hash_table.kv

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@ rwfunc test() -> () {
1919
while (i < n) {
2020
i × 2654435761 -> k0
2121
k0 % 100003 -> key
22-
kv·get(h, key) != None -> ex
22+
kvspace·get(h, key) != None -> ex
2323
if (ex) {
2424
hits + 1 -> hits
25-
kv·get(h, key) -> v
25+
kvspace·get(h, key) -> v
2626
sum + v -> sum
2727
}
2828
i + 1 -> i

benchmark/cases/k_nucleotide/k_nucleotide.kv

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ rwfunc test() -> () {
1818
while (i < n) {
1919
string·char(s, i) -> ch
2020
string·ord(ch) -> c
21-
kv·get(h, c) -> cur
21+
kvspace·get(h, c) -> cur
2222
if (cur == None) {
2323
0 -> cur
2424
}
@@ -27,10 +27,10 @@ rwfunc test() -> () {
2727
i + 1 -> i
2828
}
2929
t1 = time·now()
30-
kv·get(h, 65) -> a
31-
kv·get(h, 67) -> cc
32-
kv·get(h, 71) -> g
33-
kv·get(h, 84) -> t
30+
kvspace·get(h, 65) -> a
31+
kvspace·get(h, 67) -> cc
32+
kvspace·get(h, 71) -> g
33+
kvspace·get(h, 84) -> t
3434
println("knuc: A =", a, "C =", cc, "G =", g, "T =", t)
3535
delta = time·sub(t1, t0)
3636
ns = time/duration·as_nanos(delta)

error_cases/index_error/at_oob.kv

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@
22
// error: KeyError: kv·at: key not found
33

44
rwfunc test() -> () {
5-
kv·get([1, 2], 5) -> _
5+
kvspace·get([1, 2], 5) -> _
66
}

error_cases/index_error/typed_array_string_key.kv

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@
33

44
rwfunc test() -> () {
55
arr:[]int32 = [1, 2, 3]
6-
kv·get(arr, "key") -> _
6+
kvspace·get(arr, "key") -> _
77
}

error_cases/key_error/kv_at_missing.kv

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@
22
// error: KeyError: kv·at: key not found
33

44
rwfunc test() -> () {
5-
kv·get("/x", "y") -> _
5+
kvspace·get("/x", "y") -> _
66
}

layout/src/lower.rs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ fn is_container_type(t: &str) -> bool {
1212
t == "stringkeymap" || t.contains(keytree::MEMBER_SEP)
1313
}
1414

15-
/// `[]` 下标校验:xv·at/xv·set 基座若为容器类型 → 报错,逼用 kv·get/kv·set/`base·key`。
15+
/// `[]` 下标校验:xv·at/xv·set 基座若为容器类型 → 报错,逼用 kvspace·get/kvspace·set/`base·key`。
1616
fn is_container_ty(ty: &str) -> bool {
1717
// 剥掉间接性前缀 `*`/`@` 再判:签名里 `p:*Point`、`m:*[int64]·int64` 的 `*` 是传递方式,
1818
// 类型本体仍是值容器——不剥会把这类参数误判为"未定义容器",成员写全部被拒。
@@ -185,9 +185,9 @@ fn check_map_inst(s: &Instruction, defined: &HashSet<String>, diags: &mut Vec<Di
185185
}
186186
}
187187
}
188-
// kv·set(base, key, val) 成员形
188+
// kvspace·set(base, key, val) 成员形
189189
if let Some(e) = &s.expr {
190-
if e.op == "kv·set" && e.args.len() >= 3 && !e.args[0].val.contains('/') {
190+
if e.op == "kvspace·set" && e.args.len() >= 3 && !e.args[0].val.contains('/') {
191191
check_map_base(&e.args[0].val, defined, Pos { line: 0, col: 0 }, diags);
192192
}
193193
}
@@ -243,7 +243,7 @@ fn check_subscript_expr(e: &Expr, tm: &HashMap<String, String>, diags: &mut Vec<
243243
diags.push(Diagnostic {
244244
pos: Pos { line: 0, col: 0 },
245245
message: format!(
246-
"`[]` 下标不能用于容器 `{}`(类型 {});容器成员访问用 kv·get/kv·set 或 `{}·key`,`[]` 仅限 compact array",
246+
"`[]` 下标不能用于容器 `{}`(类型 {});容器成员访问用 kvspace·get/kvspace·set 或 `{}·key`,`[]` 仅限 compact array",
247247
base.val, t, base.val
248248
),
249249
warn: false,
@@ -558,7 +558,7 @@ fn lower_for_with_cont(
558558
let cond_slot = lg.tmp();
559559
let len_slot = lg.tmp();
560560
let key_slot = lg.tmp();
561-
// 容器源(stringkeymap/struct)用 kv·listlen/kv·listn/kv·get 遍历,compact 数组源用
561+
// 容器源(stringkeymap/struct)用 kvspace·listlen/kvspace·listn/kvspace·get 遍历,compact 数组源用
562562
// ndarray·numel/xv·at(见 spec 控制流脱糖)。判据看**声明的类型**:map 的 kindexpr 恒含
563563
// `key·value` 的那个 `·`(`[int64]·int64`、`[]char/utf8·int64`),compact 数组不含。
564564
let is_obj = s.iter.op == "obj"
@@ -592,7 +592,7 @@ fn lower_for_with_cont(
592592
if is_obj {
593593
init_body.push(Stmt::Instruction(Instruction {
594594
comments: Vec::new(),
595-
expr: Some(ast::call("kv·listlen", vec![ast::leaf(&iter_slot)])),
595+
expr: Some(ast::call("kvspace·listlen", vec![ast::leaf(&iter_slot)])),
596596
writes: vec![len_slot.clone()],
597597
write_types: Vec::new(),
598598
arrow_left: false,
@@ -641,7 +641,7 @@ fn lower_for_with_cont(
641641
body_insts.push(Stmt::Instruction(Instruction {
642642
comments: Vec::new(),
643643
expr: Some(ast::call(
644-
"kv·listn",
644+
"kvspace·listn",
645645
vec![ast::leaf(&iter_slot), ast::leaf(&idx_slot)],
646646
)),
647647
writes: vec![key_slot.clone()],
@@ -651,7 +651,7 @@ fn lower_for_with_cont(
651651
body_insts.push(Stmt::Instruction(Instruction {
652652
comments: Vec::new(),
653653
expr: Some(ast::call(
654-
"kv·get",
654+
"kvspace·get",
655655
vec![ast::leaf(&iter_slot), ast::leaf(&key_slot)],
656656
)),
657657
writes: vec![s.var.clone()],
@@ -1043,19 +1043,19 @@ fn infer_op_type(opcode: &str, reads: &[String], tm: &mut HashMap<String, String
10431043
if opcode == "map" {
10441044
return "[]stringkeymap".to_string();
10451045
}
1046-
if opcode == "kv·set" {
1046+
if opcode == "kvspace·set" {
10471047
// 成员写的 base 类型**不在此推断**:map 必须显式声明准确类型
10481048
// (`m:[]char/utf8·int64 = {}`),由 check_map_defined 静态拦截未定义者。
10491049
return String::new();
10501050
}
10511051
match opcode {
1052-
"kvlen" | "ndarray·numel" | "ndarray·dim" | "kv·listlen" | "string·len" | "string·ord"
1052+
"kvlen" | "ndarray·numel" | "ndarray·dim" | "kvspace·listlen" | "string·len" | "string·ord"
10531053
| "string·cmp" | "string·find" | "string·parseint" | "xv·bodylen" => {
10541054
return "int64".to_string();
10551055
}
10561056
"xv·langtype" => return "[]char/utf8".to_string(),
10571057
"ndarray·shape" => return "[]int64".to_string(),
1058-
"kv·list" => return "[]char/utf8".to_string(),
1058+
"kvspace·list" => return "[]char/utf8".to_string(),
10591059
"string·char" | "string·set" | "string·slice" | "string·concat" | "string·formatint"
10601060
| "string·formatuint" => return "char/utf32".to_string(),
10611061
"random.int63" => return "int64".to_string(),

layout/src/parser.rs

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -804,11 +804,11 @@ impl Parser {
804804
bad(p, w, fname);
805805
}
806806
}
807-
// kv.set 成员形(3 读:base, key, val)改写 base 的成员目录,命中读参**或别名**即拒绝。
807+
// kvspace·set 成员形(3 读:base, key, val)改写 base 的成员目录,命中读参**或别名**即拒绝。
808808
// 被写的参数**必须**声明在写参侧(签名诚实原则)——要就地改调用方的对象,
809809
// 就把该参数写到 `-> (p:Point)` 里,而不是留在读参侧靠别名绕。
810810
if let Some(e) = &inst.expr {
811-
if e.op == "kv·set" && e.args.len() >= 3 {
811+
if e.op == "kvspace·set" && e.args.len() >= 3 {
812812
let base = &e.args[0].val;
813813
if !base.contains('/') && (ro.contains(base) || tainted.contains_key(base)) {
814814
if ro.contains(base) {
@@ -1274,8 +1274,8 @@ impl Parser {
12741274

12751275
fn parse_pratt(&mut self, min_prec: i32) -> Option<Expr> {
12761276
let mut left = self.parse_primary_expr()?;
1277-
// 成员链:base + 各段收集成单个变参 kv·get(base, seg1, seg2, ...),runtime 直接拼路径。
1278-
// 不在 layout 摊成嵌套 kv·get(内层返回的是值,丢路径,#110)。每段为静态字面量或
1277+
// 成员链:base + 各段收集成单个变参 kvspace·get(base, seg1, seg2, ...),runtime 直接拼路径。
1278+
// 不在 layout 摊成嵌套 kvspace·get(内层返回的是值,丢路径,#110)。每段为静态字面量或
12791279
// 动态键(*k 的变量)。
12801280
let mut chain_base: Option<Expr> = None;
12811281
let mut chain_segs: Vec<Expr> = Vec::new();
@@ -1327,11 +1327,11 @@ impl Parser {
13271327
continue;
13281328
}
13291329
}
1330-
// 成员链被打断(下标/中缀/循环尾):flush 成单个变参 kv·get。
1330+
// 成员链被打断(下标/中缀/循环尾):flush 成单个变参 kvspace·get。
13311331
if let Some(base) = chain_base.take() {
13321332
let mut args = vec![base];
13331333
args.append(&mut chain_segs);
1334-
left = ast::call("kv·get", args);
1334+
left = ast::call("kvspace·get", args);
13351335
}
13361336
// 后缀索引
13371337
if self.peek().kind == Kind::LBrack {
@@ -1349,8 +1349,8 @@ impl Parser {
13491349
let is_path = left.is_leaf() && left.val.starts_with('/');
13501350
let mut args = vec![left];
13511351
args.extend(indices);
1352-
// 路径字面量 + [idx] → kv.get(KV 路径成员访问);否则 xv.at(compact 数组元素)。
1353-
left = ast::call(if is_path { "kv·get" } else { "xv·at" }, args);
1352+
// 路径字面量 + [idx] → kvspace·get(KV 路径成员访问);否则 xv.at(compact 数组元素)。
1353+
left = ast::call(if is_path { "kvspace·get" } else { "xv·at" }, args);
13541354
continue;
13551355
}
13561356
let t = self.peek();
@@ -1368,7 +1368,7 @@ impl Parser {
13681368
if let Some(base) = chain_base.take() {
13691369
let mut args = vec![base];
13701370
args.append(&mut chain_segs);
1371-
left = ast::call("kv·get", args);
1371+
left = ast::call("kvspace·get", args);
13721372
}
13731373
Some(left)
13741374
}
@@ -1407,12 +1407,12 @@ impl Parser {
14071407
if symbol::lookup(&t.value).word == "add" {
14081408
return self.parse_pratt(UNARY_PREC);
14091409
}
1410-
// 一元前缀 & = 取址:&x ≡ kv·abs(x)(中缀 & 仍为按位与,走 pratt 中缀路径)。
1411-
// & 对成员链 kv·get(base, segs...) → kv·abs(base, segs...):取成员路径地址,非读值取址。
1410+
// 一元前缀 & = 取址:&x ≡ kvlang·abs(x)(中缀 & 仍为按位与,走 pratt 中缀路径)。
1411+
// & 对成员链 kvspace·get(base, segs...) → kvlang·abs(base, segs...):取成员路径地址,非读值取址。
14121412
if symbol::lookup(&t.value).word == "bitand" {
14131413
let arg = self.parse_pratt(UNARY_PREC)?;
1414-
let op = format!("kv{}abs", keytree::MEMBER_SEP);
1415-
let get = format!("kv{}get", keytree::MEMBER_SEP);
1414+
let op = format!("kvlang{}abs", keytree::MEMBER_SEP);
1415+
let get = format!("kvspace{}get", keytree::MEMBER_SEP);
14161416
if arg.op == get && arg.args.len() >= 2 {
14171417
return Some(ast::call(&op, arg.args));
14181418
}
@@ -1897,7 +1897,7 @@ impl Parser {
18971897
if (t.kind == Kind::Ident || is_path_literal) && self.peek_at(1).kind == Kind::Dot {
18981898
let mut w = self.advance().value;
18991899
// 成员链写槽:整段 p·obj·deep 收成单个 write 槽,交给 desugar_member_write
1900-
// 拆成 kv·set(base, "obj·deep", v)。勿在每段 · 处截断(否则 deep 被当独立写槽)。
1900+
// 拆成 kvspace·set(base, "obj·deep", v)。勿在每段 · 处截断(否则 deep 被当独立写槽)。
19011901
while self.peek().kind == Kind::Dot {
19021902
self.advance(); // .
19031903
w.push_str(keytree::MEMBER_SEP);
@@ -2054,7 +2054,7 @@ impl Parser {
20542054
}
20552055

20562056
// 下标写脱糖:arr[i,j] 写槽 + 值 e → xv·set(arr, i, j, e) -> arr(compact 数组,
2057-
// 读侧 arr[i,j]→xv·at 的对称)。arr· 前缀坐标或 / 路径 → kv·set。左右箭头共用:
2057+
// 读侧 arr[i,j]→xv·at 的对称)。arr· 前缀坐标或 / 路径 → kvspace·set。左右箭头共用:
20582058
// = 时 e 是 pratt 右值,-> 时 e 是箭头左值,语义一致。layout 不判维数,交给 runtime。
20592059
fn desugar_subscript_write(&mut self, inst: &mut Instruction) {
20602060
if inst.writes.len() != 1 || !inst.writes[0].contains('[') {
@@ -2068,7 +2068,7 @@ impl Parser {
20682068
let dot_coord = arr.ends_with(keytree::MEMBER_SEP);
20692069
let arr = arr.trim_end_matches(keytree::MEMBER_SEP).to_string();
20702070
let op = if dot_coord || arr.starts_with('/') {
2071-
"kv·set"
2071+
"kvspace·set"
20722072
} else {
20732073
"xv·set"
20742074
};
@@ -2101,13 +2101,13 @@ impl Parser {
21012101
}
21022102
let s = inst.writes[0].clone();
21032103
// 路径字面量(/ 开头)是完整 key,不是成员写,勿脱糖——**但含动态键段 `·*k` 的除外**:
2104-
// 那时 `·` 之后是运行期求值的段,必须脱糖成 kv·set(base, k, v) 才能取到 k 的值
2104+
// 那时 `·` 之后是运行期求值的段,必须脱糖成 kvspace·set(base, k, v) 才能取到 k 的值
21052105
// (否则会被当成字面 key `/tmp/ts·*k` 整段写下去)。
21062106
if s.starts_with('/') && !s.contains(&format!("{}*", keytree::MEMBER_SEP)) {
21072107
return;
21082108
}
2109-
// struct 赋值(RHS = struct·new):浅拷 base+一层成员,lower 为 kv·cplist(struct·new→temp, dst)。
2110-
// 不走 kv·set —— 后者只搬基值,struct 的成员会丢在临时槽。dst 传完整成员槽串,
2109+
// struct 赋值(RHS = struct·new):浅拷 base+一层成员,lower 为 kvspace·cplist(struct·new→temp, dst)。
2110+
// 不走 kvspace·set —— 后者只搬基值,struct 的成员会丢在临时槽。dst 传完整成员槽串,
21112111
// runtime ResolveWriteSlot 拼 <frame>+"base·key…" 即成员绝对路径。
21122112
let is_struct_new = inst
21132113
.expr
@@ -2116,13 +2116,13 @@ impl Parser {
21162116
.unwrap_or(false);
21172117
if is_struct_new && !s.contains('*') {
21182118
let e = inst.expr.take().unwrap();
2119-
inst.expr = Some(ast::call("kv·cplist", vec![e, ast::leaf(&s)]));
2119+
inst.expr = Some(ast::call("kvspace·cplist", vec![e, ast::leaf(&s)]));
21202120
inst.writes = Vec::new();
21212121
inst.write_types = Vec::new();
21222122
return;
21232123
}
2124-
// 成员链写槽 p·a·b = v → 变参 kv·set(p, "a", "b", v),与读侧 #110 一致逐段拼路径。
2125-
// 不再按首个 · 压扁成 kv·set(p, "a·b", v):扁平段把「成员链」与「含 · 的成员名」混为一谈。
2124+
// 成员链写槽 p·a·b = v → 变参 kvspace·set(p, "a", "b", v),与读侧 #110 一致逐段拼路径。
2125+
// 不再按首个 · 压扁成 kvspace·set(p, "a·b", v):扁平段把「成员链」与「含 · 的成员名」混为一谈。
21262126
let mut parts = s.split(keytree::MEMBER_SEP);
21272127
let base = parts.next().unwrap_or("").to_string();
21282128
let mut args = vec![ast::leaf(&base)];
@@ -2148,8 +2148,8 @@ impl Parser {
21482148
}
21492149
let e = inst.expr.take();
21502150
args.push(e.unwrap_or(ast::leaf("")));
2151-
// base.a.b = v 脱糖为 kv·set(base, "a", "b", v):kv·set 是 void(副作用写成员),无写槽
2152-
inst.expr = Some(ast::call("kv·set", args));
2151+
// base.a.b = v 脱糖为 kvspace·set(base, "a", "b", v):kvspace·set 是 void(副作用写成员),无写槽
2152+
inst.expr = Some(ast::call("kvspace·set", args));
21532153
inst.writes = Vec::new();
21542154
inst.write_types = Vec::new();
21552155
}

layout/src/scanner.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -464,7 +464,7 @@ pub fn scan(src: &str) -> Vec<Token> {
464464
// ·(U+00B7)与 .(释放给小数 key)是路径字符;· 后的坐标段 [0,1] 是成员链。
465465
if src[i] == 0xC2 && i + 1 < src.len() && src[i + 1] == 0xB7 {
466466
// `·*`(动态成员名)不并入路径:让 `·`/`*`/`k` 单独成 token,交成员链解析
467-
// 成 `kv·get/kv·set(base, k)`。`·` 后接名字的情况(`/lib/json·to` 的
467+
// 成 `kvspace·get/kvspace·set(base, k)`。`·` 后接名字的情况(`/lib/json·to` 的
468468
// 包·函数分隔符、`/tmp/ts·5` 的静态成员)仍按原样整段吃进路径 token。
469469
if i + 2 < src.len() && src[i + 2] == b'*' {
470470
break;

0 commit comments

Comments
 (0)