From 0769a11bec14904d01dd745e866c11bd9aad1635 Mon Sep 17 00:00:00 2001 From: "peng.li24" <734991033@qq.com> Date: Wed, 26 Aug 2026 07:17:42 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=88=90=E5=91=98=E5=88=86=E9=9A=94?= =?UTF-8?q?=E7=AC=A6=20.=20=E2=86=92=20=C2=B7=EF=BC=88=E4=B8=AD=E7=82=B9?= =?UTF-8?q?=E5=8F=B7=EF=BC=89=EF=BC=8C=E8=A7=A3=E6=94=BE=20.=20=E7=BB=99?= =?UTF-8?q?=E5=B0=8F=E6=95=B0=E7=82=B9/=E5=B0=8F=E6=95=B0=E5=9D=90?= =?UTF-8?q?=E6=A0=87=20key?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude --- layout/examples/layout_file.rs | 4 +- layout/src/capi.rs | 4 +- layout/src/code.rs | 20 ++++---- layout/src/keytree.rs | 6 +-- layout/src/lower.rs | 42 ++++++++-------- layout/src/parser.rs | 39 +++++++++------ layout/src/scanner.rs | 16 ++++-- layout/src/symbol.rs | 2 +- layout/tests/pipeline_test.rs | 12 ++--- layout/tests/redis_roundtrip_test.rs | 2 +- runtime/src/builtin.c | 50 +++++++++---------- runtime/src/const.h | 3 +- runtime/src/keytree.c | 9 ++-- runtime/src/kvcpu.c | 24 ++++++--- runtime/src/rwir.c | 2 +- tutorial/01-basics/arith.kv | 8 +-- tutorial/01-basics/hello.kv | 8 +-- tutorial/01-basics/kv_tree.kv | 24 ++++----- tutorial/01-basics/random.kv | 12 ++--- tutorial/01-basics/strict_types.kv | 2 +- tutorial/01-basics/strings.kv | 12 ++--- tutorial/01-basics/time.kv | 28 +++++------ tutorial/02-func/accumulator.kv | 4 +- tutorial/03-control/for.kv | 32 ++++++------ tutorial/03-control/if.kv | 6 +-- tutorial/04-ndarray/continuous.kv | 2 +- tutorial/04-ndarray/geo_coord.kv | 14 ++++++ tutorial/04-ndarray/map_coord.kv | 8 +-- tutorial/04-ndarray/separated.kv | 26 +++++----- tutorial/04-ndarray/sparse_literal.kv | 2 +- tutorial/04-ndarray/xv_shape.kv | 10 ++-- tutorial/05-dict/kv_has_string_key.kv | 4 +- tutorial/05-dict/literal.kv | 16 +++--- tutorial/06-algo/factorial.kv | 8 +-- tutorial/06-algo/fibonacci.kv | 8 +-- tutorial/06-algo/gcd.kv | 8 +-- tutorial/06-algo/map_reduce.kv | 20 ++++---- tutorial/06-algo/prime_sieve.kv | 8 +-- tutorial/06-algo/word_count.kv | 36 ++++++------- tutorial/07-lib/cross/inline.kv | 2 +- tutorial/07-lib/cross/lib_b.kv | 4 +- tutorial/07-lib/inline_lib.kv | 10 ++-- tutorial/07-lib/multi/lib_b.kv | 2 +- tutorial/07-lib/single/inline.kv | 2 +- tutorial/07-lib/single/lib.kv | 2 +- tutorial/08-leetcode/001_two-sum-hash.kv | 10 ++-- tutorial/08-leetcode/001_two_sum.kv | 2 +- tutorial/08-leetcode/002_add_two_numbers.kv | 10 ++-- tutorial/08-leetcode/003_longest_substring.kv | 6 +-- tutorial/08-leetcode/008_string_to_int.kv | 4 +- tutorial/08-leetcode/011_container_water.kv | 2 +- tutorial/08-leetcode/013_roman-to-integer.kv | 2 +- tutorial/08-leetcode/013_roman_v2.kv | 6 +-- tutorial/08-leetcode/014_longest_common.kv | 14 +++--- tutorial/08-leetcode/020_valid_parentheses.kv | 8 +-- tutorial/08-leetcode/021_merge_two_lists.kv | 14 +++--- tutorial/08-leetcode/022_generate_parens.kv | 2 +- tutorial/08-leetcode/026_remove_dupes.kv | 2 +- tutorial/08-leetcode/027_remove_element.kv | 2 +- tutorial/08-leetcode/028_strstr.kv | 8 +-- tutorial/08-leetcode/033_search_rotated.kv | 2 +- tutorial/08-leetcode/034_search_range.kv | 2 +- tutorial/08-leetcode/035_search_insert.kv | 2 +- tutorial/08-leetcode/038_count_and_say.kv | 10 ++-- tutorial/08-leetcode/053_max_subarray.kv | 2 +- tutorial/08-leetcode/055_jump_game.kv | 2 +- tutorial/08-leetcode/056_merge_intervals.kv | 18 +++---- tutorial/08-leetcode/058_length_last_word.kv | 4 +- tutorial/08-leetcode/062_unique_paths.kv | 4 +- tutorial/08-leetcode/066_plus_one.kv | 4 +- tutorial/08-leetcode/067_add_binary.kv | 4 +- tutorial/08-leetcode/075_sort_colors.kv | 2 +- tutorial/08-leetcode/083_remove_dup_list.kv | 16 +++--- tutorial/08-leetcode/094_inorder_traversal.kv | 8 +-- tutorial/08-leetcode/100_same_tree.kv | 6 +-- tutorial/08-leetcode/104_max_tree_depth.kv | 4 +- tutorial/08-leetcode/118_pascal_triangle.kv | 10 ++-- tutorial/08-leetcode/121_buy_sell_stock.kv | 2 +- tutorial/08-leetcode/125_valid_palindrome.kv | 4 +- .../08-leetcode/125_valid_palindrome_str.kv | 6 +-- tutorial/08-leetcode/136_single_number.kv | 2 +- tutorial/08-leetcode/141_linked_list_cycle.kv | 6 +-- tutorial/08-leetcode/153_find_min_rotated.kv | 2 +- tutorial/08-leetcode/160_intersection_list.kv | 6 +-- tutorial/08-leetcode/162_find_peak.kv | 2 +- tutorial/08-leetcode/167_two_sum_ii.kv | 2 +- tutorial/08-leetcode/169_majority.kv | 2 +- tutorial/08-leetcode/171_excel_column.kv | 6 +-- tutorial/08-leetcode/189_rotate_array.kv | 2 +- tutorial/08-leetcode/198_house_robber.kv | 2 +- .../08-leetcode/203_remove_linked_elements.kv | 4 +- .../08-leetcode/206_reverse_linked_list.kv | 8 +-- tutorial/08-leetcode/217_contains_dup.kv | 4 +- tutorial/08-leetcode/217_contains_dup_hash.kv | 12 ++--- tutorial/08-leetcode/219_contains_dup_ii.kv | 8 +-- tutorial/08-leetcode/234_palindrome_list.kv | 6 +-- .../08-leetcode/238_product_except_self.kv | 2 +- tutorial/08-leetcode/242_valid_anagram.kv | 26 +++++----- tutorial/08-leetcode/268_missing_number.kv | 2 +- tutorial/08-leetcode/283_move_zeroes.kv | 2 +- tutorial/08-leetcode/303_range_sum.kv | 2 +- tutorial/08-leetcode/344_reverse_string.kv | 4 +- tutorial/08-leetcode/349_intersection.kv | 4 +- tutorial/08-leetcode/414_third_max.kv | 2 +- tutorial/09-debugger/chain_array.kv | 2 +- tutorial/11-string/01-basic.kv | 2 +- tutorial/11-string/02-char-ord.kv | 6 +-- tutorial/11-string/03-slice-find.kv | 8 +-- tutorial/11-string/04-cmp-concat.kv | 8 +-- tutorial/11-string/05-encodings.kv | 4 +- tutorial/11-string/06-convert.kv | 2 +- tutorial/12-struct/01-linked-list.kv | 32 ++++++------ tutorial/12-struct/02-tree.kv | 24 ++++----- tutorial/12-struct/03-graph.kv | 30 +++++------ .../error_cases/array_param/mutate_correct.kv | 8 +-- .../error_cases/array_param/mutate_literal.kv | 2 +- tutorial/error_cases/index_error/at_oob.kv | 4 +- tutorial/error_cases/index_error/char_oob.kv | 2 +- tutorial/error_cases/index_error/slice_oob.kv | 2 +- .../index_error/typed_array_string_key.kv | 4 +- .../error_cases/key_error/kv_at_missing.kv | 4 +- .../error_cases/type_error/char_bad_args.kv | 4 +- .../type_error/concat_non_string.kv | 4 +- 123 files changed, 540 insertions(+), 497 deletions(-) create mode 100644 tutorial/04-ndarray/geo_coord.kv diff --git a/layout/examples/layout_file.rs b/layout/examples/layout_file.rs index 9dfaffe9..fb158e53 100644 --- a/layout/examples/layout_file.rs +++ b/layout/examples/layout_file.rs @@ -7,12 +7,12 @@ use std::fs; use kvlang_layout::{compile, init_dirs, Kv}; -/// 复刻 Go runtime 的 findEntry:DFS /lib/ 找首个 `.init`,否则 "init"。 +/// 复刻 Go runtime 的 findEntry:DFS /lib/ 找首个 `·init`,否则 "init"。 fn find_entry(kv: &mut Kv, prefix: &str) -> String { let children = kv.list(prefix, false, true); for c in &children { let c = c.trim_end_matches('/'); - if c.ends_with(".init") { + if c.ends_with("·init") { return c.to_string(); } let sub = format!("{prefix}{c}/"); diff --git a/layout/src/capi.rs b/layout/src/capi.rs index 21d0e18e..68ae3064 100644 --- a/layout/src/capi.rs +++ b/layout/src/capi.rs @@ -18,11 +18,11 @@ use std::panic::catch_unwind; use crate::{compile, format, init_dirs, kvkind, vet, Kv}; -/// 复刻 Go runtime / layout_file 的 findEntry:DFS /lib/ 找首个 `.init`,否则 "init"。 +/// 复刻 Go runtime / layout_file 的 findEntry:DFS /lib/ 找首个 `·init`,否则 "init"。 fn find_entry(kv: &mut Kv, prefix: &str) -> String { for c in kv.list(prefix, false, true) { let c = c.trim_end_matches('/'); - if c.ends_with(".init") { + if c.ends_with("·init") { return c.to_string(); } let sub = format!("{prefix}{c}/"); diff --git a/layout/src/code.rs b/layout/src/code.rs index 1de79aa2..fdd0b033 100644 --- a/layout/src/code.rs +++ b/layout/src/code.rs @@ -1,11 +1,11 @@ //! layoutcode(对齐 layout/layout.go 的编译期部分):把 AST 写到 /lib/ 下的结构化 KV。 //! //! 存储约定: -//! /lib/./[0,0] 编译后签名(kind=rwfunc) -//! /lib/./ 命名参数→slot 指针(kind=char, isptr=1) -//! /lib/./[i,j] 编译后指令(kind=rwir),i 从 1 开始 -//! /lib/./