Repository navigation
docs(规格): 函数值 / Lambda / callable 设计规格(846 行·提案档·零实现) - #168
Merged
Merged
Conversation
把维护者四块设计输入(自动推导清单 · 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(还原需
明确许可)走
零语义改动;仅本档正文。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
这是什么
docs/superpowers/specs/2026-09-23-fn-value-lambda-design.md(846 行)——函数值 / Lambda / callable 设计规格(提案档 · 零实现)。来源:维护者四块设计输入(自动推导清单 · 语言表面 4 项 · 能推/不能推分类 · 对表示方案的裁决)逐字落成形式化展开 + 仓库锚定。
核心
语义统一 callable;CPU realization 暂用
(code, env)—— 维护者裁「甲 + 限定」:fn(T...) -> R是统一 callable 类型,由「可调用实体 + 可选 capture environment」构成;不规定机器内存布局。{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 条,档内已标出)
{code, env}在 IR 值层怎么承载(硬约束:不得写回TYP_FN行槽)TYP_FN槽分配(提案:照TYP_TUPLE先例 + 返回型在链首,与sh_func_sig_term一致)flow函数被当作fn.counter取用时,其类型身份是什么flow fn name()与flow name()的规范拼写已由 team-lead 转述并获维护者确认的三件
TYP_*表的空位 5。侦察读数(写手已在
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)· grammarcore.ebnf里无 FunctionType/FunctionRef/Lambda 产生式。零行为
纯文档:新增 1 档,零代码、零行为、零构建面影响。