豫言源码浏览器 / Source Browser

浏览项目文件与源码

yuyan · 422 行 · 24910 字节 · UTF-8
§
寻观「标准库」之书。
寻观「编译器核心」之「编译步骤」之「类型检查」之「模式合一」之书。

寻观「编译器核心」之「编译数据」之「抽象绑定树结构」之「抽象语法树」之「总集」之书。

。

寻观「编译器核心」之「编译数据」之「抽象绑定树结构」之「命名环境术」之书。
寻观「编译器核心」之「编译数据」之「语言服务信息」之书。
寻观「编译器核心」之「编译数据」之「操作符」之「操作符数据结构」之书。

寻观「编译器核心」之「顺序标识符」之「顺序标识符」之书。
寻观「编译器核心」之「编译数据」之「编译配置」之「编译期输出」之书。
寻观「编译器核心」之「编译步骤」之「类型检查」之「类型检查工具」之书。
寻观「编译器核心」之「编译步骤」之「类型检查」之「类型检查基础」之书。
寻观「编译器核心」之「编译步骤」之「类型检查」之「函数应用隐式参数合成」之书。

「检查模式类型并更新环境」乃
  化「命名环境」而
  化「表达式」 「:对象:」而
  化「表达式」 「:模式的类型:」而
  「表达式」合
    「命名环境」 「:检查后的环境及类型:」
也。
「检查模式类型并更新环境」者会「境」而会「物」而会「类」而
  虑「结果」者
    (化「命名环境」而化「表达式」而化「表达式」而「表达式」合「命名环境」也会「境」而会「物」而会「类」而
    虑「无」者
      「详细调试打印行」于(会「无」而『[D]正在检查模式类型,模式:』附(「表达式表示」于「物」)附
        『,类型:』附(「表达式表示」于「类」))
    而
    虑「检查模式函数应用」者
      (化「命名环境」而化「表达式」而化「表达式」而「表达式」合「命名环境」也
      会「初境」而会「应用物」而会「期望类」而
      虑「头及脊」者「收集函数调用头脊」于「应用物」而
      虑「头类及物」者
        (「读引用」于「进行对象类型合成引用」)于「初境」
          于(「头及脊」中「零」)而
      递归虑「处理参数组」其
        化「表达式」而化「表达式」而化「命名环境」而化(「列」于(「参数形式」合「表达式」))而
        「表达式」合「表达式」合「命名环境」者
          会「当前类」而会「当前物」而会「当前境」而会「剩余脊」而
          虑「初已用名」者
            (「附加」授以「字符串」)
            于(「读取式自由变量」于「当前物」)
            于((「附加」授以「字符串」)
            于(「读取式自由变量」于「期望类」)
            于(「命名环境获取所有名称」于「当前境」))
          而
          鉴(「读取函数应用类型骨架」于「初已用名」于「当前类」)而
            有(「上下文」与「隐式名们」与「参数类型们」与「返回类型」)则
              若(「且」
                于(「等」于(「长度」于「隐式名们」)于「零」)
                于(「等」于(「长度」于「参数类型们」)于「零」))
              则
                「发生事故」
                  于『模式函数调用的当前结果不是函数:』附(「表达式表示」于「当前类」)
              否则
                (
                  鉴(「拆分函数应用参数组」
                    于(「长度」于「隐式名们」)
                    于(「长度」于「参数类型们」)于
                      「阳」于「剩余脊」)而
                    有(「已给隐式参数们」与「显式参数们」与「后脊」)
                    则(
                      虑「当前可能期望类」者
                        (
                          鉴「后脊」而
                            有「罄」则(「可有」授以「表达式」)
                            于「期望类」
                            或有「非空后脊」则
                              「可无」授以「表达式」
                        )
                      而
                      虑「接地骨架」者「上下文」与「隐式名们」与「参数类型们」与
                        「返回类型」
                      而
                      虑「缺省隐式参数们」者
                        「求解函数应用隐式参数」
                          于「当前境」
                          于
                          「接地骨架」
                            于「已给隐式参数们」
                            于「显式参数们」于
                            「当前可能期望类」
                      而
                      虑「全部隐式参数们」者
                        (「附加」授以「表达式」)
                        于
                          「已给隐式参数们」于「缺省隐式参数们」而
                      递归虑「检查隐式参数们」其化「表达式」而化「表达式」而化「爻」而化(「列」于「表达式」)而
                        「表达式」合「表达式」合
                          「爻」者会「隐式当前类」而会「隐式当前物」而会「已经开始」
                            而
  会「待查隐式参数们」而
  鉴「待查隐式参数们」而
    有「罄」则「隐式当前类」与「隐式当前物」与「已经开始」
    或有(「缀」于「参数」于「后参数们」)
    则(
      虑「后参数」者
        (「读引用」于「进行类型类型检查引用」)于「当前境」于「参数」
      而
      虑「后类」者
        「应用首隐式类型参数」于
          「隐式当前类」于
            「后参数」
      而
      虑「后物」者
        「添加当前函数应用组参数」于
          「已经开始」于
            「隐式当前物」于
              「隐式」于
                「后参数」
      而
      「检查隐式参数们」于
        「后类」于
          「后物」于「阳」于
            「后参数们」
    )
                      而
                      鉴(「检查隐式参数们」于「当前类」于「当前物」于「阴」于「全部隐式参数们」)而
                        有(「显式函数类」与「隐式后物」与「已经开始」)则(
                          鉴
                          「显式参数们」而
                            有「罄」则(
                              鉴「后脊」而
                                有「罄」则「显式函数类」与「隐式后物」与「当前境」
                                或有「非空后脊」则
                                  「处理参数组」
                                    于「显式函数类」
                                    于
                                    「隐式后物」于「当前境」于「后脊」
                            )
                            或有「非空显式参数们」则(
                              鉴(「拆分多参数函数类型」于「显式函数类」)而
                                有(「可有」于(「实际参数类型们」与「实际返回类型」))
                                则(
                                  虑「无」者
                                    若(「等」于(「长度」于「实际参数类型们」)于(「长度」于「显式参数们」))则
                                      「元」
                                    否则
                                      「发生事故」
                                        于
                                        『模式函数应用显式参数数量与函数类型不一致』而
                                  递归虑
                                    「检查显式参数们」其化「表达式」而化「命名环境」而化「爻」而化(「列」于「表达式」)而
                                    化(「列」于「表达式」)而「表达式」合「命名环境」者会「显式当前物」而会
                                      「显式当前境」而会「已有参数」而会「待查参数们」而会「待查类型们」而鉴
                                        「待查参数们」与「待查类型们」而
                                        有「罄」与「罄」则「显式当前物」
                                          与「显式当前境」
                                        或有(「缀」于「参数」于「后参数们」)与(「缀」于「定义域」于「后类型们」)
                                        则(
                                          鉴(「检查模式类型并更新环境」于「显式当前境」于「参数」于「定义域」)而
                                            有(「后参数」与「后境」)则(
                                              虑「后物」者
                                                「添加当前函数应用组参数」
                                                  于「已有参数」
                                                  于「显式当前物」
                                                  于「显式」于「后参数」
                                              而
                                              「检查显式参数们」
                                                于「后物」
                                                于「后境」
                                                于「阳」
                                                于「后参数们」于「后类型们」
                                            )
                                        )
                                        或有「其他」则
                                          「发生事故」
                                            于『模式函数应用参数与参数类型没有一一对应』而鉴(「检查显式参数们」
                                            于「隐式后物」
                                            于「当前境」
                                            于「已经开始」
                                            于「显式参数们」于「实际参数类型们」)而
                                            有(「显式后物」与「显式后境」)则(
                                              鉴「后脊」而
                                                有「罄」则「实际返回类型」与「显式后物」与「显式后境」
                                                或有「非空后脊」则
                                                  「处理参数组」
                                                    于「实际返回类型」
                                                    于「显式后物」
                                                    于「显式后境」于「后脊」
                                            )
                                )
                                或有「可无」则
                                  「发生事故」
                                    于
                                    『模式函数调用的当前类型不是显式函数类型』
                            )
                        )
                    )
                )
      而
      鉴(「处理参数组」于(「头类及物」中「零」)于(「头类及物」中「一」)于「初境」于(「头及脊」中「一」))
而
        有(「结果类」与「结果物」与「结果境」)
        则(虑「无」者「断言类型相等」于「结果类」于「期望类」而「结果物」与「结果境」)
      )
    而
    「尝试运行」
      于(会「无」而
        鉴「类」而
          「:TODO 检查对象节点的匹配:」
          有「其他类」则(
            鉴「物」而
              有(「式节点」于(「源码范围标注节点」于「范围」)于((「列」【「源码物」】)))
              则(
                虑「后物及境」者
                  「检查模式类型并更新环境」于
                    「境」于
                    「源码物」于
                    「类」
                而
                虑「无」者
                  「记录悬停文字信息」于「范围」
                  于(「悬停类型文字」于「类」)
                而
                「后物及境」
              )
              或有「自由变量」于「名」则(
                鉴(「解析单个名称及物」于「境」于「名」)而
                  有(「可有」于(「名类」与「名物」))则(
                    鉴「名类」而
                      有「构造器类」则(
                        鉴「构造器类」而
                        「:TODO 为何要加隐式参数?:」
                          有(「式节点」于(「隐式派类型节点」于「忽略参数个数」)于((「列」【「值域」】)))
                          则
                            (「检查模式函数应用」于「境」于「名物」于「类」)
                          或有「其他构造器类」
                          则(虑「无」者「断言类型相等」于「构造器类」于「类」而「名物」与「境」)
                      )
                  )
                  或有「可无」则( 「:新绑定:」
                    鉴「类」而
                      有「其他」则(
                        虑「后境」者
                          「添加声明不改变名」于『129』于「境」于「名」于「类」而
                        「:TODO:被绑定的变量仍以自由变量形式存在:」
                        (「式节点」于(「模式匹配新变量」于「名」)于((「列」【「类」】)))与
                          「后境」
                      )
                  )
              )
              或有「式节点」
                于(「模式匹配新变量」于「名」)
                于((「列」【「模式名类」】))则(
                  鉴(「解析单个名称及物」于「境」于「名」)而
                    有(「可有」于(「名类」与「名物」))则(「发生事故」于『模式匹配不应当存在』)
                    或有「可无」则(
                      虑「无」者「断言类型相等」于「类」于「模式名类」
                      而
                      虑「后境」者
                        「添加声明不改变名」于『144』于「境」于「名」于「类」
                      而
                      (「式节点」于(「模式匹配新变量」于「名」)于((「列」【「模式名类」】)))与
                      「后境」
                    )
                )
              或有(「式节点」于「空缺」于「罄」)
              则(
                虑「新名」者「下个字符序数」于『匿名模式』
                而
                虑「后境」者
                  「添加声明不改变名」于『模式空缺』于「境」于「新名」于
                  「类」
                而
                (「式节点」于(「模式匹配新变量」于「新名」)于((「列」【「类」】)))与「后境」
              )
              或有(「式节点」于「函数调用」于「忽略项们」)则
                (「检查模式函数应用」于「境」于「物」于「类」)
              或有(「式节点」于(「元组构造节点」)于「元素们」)则(
                鉴「类」而
                  有
                (「式节点」于(「元组类型节点」)于「类型们」)则(
                  若(「不等于」于(「长度」于「元素们」)于(「长度」于「类型们」))
                  则
                    (「发生事故」于『元组模式元素个数和元组类型个数不匹配』)
                  否则
                    (
                      虑「结果」者
                        (「从左折叠」授以(「表达式」合「表达式」)授以((「列」于「表达式」)合「命名环境」))
                        于(遇
                          「表达式」合「表达式」者「元素及类型」而会「已有」
                            而
  虑「后元素及境」者
    「检查模式类型并更新环境」
      于(「已有」中「一」)
      于(「元素及类型」中「零」)
      于(「元素及类型」中「一」)
  而
  ((「缀」授以「表达式」)于(「后元素及境」中「零」)于(「已有」中「零」))与(「后元素及境」中「一」))
  于((「罄」授以「表达式」)与「境」)
  于((「拉链合并」授以「表达式」授以「表达式」)于「元素们」于「类型们」)而
  (「式节点」于(「元组构造节点」)于(「反转」于(「结果」中「零」)))与(「结果」中「一」)
                    )
                )
                  或有「其他」则
                    「发生事故」
                      于『元组模式需要明确的元组类型:』附(「表达式表示」于「类」)
              )
              或有(「式节点」于(「内建节点」于「内建爻阳」)于「罄」)
              则(
                虑「无」者
                  「断言类型相等」
                    于(「式节点」于(「内建节点」于「内建类型爻」)于「罄」)
                    于「类」
                而
                「物」与「境」
              )
              或有(「式节点」于(「内建节点」于「内建爻阴」)于「罄」)
              则(
                虑「无」者
                  「断言类型相等」
                    于(「式节点」于(「内建节点」于「内建类型爻」)于「罄」)
                    于「类」
                而
                「物」与「境」
              )
              或有(「式节点」于(「整数节点」于「数」)于「罄」)
              则(
                虑「无」者
                  「断言类型相等」
                    于(「式节点」于(「内建节点」于「内建类型整数」)于「罄」)
                    于「类」
                而
                「物」与「境」
              )
              或有(「式节点」于(「字符串节点」于「串」)于「罄」)
              则(
                虑「无」者
                  「断言类型相等」
                    于(「式节点」于(「内建节点」于「内建类型字符串」)于「罄」)
                    于「类」
                而
                「物」与「境」
              )
                「:其他表达式假设是直接值,不含变量,直接检查类型:」
              或有(「式节点」于(「结构投影」于「投影名」)于「参」)则
                (虑「后物」者(「读引用」于「进行对象类型检查引用」)于「境」于「物」于「类」而「后物」与「境」)
              或有(「式节点」于(「结构投影带序数」于「投影名」于「序数」)于「参」)则
                (虑「后物」者(「读引用」于「进行对象类型检查引用」)于「境」于「物」于「类」而「后物」与「境」)
              或有(「式节点」于(「文件定义引用节点」于「文件名」于「定义名」于「序数」)于「参」)则
                (虑「后物」者(「读引用」于「进行对象类型检查引用」)于「境」于「物」于「类」而「后物」与「境」)
              或有(「式节点」
                于(「唯一构造器节点」于「序数」于「文件路径」于「构造器名」)
                于((「列」【「构造器类」】)))
                则
                  (虑「无」者「断言类型相等」于「构造器类」于「类」而「物」与「境」)
              或有「其他」则
                「发生事故」
                  于『不是支持的模式匹配项:』附(「表达式表示」于「物」)
          ))
          于(会「异常」而
            「发生事故」于(「异常」附『「:换行:」=======》》》》 在检查模式|』附(「表达式表示」于「物」)
            附『|「:换行:」    拥有类型|』附(「表达式表示」于「类」)
            附『|「:换行:」    即:|』附(「表达式表示」于(「类」))附『|时』
              附『|「:换行:」    环境::|』附(「间合」于『,』于(「命名环境获取所有名称」于「境」))附
                『|时』))
    )而
      「结果」于「境」于「物」于「类」
也。

「检查模式匹配分支」乃
  化「命名环境」而
  化「表达式」 「:分支:」而
  化「表达式」 「:返回的类型:」而
  化「表达式」 「:被匹配的类型:」而
  「表达式」 「:检查后的分支:」
也。
「检查模式匹配分支」者会「境」而会「分支」而会「返回类」而会「原匹配类」而
  鉴「分支」而
    有(「式节点」于(「模式匹配分支」)于((「列」【「模式」,「尾式」】)))
    则(
      虑「后模式及后境」者
        「检查模式类型并更新环境」于
          「境」于「模式」于
          「原匹配类」而
          虑「后模式」者「后模式及后境」中「零」而
          虑「后境」者「后模式及后境」中「一」而
          虑「后尾式」者
            (「读引用」于「进行对象类型检查引用」)
            于
            「后境」于「尾式」于「返回类」
          而
          (「式节点」于(「模式匹配分支」)于((「列」【「后模式」,「后尾式」】)))
    )
    或有「其他」则
      「发生事故」于『不是模式匹配分支』
也。

「模式匹配分支类型合成」乃
  化「命名环境」而
  化「表达式」 「:分支:」而
  化「表达式」 「:被匹配的类型:」而
  「表达式」合
    「表达式」 「:检查后的分支类及物:」
也。
「模式匹配分支类型合成」者会「境」而会「分支」而会「原匹配类」而
  鉴「分支」而
    有(「式节点」于(「模式匹配分支」)于((「列」【「模式」,「尾式」】)))
    则(
      虑「后模式及后境」者
        「检查模式类型并更新环境」于
          「境」于「模式」于
          「原匹配类」而
          虑「后模式」者「后模式及后境」中「零」而
          虑「后境」者「后模式及后境」中「一」而
          虑「尾类及物」者
            (「读引用」于「进行对象类型合成引用」)于
              「后境」于「尾式」
          而
          (「尾类及物」中「零」)
            与(「式节点」于(「模式匹配分支」)于((「列」【「后模式」,(「尾类及物」中「一」)】)))
    )
    或有「其他」则
      「发生事故」于『不是模式匹配分支』
也。

「写引用」于「检查模式匹配分支引用」于「检查模式匹配分支」。
「写引用」于「模式匹配分支类型合成引用」于「模式匹配分支类型合成」。