豫言语言语法规范
本文描述当前编译器源码采用的核心语法。
文件
豫言源文件通常使用 .yuyan 或 。豫 后缀。一个文件是一组声明,声明之间用中文句号 。 分隔。大多数声明自身以 也 收束,因此常见结尾是 也。
空白和换行主要用于排版。表达式需要明确分组时使用全角圆括号 (...)。
词法
标识符使用书名号式引号:
「整数」
「表达式」
「进行类型检查」
函数名、类型名、构造器名、模块名和绑定名都按这个规则书写。数字字面量目前也使用同一对引号,由编译器在名称解析前识别。
字符串使用 『』:
『你好』
『可以包含中文标点。』
注释使用 「:...:」,可以单独成行,也可以夹在类型或表达式附近:
「:这里是注释:」
整数和小数字面量写在 「」 中,可以使用汉字数字或阿拉伯数字,并用 点 或 . 分隔小数部分:
「零」
「一」
「一二三」
「三点一四」
「123」
「3.14」
这些内容在词法阶段与普通标识符形式相同,随后才会转换成数字节点;裸写的 一 或 3.14 不能作为数字表达式。
导入与导出
模块路径由 之 串联,每一段是一个标识符。
寻「标准库」之书。
观「标准库」之书。
寻观「标准库」之「数据结构」之书。
寻诵「标准库」之「数据结构」之书。
观诵「数据结构」之书。
寻观诵「标准库」之「数据结构」之书。
诵「数据结构」之书。
寻 导入模块,观 打开模块,诵 导出模块内容;寻观、寻诵、观诵 和 寻观诵 组合这些操作。
声明
类型声明:
「翻倍」乃化「整数」而「整数」也。
定义声明:
「翻倍」者会「数」而「加」于「数」于「数」也。
普通定义可以先用 乃 声明类型,再紧接一个使用 者 的同名定义。类型定义使用 即,默认可以在类型检查时展开,不需要额外标记:
「别名」即「整数」也。
构造器声明使用 立:
「选项」立化「元类型」而「元类型」也。
「可无」立承「甲」而「选项」于「甲」也。
「可有」立承「甲」而化「甲」而「选项」于「甲」也。
文件中也可以直接放一个表达式作为声明:
「打印行」于『完成』。
类型
显式函数类型:
化「整数」而「字符串」
带名的类型参数:
承「元类型」者「甲」而化「甲」而「甲」
当前编译器只允许这种参数的定义域为 「元类型」;不支持依赖于普通运行时值的函数类型。
隐式函数类型:
承「甲」而「甲」
承「甲」而化「甲」而「甲」
类型函数也用 于 应用:
「或可有」于「整数」
对子或元组类型使用 合,列类型通过类型构造器 「列」 表示:
「字符串」合「整数」
「列」于「表达式」
类型标注表达式使用 也,类型写在左侧、被标注的表达式写在右侧:
(「整数」也「值」)
表达式
标识符表达式就是一个带引号的名字:
「翻倍」
显式函数调用使用 于,多参数调用连续书写:
「翻倍」于「一二」
「加」于「一」于「二」
隐式参数调用使用 授以:
「读取」授以「整数」于「引用」
显式函数使用 会...而...:
会「数」而「加」于「数」于「数」
带参数类型的函数使用 遇...者...而...:
遇「整数」者「数」而「加」于「数」于「数」
隐式函数使用 受...而...:
受「甲」而会「物」而「物」
局部绑定使用 虑...者...而...:
虑「结果」者「加」于「一」于「二」而
「整数表示」于「结果」
表达式级递归绑定使用 递归虑...其...者...而...。其 后写递归值的类型,者 后写递归值定义,最后的 而 后写使用该递归值的表达式:
递归虑「求零」其化「整数」而「整数」者
会「数」而
若「等于」于「数」于「零」
则「零」
否则(「求零」于(「减」于「数」于「一」))
而
「求零」于「三」
递归虑 适合在表达式内部构造局部递归函数或递归值。绑定名在定义体和后续表达式中都可见。编译器会先把它降为显式递归单元,再进行闭包转换,因此递归函数可以安全捕获自身。
顶层定义在其类型声明之后可以直接引用自身,不需要旧的 循...以... 形式。例如标准库中的列长度函数可以写成:
「长度」乃承「甲」而化(「列」于「甲」)而「整数」也。
「长度」者受「甲」而会「列值」而
鉴「列值」而
有「罄」则「零」
或有「缀」于「头」于「尾」则
「加」于「一」于(「长度」授以「甲」于「尾」)也。
条件表达式:
若「条件」则「真值」否则「假值」
顺序执行使用 ;:
(「写引用」于「引用」于「值」;「读取引用」于「引用」)
模块或结构投影使用 之:
「标准库」之「数据结构」
对子或元组投影使用 中:
「对子」中「零」
「三元组」中「二」
数据构造
对子值使用 与:
「名字」与「类型」
列值使用标准库构造器 「罄」 和 「缀」:
「罄」
「缀」于「头」于「尾」
「缀」于「甲」于(「缀」于「乙」于(「缀」于「丙」于「罄」))
当前编译器不支持在括号中内联声明结构;模块结构由源文件以及导入、打开和导出操作组成。
模式匹配
模式匹配使用 鉴...而...。第一个分支用 有,后续分支用 或有:
鉴「可」而
有(「可有」于「物」)则「物」
或有「可无」则「默认」也
空参构造器或绑定名直接写在 有、或有 后面,不额外加一层括号:
或有「可无」则「默认」
带参数构造器模式用普通应用形式:
有(「可有」于「物」)则「物」
列模式使用同样的构造器匹配空列或头尾:
有「罄」则「零」
或有「缀」于「头」于「尾」则「加」于「一」于(「长度」于「尾」)
对子模式使用 与:
有(「左」与「右」)则「左」
外部调用
外部调用保留给运行时和编译器内部使用:
《《C调用》》名『豫言_整数加』传「甲」与「乙」
完整示例
寻观「标准库」之书。
「取默认」乃承「甲」而化(「或可有」于「甲」)而化「甲」而「甲」也。
「取默认」者受「甲」而会「可」而会「默认」而
鉴「可」而
有(「可有」于「物」)则「物」
或有「可无」则「默认」也。
「翻倍」乃化「整数」而「整数」也。
「翻倍」者会「数」而「加」于「数」于「数」也。