From a64b0f97f5855b2e8738aa7fe1db3ea20701f3c7 Mon Sep 17 00:00:00 2001 From: "peng.li24" <734991033@qq.com> Date: Fri, 11 Sep 2026 11:06:58 +0800 Subject: [PATCH] =?UTF-8?q?layout:=20langtype=20map=20=E8=AF=AD=E4=B9=89?= =?UTF-8?q?=20+=20tutorial=20=E5=AF=B9=E9=BD=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 --- layout/src/langtype.rs | 19 +++++++++++++------ tutorial/01-basics/kv_tree.kv | 1 + tutorial/08-leetcode/001_two-sum-hash.kv | 3 ++- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/layout/src/langtype.rs b/layout/src/langtype.rs index 5d8f5fa9..940757d1 100644 --- a/layout/src/langtype.rs +++ b/layout/src/langtype.rs @@ -147,6 +147,11 @@ fn valid_scalar(s: &str) -> bool { /// `[]char/` —— 字符串键(= Go `map[string]V`) /// `[T1,T2,…]` —— 标量元组键(元素为标量 kind,物理以字符串格式落 key) fn valid_key(s: &str) -> bool { + // memitemkey 三选一(见 [[map容器]]):裸标量(`int64`)、字符串键 `[]char/`、 + // 标量元组键 `[scalar,…]`。裸标量必须认——`b:int64·int64 = {}` 是 spec 的标准写法。 + if valid_scalar(s) { + return true; + } let rest = match s.strip_prefix('[') { Some(r) => r, None => return false, @@ -202,13 +207,15 @@ fn expand_atom(s: &str) -> String { if s.starts_with('/') { return s.to_string(); } - if s.starts_with('[') { - if let Some(i) = s.find('·') { - let key = &s[..i]; - if valid_key(key) { - return format!("{key}·{}", expand_struct_refs(&s[i + '·'.len_utf8()..])); - } + // mapexpr `key·value`:键可以是 `[` 起头(字符串键/标量元组键)或**裸标量**, + // 只有 value 侧需要展开 struct 名;整串当 structref 包成 `/lib/` 是错的。 + if let Some(i) = s.find('·') { + let key = &s[..i]; + if valid_key(key) { + return format!("{key}·{}", expand_struct_refs(&s[i + '·'.len_utf8()..])); } + } + if s.starts_with('[') { return s.to_string(); } if s.is_empty() || known_kind(s) || s == "any" { diff --git a/tutorial/01-basics/kv_tree.kv b/tutorial/01-basics/kv_tree.kv index 4fcd5e4b..ef29b99d 100644 --- a/tutorial/01-basics/kv_tree.kv +++ b/tutorial/01-basics/kv_tree.kv @@ -18,6 +18,7 @@ rwfunc count_children(prefix:[]char/utf32) -> (n:int64) { } rwfunc test() -> () { + /tmp/kvt:int64·int64 = {} kv·set("/tmp/kvt·data", 42) kv·get("/tmp/kvt·data") -> v println("v=", v) diff --git a/tutorial/08-leetcode/001_two-sum-hash.kv b/tutorial/08-leetcode/001_two-sum-hash.kv index 2b43488a..0ea685b4 100644 --- a/tutorial/08-leetcode/001_two-sum-hash.kv +++ b/tutorial/08-leetcode/001_two-sum-hash.kv @@ -5,7 +5,8 @@ rwfunc two_sum(nums:[]int64, target:int64) -> () { n = ndarray·numel(nums) i = 0 - "/tmp" -> h + /tmp/two_sum:int64·int64 = {} + "/tmp/two_sum" -> h while (i < n) { x = nums[i] need = target - x