Unison 语言中 Term 声明禁止携带哈希限定名:语法规则、解析器实现与转写测试验证
编程语言编译器语言运行时开发工具【免费下载链接】unisonA friendly programming language from the future项目地址https://gitcode.com/gh_mirrors/un/unison点击查看免费下载本文以 Unison 开源仓库中的转写transcript测试文档no-hash-in-term-declaration.output.md为线索深入剖析 Unison 语言的一条核心语法约束Term项声明的名称——无论是类型签名还是类型定义中的名称——均不允许包含哈希限定符hash qualifier如x##Nat。读完本文你将理解这一规则的作用范围、它在词法/语法解析层的落地方式、违反规则时产生的错误行为以及如何通过仓库中的转写测试机制验证这条约束。一、规则速览Term 声明中不允许出现哈希unison-src/transcripts/no-hash-in-term-declaration.md其转写输出即本文关联文档 no-hash-in-term-declaration.output.md用一句话定义了该规则There should not be hashes in the names used in term declarations, either in the type signature or the type definition. Term 声明中所使用的名称不应包含哈希无论是在类型签名中还是在类型定义中。也就是说规则覆盖两种位置位置说明示例类型签名type signaturex : SomeType声明中的被声明名称x##Nat : Int - Int - Boolean类型定义/函数体type definition函数定义x ...左部head中的绑定名称x##Nat 5作为对照哈希限定名hash-qualified name在 Unison 的其他语法位置上是被正常支持的例如在表达式、类型引用中可以通过Name#hash的形式精确定位某个名称对应的特定 hash如引用base##Nat、.foo.bar#xyz。被禁止的只是在声明的位置上把名称写成带哈希的形式。二、转写测试如何验证这条规则仓库中的unison-src/transcripts/目录存放 Unison 的转写测试每个.md文件包含一段指令 Unison 代码的交互式脚本由转写框架执行后生成对应的.output.md期望输出文件。no-hash-in-term-declaration.md的完整内容为# No Hashes in Term Declarations There should not be hashes in the names used in term declarations, either in the type signature or the type definition. unison :hide-all :error x##Nat : Int - Int - Boolean x##Nat 5 这里的关键是指令标记:hide-all :error:hide-all表示该代码块中的所有输出包括错误信息都不写入转写输出文件:error则表明该代码块预期以出错的方式结束——即这段代码应当解析失败。因此对应的期望输出文件 no-hash-in-term-declaration.output.md 只保留了标题与规则说明两行没有任何代码或错误文本这正是代码因含哈希声明名而失败、且错误被隐藏的预期结果。如果未来某天 Unison 改变了该语法规则例如允许哈希声明名这段转写测试的.output.md将不再匹配实际输出测试即可立刻暴露行为变化。三、源码实现解析器为何拒绝哈希要理解x##Nat 5与x##Nat : Int - Int - Boolean为何失败需要沿 Unison 的词法 → 语法两层实现追查。3.1 词法层x##Nat可以被正常切分为哈希限定名首先需要说明x##Nat这样的写法在词法层面是合法的。在unison-syntax/src/Unison/Syntax/Lexer/Unison.hs中identifierP解析一个标识符后会通过P.optional shortHashP尝试读取可选的短哈希部分identifierP :: (Monad m) P.ParsecT (Token Err) String m (HQ.HashQualified Name) identifierP do P.label identifier (ex: abba1, snake_case, .foo.bar#xyz, .foo.#xyz, or ) do name - PI.withParsecT (fmap nameSegmentParseErrToErr) Name.nameP P.optional shortHashP \case Nothing - HQ.fromName name Just shorthash - HQ.HashQualified name shorthash即若标识符后面跟了#...短哈希就构造HQ.HashQualified name shorthash否则是纯名称HQ.fromName name。所以x##Nat会被词法器产出一个携带 hash 的HashQualified Name词元lexeme对应文档注释中的合法示例.foo.bar#xyz、.foo.#xyz。3.2 语法层prefixTermName明确拒绝带哈希的名称问题出在语法解析层。在unison-syntax/src/Unison/Syntax/Parser.hs中定义了两个行为不同的前缀标识符解析器-- | Parse a prefix identifier e.g. Foo or (), discarding any hash prefixDefinitionName :: (Var v) P v m (L.Token v) prefixDefinitionName wordyDefinitionName | parenthesize symbolyDefinitionName -- | Parse a prefix identifier e.g. Foo or (), rejecting any hash -- This is useful for term declarations, where type signatures and term names should not have hashes. prefixTermName :: (Var v) P v m (L.Token v) prefixTermName wordyTermName | parenthesize symbolyTermName where wordyTermName queryToken \case L.WordyId (HQ.NameOnly n) - Just $ Name.toVar n _ - Nothing symbolyTermName queryToken \case L.SymbolyId (HQ.NameOnly n) - Just $ Name.toVar n _ - Nothing源码注释直接点明了设计意图This is useful for term declarations, where type signatures and term names should not have hashes该解析器用于 term 声明其中类型签名与 term 名称不应含有哈希。其实现核心是模式匹配只有词元是HQ.NameOnly n即未携带哈希的纯名称时才接受一旦词元是HQ.HashQualified ...携带哈希两个分支都会落入_ - Nothing解析即失败。与之形成对照的是prefixDefinitionName/wordyDefinitionName后者通过Name.toVar (HQ.toName n)丢弃哈希而只取名称因此foo#abc在类型/构造器定义等位置是允许出现的-- | Parse a wordy identifier e.g. Foo, discarding any hash wordyDefinitionName :: (Var v) P v m (L.Token v) wordyDefinitionName queryToken \case L.WordyId n - Just $ Name.toVar (HQ.toName n) _ - Nothing3.3 两个声明位置的实际调用点prefixTermName在parser-typechecker/src/Unison/Syntax/TermParser.hs中被用于 term 声明的两类关键位置1类型签名typedecl——x : T形式的声明头部对应文档中x##Nat : Int - Int - Boolean的失败场景typedecl :: (Monad m, Var v) P v m (L.Token v, Type v Ann) typedecl (,) $ P.try (prefixTermName * reserved :) * TypeParser.valueType * semiprefixTermName * reserved :意味着签名左侧的名称必须是纯名称其后紧跟冒号。x##Nat因携带哈希而无法通过prefixTermName该声明解析失败。2函数定义左部definition head——对应文档中x##Nat 5的失败场景。在 term 定义解析时左部lhs由中缀形式与前缀形式组成let infixLhs do (arg1, op) - P.try $ (,) $ prefixDefinitionName * symbolyDefinitionName arg2 - prefixDefinitionName pure (ann arg1, op, [arg1, arg2]) let prefixLhs do v - prefixTermName vs - many prefixTermName pure (ann v, v, vs) let lhs :: P v m (Ann, L.Token v, [L.Token v]) lhs infixLhs | prefixLhs注意prefixLhs中绑定名v与全部函数参数vs都使用prefixTermName解析infixLhs中用于中缀操作符两侧操作数的prefixDefinitionName虽然会丢弃哈希但中缀形式要求第一个 token 为符号型标识符symbolyDefinitionName与x##Nat的词形也不匹配。因此x##Nat 5中定义头x##Nat无法作为合法的绑定名被接受。四、设计动机为什么声明名要禁止哈希从源码注释与周边设计可以推断这条约束服务于两个目的声明的确定性一个 term 声明是在引入一个新名称而哈希限定名表示指向某个已存在、特定 hash 的实体。允许在声明位置写x##Nat会造成语义混淆——究竟是定义新名称x还是断言x对应某个既有 hash与声明名称的其他约束一致声明名还有额外的合法性要求。例如parser-typechecker/src/Unison/Syntax/TermParser.hs中的verifyRelativeName会拒绝以.开头的绝对名称DisallowedAbsoluteName声明名称必须是相对名称且无哈希保证绑定名始终是干净、可被命名空间解析的名称。五、给使用者的实践要点在.u源文件中声明 term 时类型签名x : T与函数定义x ...中的x必须是纯名称可含命名空间段如foo.bar不要加#hash后缀。若确实需要引用某个特定 hash 的既有定义例如跨库重名消歧请把哈希限定名用在引用位置表达式中而不是声明位置。符号型标识符如()同样受此约束()##a : ...这类写法会被symbolyTermName的HQ.NameOnly匹配拒绝。想要回归验证该行为可直接运行仓库的转写测试no-hash-in-term-declaration.md使用:hide-all :error断言带哈希的 term 声明必然解析失败其期望输出保存在 no-hash-in-term-declaration.output.md与unison-src/transcripts/目录下的其他转写用例共同构成对 Unison 语法规则的自动化守护。六、小结Term 声明名称禁止携带哈希是 Unison 语法设计中的一条小而关键的铁律它由词法器identifierP支持产出哈希限定词元与语法器prefixTermName只接受NameOnly的配合实现覆盖类型签名typedecl与函数定义头prefixLhs/infixLhs两类位置并有对应的转写测试持续验证。对使用者而言记住一句话即可声明要干净引用可带哈希。赞分享编程语言编译器语言运行时开发工具【免费下载链接】unisonA friendly programming language from the future项目地址https://gitcode.com/gh_mirrors/un/unison点击查看免费下载相关推荐Unison 语言中的哈希与 HMAC 内置函数crypto 模块 API 详解与测试实践Unison 语言中的哈希与 HMAC 内置函数crypto 模块 API 详解与测试实践 导读 Unison 是一门「来自未来」的编程语言其标准库在 cr编程语言编译器语言运行时开发工具Unison 字节字面量下划线分隔符完全指南语法规则、词法实现与测试验证Unison 字节字面量下划线分隔符完全指南语法规则、词法实现与测试验证 字节字面量bytes literal是 Unison 语言中表示 Bytes 类编程语言编译器语言运行时开发工具Action! 语言 ANTLR4 语法实现解析从语法规则、类型系统到示例验证Action! 语言 ANTLR4 语法实现解析从语法规则、类型系统到示例验证 导读 本文围绕 action/ https://link.gitcode.co编程语言编译器开发工具上一篇终极Citra模拟器使用指南如何完美运行3DS游戏的完整解决方案下一篇黑苹果配置革命OpCore-Simplify让OpenCore配置从8小时缩短到30分钟创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

PCA9422+STM32F405RG电源管理实战:寄存器配置与调试全解析

PCA9422+STM32F405RG电源管理实战:寄存器配置与调试全解析

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

2026/10/10 5:46:40 阅读更多 →
有效信息是博文生成的核心要素

有效信息是博文生成的核心要素

您提供的信息中没有有效的项目标题(当前显示为“无标题”),且相关热搜词和网络搜索内容均为空白。缺少核心输入,我无法生成围绕具体主题、场景和关键词展开的高质量原创博文。《无标题》不是一个可执行的项目主题,强行…

2026/10/10 5:46:40 阅读更多 →
colorlog 6.10.1 使用指南:为 Python 标准库 logging 接入 ANSI 彩色终端输出

colorlog 6.10.1 使用指南:为 Python 标准库 logging 接入 ANSI 彩色终端输出

【免费下载链接】context-hub 项目地址: https://gitcode.com/gh_mirrors/co/context-hub 点击查看 免费下载 导读 colorlog 是一个轻量的 Python 第三方库,它的作用是为 Python 标准库 logging 的处理器(handler)增加 ANSI 颜色…

2026/10/11 7:56:08 阅读更多 →

最新新闻

宁夏职业院校学工信息管理系统怎么选?本地需求特点要注意什么?

宁夏职业院校学工信息管理系统怎么选?本地需求特点要注意什么?

✅作者简介:合肥自友科技 📌核心产品:智慧校园平台(包括教工管理、学工管理、教务管理、考务管理、后勤管理、德育管理、资产管理、公寓管理、实习管理、就业管理、离校管理、科研平台、档案管理、学生平台等26个子平台) 。公司所有人员均有多…

2026/10/11 7:56:05 阅读更多 →
fasttext工具介绍 - 简介、作用、优势(调优代码实现)

fasttext工具介绍 - 简介、作用、优势(调优代码实现)

fasttext简介* 是自然语言处理(NLP)任务的开源工具包,由Facebook AI Research(FAIR)开发* 它被广泛用于各种任务,包括情感分析、文本分类、命名实体识别、机器翻译等 * fasttext主要作用* 进行文本…

2026/10/11 7:56:05 阅读更多 →
用Python搭建FHIR服务器:从互操作到JSONB存储实战

用Python搭建FHIR服务器:从互操作到JSONB存储实战

简介:fhir-python-server 是一个基于 Python 实现的 FHIR 标准服务器项目,面向医疗信息化开发者、数据互操作研究人员,以及需要搭建符合 HL7 FHIR 规范的 RESTful API 服务的技术人员。资源包含项目完整源代码,可用于理解 FHIR 资…

2026/10/11 7:56:05 阅读更多 →
校考再瘦身、统考成核心:2027届音乐艺考正在发生的三个变化

校考再瘦身、统考成核心:2027届音乐艺考正在发生的三个变化

校考再瘦身、统考成核心:2027届音乐艺考正在发生的三个变化科普视角|当校考院校一年比一年少,音乐艺考生的备考重心,正从"冲校考"转向"稳统考、保文化"。2027届音乐艺考的招生政策陆续公布,变化集…

2026/10/11 7:56:05 阅读更多 →
在VScode中运行jupyter没有结果?把settings.json改到TaoToken排查

在VScode中运行jupyter没有结果?把settings.json改到TaoToken排查

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

2026/10/11 7:56:05 阅读更多 →
硬件入门学习3-时序逻辑电路

硬件入门学习3-时序逻辑电路

一、触发器 时序逻辑电路与组合逻辑电路不同,其输出取决于当前的输入,也取决于电路的历史状态。时序电路的核心是存储元件:触发器。 时钟是时序电路的心跳,控制电路的状态变化时刻 关键参数: - 频率(Fre…

2026/10/11 7:55:05 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/10 10:38:42 阅读更多 →