豫言语言语法规范

本文述当前编译器源码所用之核心语法。

文件

豫言源文件通常用 .yuyan。豫 后缀。一文件为一组声明,声明之间以中文句号 分隔。多数声明自身以 收束,故常见结尾为 也。

空白与换行,主要用于排版。表达式须明确分组时,用全角圆括号 (...)

词法

标识符用书名号式引号:

「整数」
「表达式」
「进行类型检查」

函数名、类型名、构造器名、模块名与绑定名,皆循此规。数字字面量今亦用同一对引号,由编译器于名称解析之前识别。

字符串用 『』

『你好』
『可以包含中文标点。』

注释用 「:...:」,可独行,亦可夹于类型或表达式之旁:

「:这里是注释:」

整数与小数字面量书于 「」 中,可用汉字数字或阿拉伯数字,以 . 分小数之部:

「零」
「一」
「一二三」
「三点一四」
「123」
「3.14」

此诸文于词法阶段与普通标识符同形,随后方转为数字节点;裸书之 3.14,不可为数字表达式。

导入与导出

模块路径以 串联,每段为一标识符。

寻「标准库」之书。
观「标准库」之书。
寻观「标准库」之「数据结构」之书。
寻诵「标准库」之「数据结构」之书。
观诵「数据结构」之书。
寻观诵「标准库」之「数据结构」之书。
诵「数据结构」之书。

导入模块, 打开模块, 导出模块内容;寻观寻诵观诵寻观诵,组合诸操作。

声明

类型声明:

「翻倍」乃化「整数」而「整数」也。

定义声明:

「翻倍」者会「数」而「加」于「数」于「数」也。

普通定义可先以 声明类型,再紧接一同名之 定义。类型定义用 ,默认于类型检查时展开,无须另标:

「别名」即「整数」也。

构造器声明用

「选项」立化「元类型」而「元类型」也。
「可无」立承「甲」而「选项」于「甲」也。
「可有」立承「甲」而化「甲」而「选项」于「甲」也。

文件中亦可直书一表达式为声明:

「打印行」于『完成』。

类型

显式函数类型:

化「整数」而「字符串」

带名之类型参数:

承「元类型」者「甲」而化「甲」而「甲」

当前编译器惟许此类参数之定义域为 「元类型」;赖普通运行时值之函数类型,尚不支持。

隐式函数类型:

承「甲」而「甲」
承「甲」而化「甲」而「甲」

类型函数亦以 应用:

「或可有」于「整数」

对子或元组类型用 ;列类型以类型构造器 「列」 表之:

「字符串」合「整数」
「列」于「表达式」

类型标注表达式用 ,类型书于左,被标注之表达式书于右:

(「整数」也「值」)

表达式

标识符表达式,即一带引号之名:

「翻倍」

显式函数调用用 ,多参数调用连书:

「翻倍」于「一二」
「加」于「一」于「二」

隐式参数调用用 授以

「读取」授以「整数」于「引用」

显式函数用 会...而...

会「数」而「加」于「数」于「数」

带参数类型之函数用 遇...者...而...

遇「整数」者「数」而「加」于「数」于「数」

隐式函数用 受...而...

受「甲」而会「物」而「物」

局部绑定用 虑...者...而...

虑「结果」者「加」于「一」于「二」而
    「整数表示」于「结果」

表达式级递归绑定用 递归虑...其...者...而... 后书递归值之类型, 后书递归值之定义,末 后书用此递归值之表达式:

递归虑「求零」其化「整数」而「整数」者
    会「数」而
        若「等于」于「数」于「零」
        则「零」
        否则(「求零」于(「减」于「数」于「一」))
而
    「求零」于「三」

递归虑 宜于表达式内构局部递归函数或递归值。绑定名于定义体与后续表达式中皆可见。编译器先降之为显式递归单元,再行闭包转换,故递归函数可安全捕获自身。

顶层定义于其类型声明之后,可直引自身,无须旧式 循...以...。如标准库中列长度函数可书为:

「长度」乃承「甲」而化(「列」于「甲」)而「整数」也。
「长度」者受「甲」而会「列值」而
    鉴「列值」而
        有「罄」则「零」
        或有「缀」于「头」于「尾」则
            「加」于「一」于(「长度」授以「甲」于「尾」)也。

条件表达式:

若「条件」则「真值」否则「假值」

顺序执行用

(「写引用」于「引用」于「值」;「读取引用」于「引用」)

模块或结构投影用

「标准库」之「数据结构」

对子或元组投影用

「对子」中「零」
「三元组」中「二」

数据构造

对子值用

「名字」与「类型」

列值用标准库构造器 「罄」「缀」

「罄」
「缀」于「头」于「尾」
「缀」于「甲」于(「缀」于「乙」于(「缀」于「丙」于「罄」))

当前编译器不支持于括号中内联声明结构;模块结构由源文件及导入、打开、导出诸操作组成。

模式匹配

模式匹配用 鉴...而...。首分支用 ,后续分支用 或有

鉴「可」而
    有(「可有」于「物」)则「物」
    或有「可无」则「默认」也

空参构造器或绑定名,直书于 或有 之后,不另加括号:

或有「可无」则「默认」

带参数构造器模式用普通应用形式:

有(「可有」于「物」)则「物」

列模式用同构器,匹配空列或头尾:

有「罄」则「零」
或有「缀」于「头」于「尾」则「加」于「一」于(「长度」于「尾」)

对子模式用

有(「左」与「右」)则「左」

外部调用

外部调用留予运行时与编译器内部:

《《C调用》》名『豫言_整数加』传「甲」与「乙」

完整示例

寻观「标准库」之书。

「取默认」乃承「甲」而化(「或可有」于「甲」)而化「甲」而「甲」也。
「取默认」者受「甲」而会「可」而会「默认」而
    鉴「可」而
        有(「可有」于「物」)则「物」
        或有「可无」则「默认」也。

「翻倍」乃化「整数」而「整数」也。
「翻倍」者会「数」而「加」于「数」于「数」也。