新闻详情

新闻详情

首页 / 资讯中心 / 详情

Bend 如何用 scopeless lambda 实现 callcc 控制流?

发布时间:2026/9/14 14:54:50来源:尧图网络
Bend 如何用 scopeless lambda 实现 callcc 控制流?
Bend 如何用 scopeless lambda 实现 callcc 控制流【免费下载链接】BendA massively parallel, high-level programming language项目地址: https://gitcode.com/GitHub_Trending/be/BendBend 并没有把 call/cccall with current continuation调用当前 continuation做成语言内置原语但文档明确指出它可以用 scopeless lambda无作用域 lambda实现仓库里还提供了一个可直接运行的示例 examples/callcc.bend。本文基于 docs/using-scopeless-lambdas.md 和该示例讲清楚三件事scopeless lambda 的绑定规则、callcc组合子的写法以及如何运行并核对输出结果。scopeless lambda 的绑定规则scopeless lambda 是 HVM 对 lambda 项内部表示带来的一个特性lambda 的变量名前加一个美元符号$它绑定的变量就可以在这个 lambda 的函数体之外使用。λ$x $x # 写成 scopeless 形式的恒等函数在 imp 语法里同样的东西写作lambda $x: ...。文档给的最小例子是main (((λ$x 1) 2), $x) # $x gets replaced by 2 and the application ((λ$x 1) 2) gets replaced by 1 # Outputs (1, 2)调用λ$x 1时$x被设为2而λ$x 1本身求值为1所以程序输出(1, 2)。这是理解后面callcc的关键被调用一次的 scopeless lambda 会给绑定变量赋值而这个变量在调用点之外仍然可读。写代码前需要知道三条限制它们直接决定实现方式绑定不跨定义。bound 变量只对当前 term 有效def $x main (((λ$x 1) 2), def)这种写法是无效的$x在另一个顶层定义中不可见。丢弃 scopeless lambda 会产生 ERA。如果把λ$x 1直接丢弃$x会被擦除读出来的是*ERA/eraserHVM 表示值被擦除的特殊 termmain let _ λ$x 1 # Discard and erase the scopeless lambda (2, $x) # Outputs (2, *)一个 scopeless lambda 被调用两次会产生叠加superposition。例如把f λ$x 1分别用2和3调用后读$x结果是{2 3}——两个值的叠加且叠加里参数的顺序由编译器决定不保证稳定。文档的结论是如果需要确定顺序要显式地做 duplication不能依赖隐式复制的顺序。这三条规则解释了为什么callcc的实现里必须小心处理continuation 被填入后留下的垃圾值——它最终要作为被丢弃的 scopeless lambda 绑定来处理。写 callcc 组合子examples/callcc.bend 的完整代码如下# This program is an example that shows how scopeless lambdas can be used. Seq (a: A) (b: B) : A a # Create a program capable of using callcc unchecked CC.lang : ((((a - b) - b) - c) - c) - d λprogram let callcc λcallback (λ$garbage($hole) (callback λ$hole(0))); let result (program callcc); let garbage $garbage; # Discard $garbage, which is the value returned by callback (Seq result garbage) main: u24 (CC.lang λcallcc # This code calls callcc, then calls k to fill the hole with 42. # This means that the call to callcc returns 42, and the program returns 52 ( 10 (callcc λk( (k 42) 1729))) )逐块拆解它的运作方式Seq a b a丢弃第二个参数。它的作用是把continuation 的返回值从结果元组里排挤掉最终程序只输出a。CC.lang是一个 CPScontinuation passing外壳它接收一个program把callcc传给它执行得到result后返回(Seq result garbage)其中garbage就是$garbage。核心的一行是callcc λcallback (λ$garbage($hole) (callback λ$hole(0)))。callcc收到的callback会被包装成一个 scopeless lambda当callback在某处被调用时调用产生的值会填入$hole从而替换掉callcc表达式所在的整个位置callback自己的返回值则落到$garbage上。main里的( 10 (callcc λk ( (k 42) 1729)))演示了跳转k 42把42填入 hole于是callcc表达式整体变成42( 10 42)得到52而( (k 42) 1729)是callback的返回值作为$garbage被Seq丢弃对应上一条丢弃 scopeless lambda的规则它最终被擦除。注意CC.lang上带了unchecked注解$garbage、$hole这类无作用域绑定不在类型检查器的支持范围内见 docs/type-checking.md 的 Limitations 一节明确列出不支持 unscoped variables 和 variable binds所以组合子本身只能跳过类型检查而main仍然可以标注u24。运行与结果核对运行前需要按 README.md 的 Install 一节装好两个依赖# HVM2 是 Bend 的运行解释器 cargo install hvm hvm --version # 安装 Bend 本身 cargo install bend-lang bend --version然后把示例保存为callcc.bend仓库内已有现成文件 examples/callcc.bend可直接使用用默认解释器运行bend run examples/callcc.bend如果想换解释器README 给出的对应命令是bend run-rs file.bendRust 解释器顺序执行、bend run-c file.bendC 解释器默认、bend run-cu file.bendCUDA 解释器需要 NVIDIA GPU 和 CUDA 12.x 工具链。预期输出52这个值就是仓库 golden 测试记录的运行结果测试 tests/golden_tests.rs 会用run-c跑examples/下所有.bend文件并快照输出tests/snapshots/examples__callcc.bend.snap 中记录的就是52。所以核对方式很直接命令行输出与快照一致即表示callcc按预期工作——callcc调用点返回了42加10后程序输出52而( (k 42) 1729)部分被作为垃圾擦除。边界与限制类型检查$a形式的无作用域变量和let $a ...绑定不被类型检查器支持凡是包含 scopeless lambda 绑定的定义如本例的CC.lang需要unchecked注解跳过检查使用它们的普通入口点main仍可正常标注类型。叠加顺序不保证如果一个 scopeless lambda 被隐式复制并多次调用$x读出来的是叠加且叠加中值的顺序由编译器决定。需要确定顺序时按文档做法显式 duplication。绑定范围scopeless 变量只在同一个 term 内有效跨顶层定义引用$x是无效的所以callcc这种组合子必须像示例一样内联在单个λ体里构造。这套写法的要点可以归纳为一句话scopeless lambda 的$绑定充当了从任意位置写回 continuation 入口的通道callcc只是这条规则加上一个 CPS 外壳CC.lang和一个用于丢弃垃圾值的Seq的组合。想继续深入docs/using-scopeless-lambdas.md 的 Duplicating scopeless lambdas 一节给出了被丢弃和被调用两次时的完整推导叠加语义的细节在 docs/dups-and-sups.md 中。【免费下载链接】BendA massively parallel, high-level programming language项目地址: https://gitcode.com/GitHub_Trending/be/Bend创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

RTKLIB源码剖析:RTK定位解算流程与整周模糊度固定 2026/9/14 16:28:13

RTKLIB源码剖析:RTK定位解算流程与整周模糊度固定

RTKLIB这套开源的GNSS定位软件库,我前前后后翻源码翻了不下一整年,每次感觉自己懂了,转头又被某个短变量名打回原形。rtk.x到底存了什么,rtk.P为什么是一维数组,relpos()里那一长串udstate、udmeas、filter、fix_amb调…

阅读更多 →
解读高质量数字化转型方案集:从技术选型到落地实践 2026/9/14 16:28:13

解读高质量数字化转型方案集:从技术选型到落地实践

最近我把《2024高质量数字化转型技术解决方案集》从头到尾翻了一遍,说实话,这类材料市面上不少,但大部分要么停在概念层面,要么是厂商宣传册的合集,能真正落到实施层面的并不多。这份方案集算是个例外,里面…

阅读更多 →
2026企业展厅大屏选型指南:光环境、内容类型与TCO决策模型 2026/9/14 16:28:13

2026企业展厅大屏选型指南:光环境、内容类型与TCO决策模型

1. 为什么2026年企业展厅大屏选型不能再靠“感觉”和“熟人推荐”我上个月刚帮一家新能源车企做完新总部展厅的显示系统升级,客户最初给我的需求只有一句话:“要大气、要亮、要看着高级。”——结果现场踩了三个坑:第一,他们采购部…

阅读更多 →
JDK 21迁移:技术挑战与商业策略解析 2026/9/14 16:28:13

JDK 21迁移:技术挑战与商业策略解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
MIL-NCE与HowTo100M:视频文本检索的PyTorch分布式训练实践 2026/9/14 16:28:13

MIL-NCE与HowTo100M:视频文本检索的PyTorch分布式训练实践

简介:这是一套面向深度学习研究者与开发者的PyTorch GPU分布式训练源码,以MIL-NCE方法在HowTo100M等大规模视频数据集上的实现为核心。压缩包共22个文件,包含13个Python脚本、5个CSV数据索引、2个文本说明、LICENSE与README,整体大…

阅读更多 →
大模型+云原生:微短剧全链路提效解决方案解析 2026/9/14 16:25:13

大模型+云原生:微短剧全链路提效解决方案解析

微短剧这两年确实火得离谱,几百万成本撬动上亿充值流水的案例比比皆是,整个盘子已经被干到了百亿级别。我身边不少做影视后期、做流量投放的朋友都在问同一个问题:现在冲进去还来得及吗?我的看法是,市场还在涨&#xf…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞