Skip to content

docs(规格): 函数值 / Lambda / callable 设计规格(846 行·提案档·零实现) - #168

Merged
dslsdzc merged 5 commits into
developfrom
feature/fn-value-lambda-spec
Sep 23, 2026
Merged

dslsdzc merged 5 commits into
developfrom
feature/fn-value-lambda-spec

Conversation

@dslsdzc

@dslsdzc dslsdzc commented Sep 23, 2026

Copy link
Copy Markdown
Owner

这是什么

docs/superpowers/specs/2026-09-23-fn-value-lambda-design.md(846 行)——函数值 / Lambda / callable 设计规格(提案档 · 零实现)。

来源:维护者四块设计输入(自动推导清单 · 语言表面 4 项 · 能推/不能推分类 · 对表示方案的裁决)逐字落成形式化展开 + 仓库锚定。

核心

语义统一 callable;CPU realization 暂用 (code, env) —— 维护者裁「甲 + 限定」:

  • 语言/CIR 层:fn(T...) -> R 是统一 callable 类型,由「可调用实体 + 可选 capture environment」构成;不规定机器内存布局。
  • 当前 CPU 后端:无 capture → {code, 0};有 capture → {code, env};允许后端在证明 env 不需要时消除第二字。
  • fn.foo(typed callable value)与 @addr(foo)(raw machine address,仍是现有 int 语义)两者不能互相等价。
  • 现有 sched_go(@addr(f), arg) 不反向决定函数值的类型模型。

自动推导(不新增用户标记):Fn/FnMut/FnOnce 类能力 · closure environment/object · capture 集合与方式 · callable signature/capability。
不加入:currying · higher-kinded function abstraction · operator sections · 专门函数组合语法(partial application 视使用频率再定)。

四段施工

① 函数类型 ② fn.name ③ Lambda + 推导 ④ 间接调用 + 后端 —— 一份计划,分四段一次做完。

⚠ 待维护者裁定(4 条,档内已标出)

# 待裁
T-1 两字 {code, env} 在 IR 值层怎么承载(硬约束:不得写回 TYP_FN 行槽)
T-2 TYP_FN 槽分配(提案:照 TYP_TUPLE 先例 + 返回型在链首,与 sh_func_sig_term 一致)
T-10 flow 函数被当作 fn.counter 取用时,其类型身份是什么
T-11 flow fn name() 与 flow name() 的规范拼写

已由 team-lead 转述并获维护者确认的三件

  1. capture 默认按引用(与现有 region/borrow 一致),环境放外层栈帧;逃逸由 region 分析判定,判不了就报错,不猜、不偷偷堆分配。
  2. 函数类型 kind 取 TYP_* 表的空位 5。
  3. 「无法推导」新诊断码,单独一类——它是「我们不知道,请你写」,不是类型错。

侦察读数(写手已在 develop@origin 复核)

T_FN 关键字已有(lexer.cr:72)· FunctionDecl 产生式已有 · TYP_* 表无函数类型 kind(0/1/2/3/4/7/8/9/10/11/12/13,5、6 空)· IR_CALL 是直接调用(ast.cr:558)· IR_CALL_PTR/CALL_INDIRECT/IR_INVOKE 全仓 0 · IR_FNADDR(ast.cr:601)· @addr(fn) 类型是 int(checker.cr:4189)· grammar core.ebnf 里无 FunctionType/FunctionRef/Lambda 产生式。

零行为

纯文档:新增 1 档,零代码、零行为、零构建面影响。

把维护者四块设计输入(自动推导清单 · 4 项语言表面能力 + 最小语法增量 ·
能推/不能推分类表 · 表示方案裁决)写成形式化规格,全部锚点按 develop@origin
(6b54107e)用 jj file show 逐一实核(禁就地 grep:多工作区下检出可能落后)。

内容:
- §〇 不变量四条单列(统一 callable 类型 · {code,env} 只是 CPU realization ·
  fn.foo ≠ @addr(foo) · sched_go 留旧低层接口);不变量 2 附本仓三处同族先例
  (float→dex+apx · [T;N] 表示提示 · 宽度移出语言)
- §一 现状锚点 42 条(file:line)+ 锚点漂移/陈旧陈述登记 7 条(安全计划行号、
  并发规格行号、df_connect_state :146→:156、diag.cr「唯一 raise 点」实为 3 处、
  canary TSV 的 HOME 兜底理由已被 #83 移除、errors.md 的 EC_ 计数 137→149)
- §二 最小语法增量逐条对齐 grammar/core.ebnf 现状(FunctionDecl 已有;其余三项全新;
  callable 调用零语法增量——CallOrField 已通用)
- §三 四段(函数类型 / fn.name / Lambda+推导 / 间接调用+后端):各给入口·判据·依赖,
  并声明顺序≠分期;段④ 列全「认新 opcode」的六个分析面
- §四 推导清单 12 条 + 分类全表 + 显式非目标 5 条(各带原文理由)
- §五~§七 表示方案 · capture(已确认三件之一)· 诊断面(新族 + error_cat_prefix
  兜底静默印成 E 的陷阱 + 四处同改)
- §八 .ccr 影响面单列:TYPE(7) 段体 = g_types 行表原样 ⇒ 传导链逐条 + 零足迹纪律 +
  两级契约 + D1 重锁前置 + 覆盖域警告 + 「不得在 init_types 预建 TYP_FN 规范行」
- §九 与既有设计的关系(含须修订陈述:2026-08-30 第 11 条 · TODO.md:426)
- §十 待裁 9 条 · §十一 未核实 10 条 · §十二 锚点速查

零实现、零构建;不改任何既有文件正文。
维护者 2026-09-23 追加的收缩,落进规格:

- §〇 不变量 5(新增,第 5 条):函数类型仍然只有 fn(T...) -> R;明确不加
  flow fn(...)->...(类型位)· async fn · Future[T] · Coroutine[T] · GeneratorState ·
  Suspend · FnAsync 共 7 名;理由(原文)= 这类东西「很多是在暴露某种实现模型」,与
  Core 取向相反;自动推导面列 12 项(是否可能 suspend / suspend point / coroutine frame /
  frame 状态与生命周期 / escape / resume 时机 / 可否同步执行 / 可否消除 suspend-resume /
  是否需 scheduler / continuation 形成 / stackful-stackless)
- §〇 5.1 边界(写成不变量,不可合并):realization 可推导 ↔「程序是否要求产生新的
  并发执行关系」是程序语义;a();b(); 并行归 dependency/state relation(优化),
  而要「独立并发任务 + 其生命周期/结果」的语法是用户意图 ⇒ 不猜。现有 go 的归属由
  维护者判,两件各留判断、不许合并。附现状锚点(sched_go/IR_SPAWN/IR_FNADDR)
- §〇 5.2 与块三总原则并排(原文要求):同一句话的又一次应用
- §2.4 flow 撞名三义分离(实核):① region kind SG_FLOW(dataflow.cr:533;
  dyn_arr.cr:155-159)② 声明前缀 FlowDecl(core.ebnf:22-24,且 parser 另接受
  flow fn name(),parser.cr:1726-1748)——两者既有、不在收缩范围;③ 类型位
  flow fn(T)->R 今日零实现(parse_type() 无 T_FN/T_FLOW 分支)⇒ 收缩 = 否决该候选。
  附 yield 半实现事实(IR_YIELD=28 发射于 ir_gen.cr:2878,但 sizes.cr:77 = 0 字节
  no-op、interp.cr:385 eager 近似;tests/test_flow.cr 无 runner 引用)
- §4.1 D13–D24(异步/协程面 12 项自动推导)+ §4.2 分类表加一行
  (异步/协程 realization ⇒ ✅ ⇒ 不进函数类型)
- §4.3 新增 §4.4:7 个名字逐个列 + 各一句为什么(不加入 ≠ 没想到)
- §九 R7/R8/R9 关系行;§十 T-10(flow 函数的类型身份)/T-11(flow 两种拼写的规范形);
  §十一 U-11/U-12/U-13;§十二 锚点增补;§1.2 D-3 行号漂移补全(+261/+261/+36)

仍为零实现;不改任何既有文件正文。
两处笔误(均在本档自己的正文内):7 名的逐条理由表实际落在 §4.4(§4.3 是块三原表的
显式非目标),以及中文数字与阿拉伯数字混用(不变量④/不变量 4)。零语义改动。
2026-09-23 维护者裁定:原写手建议升为**约束**(不再是可选项),措辞按裁定原样落档。
- 约束三条:① 只在该签名首次被用到时建 ② 建前只查不建(TYP_NAMED named_dedup 先例)
  ③ 禁止在 init_types() 预建任何规范行(含「表头占位行」形态)
- 理由(裁定采纳的足迹分析):init_types 是每一档编译的首行入口 ⇒ 建 1 行使**每一档**
  .ccr 的 TYPE 段 +24B ⇒ 四条锁定值全变,且与「本轮是否真用到函数值」无关
- 反面先例明确不照抄:TY_DEX_S 占位(checker.cr:260 / ast.cr:284-288)——其收益是哨兵
  不碰撞、代价是全局行序位移,当时接受了;TYP_FN 无同类必需性 ⇒ 不接受同一代价。
  「有先例」≠「可照抄」,先例要连它的代价一起读
- 判据三条:负钉(不用函数值的语料 .ccr 逐字节不变 + row_count 不变)· 正钉(用一处 ⇒
  恰 +24B×唯一签名数,同签名重复不追加)· 与 §8.2 两级契约合读
- 同步:§3.1 的类型行条目改为指向裁定(不再是「建议」);§8.1 传导链表该行标注已被禁止;
  §8.3 预期改引 §8.1b

零实现;仅本档正文。
team-lead 2026-09-23 要求把该定性保持在本节(防后来人读混「否决候选」与「移除能力」)。
落三条 + 一条外推:
- 7 名从未进入块二最小语法增量 ⇒ 收缩不增不减该增量(§2.4 结论 1)
- flow 既有面(义① region kind SG_FLOW · 义② 声明前缀 FlowDecl / flow fn name())不在
  收缩范围、一字不动
- 尤其 flow fn name(...) -> R { } 作声明是既有语法,不得因本条被删
- 外推:未来同类收缩「不加新 X」永远不蕴含「删掉已有的 X」——后者按铁律 #3(还原需
  明确许可)走

零语义改动;仅本档正文。
@dslsdzc
dslsdzc merged commit 0b7ec4e into develop Sep 23, 2026
4 checks passed
@dslsdzc
dslsdzc deleted the feature/fn-value-lambda-spec branch September 23, 2026 04:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant