Skip to content

[FEAT] 1-layout+2-runtime: *langtype 指针字段/参数(ref 轴落地:剥 * → head.ref=1 + Set 单跳类型检查) #285

Description

@miaobyte

现状

tutorial 里指针字段一律写成字符串(next:[]char/utf32=""left/right:[]char/utf32),这是绕过 *langtype 未实装的 workaround。目标:直接写

struct TNode {
	val:int64=0
	left:*TNode=""
	right:*TNode=""
}

三正交轴:设计支持,实现断链

*ref 轴语法。left:*TNode = ref=1 + langtype=/lib/TNode + body 存目标 key(16-ptr.kv 已规定「* 前缀表 ref,layout 剥离后落成 head ref 独立字节」)。设计无缺口,但 layout 处理链是断的:

  1. parse_type_raw(layout/src/parser.rs:466)把 *Literal token 吞进类型串 → *int64 / *TNode
  2. expand_struct_refs(layout/src/langtype.rs:187 expand_atom)不识别 * → 落到 format!("/lib/{s}") = 损坏的 /lib/*int64 / /lib/*TNode
  3. valid_langtype(langtype.rs:173)无 * 分支 → 判非法;仅在有校验的位置触发:check_param_types(参数)+ 容器元素 → 报 unknown type ... (got "/lib/*TNode")invalid langtype "[int64]·/lib/*TNode"
  4. struct 字段 / 局部变量不过 valid_langtype*T 蒙混过关但存成损坏的 /lib/*T,且从未被真正 deref。
  5. 全 layout 无一处剥离前导 * 置 head.ref(唯一 * 处理在 parser.rs:1955,是无关的 .* 动态成员写)。dump 显示 p:*int64=&x 降为纯 kv·abs(x)->p,slot 无 ref。

落地方案

1-layout

  • parse_type/parse_type_raw:识别前导 *(Literal "*")为 ref 轴 → 剥离并记 ref=1,base 保持干净后再 expand_struct_refs
  • field/param/local/return 槽的 head.ref 字节穿透(ffi.rs 已有 r#ref)。
  • valid_langtype 接收已剥离 base(或加 * 前缀分支)。

2-runtime

验收

  • 094_inorder_traversal.kv 用 *TNode 通过(含 [int64]·*TNode 栈、root:*TNode 参数)。
  • 12-struct 与 08-leetcode 链表例子 next:*Node 全绿(shm/fs/redis 193×3)。

关联:#283&/kv·abs 产出指针值)、#199(具名 struct)。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    FEAT新增能力/语法/原语

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions