豫言源码浏览器 / Source Browser

浏览项目文件与源码

yuyan · 637 行 · 34644 字节 · UTF-8
§
「:展开模式匹配成Decision Tree:」

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

。
寻观「编译器核心」之「编译数据」之「编译配置」之「编译期输出」之书。

寻观「编译器核心」之「编译步骤」之「类型标注擦除」之「模式匹配消除」之书。

寻观「编译器核心」之「顺序标识符」之「顺序标识符」之书。

「检查模式头一致」乃化「字符串」而化「节点名称」而化「节点名称」而「爻」也。
「检查模式头一致」者会「调试」而会「名甲」而会「名乙」而
  鉴「名甲」与「名乙」而
    有(「展开后唯一构造器节点」于「序数甲」)与(「展开后唯一构造器节点」于「序数乙」)则
      (「等」于「序数甲」于「序数乙」)
    或有(「整数节点」于「数甲」)与(「整数节点」于「数乙」)则
      (「等」于「数甲」于「数乙」)
    或有(「字符串节点」于「串甲」)与(「字符串节点」于「串乙」)则
      (「串相等」于「串甲」于「串乙」)
    或有(「内建节点」于「内建爻阳」)与(「内建节点」于「内建爻阳」)则
      「阳」
    或有(「内建节点」于「内建爻阴」)与(「内建节点」于「内建爻阴」)则
      「阳」
    或有(「内建节点」于「内建爻阴」)与(「内建节点」于「内建爻阳」)则
      「阴」
    或有(「内建节点」于「内建爻阳」)与(「内建节点」于「内建爻阴」)则
      「阴」
    或有「元组构造节点」与「元组构造节点」则
      「阳」
    或有「其他」则
      「发生事故」
        于「调试」附『,67,模式不一致,检查类型检查:』附(「节点名称表示」于「名甲」)附
          『,』附(「节点名称表示」于「名乙」)
也。

「收集模式头」乃
  化(「列」于(「节点名称」合「整数」 「:参数个数:」
))而化(「列」于「表达式」)而「列」于(「节点名称」合「整数」)也。
「收集模式头」者会「已有」而会「待处理」而
  鉴「待处理」而
    有「罄」则「已有」
    或有(「缀」于「当前」于「剩余」)则(
      鉴「当前」而
        有(「式节点」于(「模式匹配新变量」于「名」)于「参」)则
          (「收集模式头」于「已有」于「剩余」)
        或有(「式节点」于(「节点」)于「参数」)则(
          若((「存在吗」授以(「节点名称」合「整数」))
          于(会
            「节名及数」而
              若(「检查模式头一致」于『59』于(「节点」)于(「二对子取零」于「节名及数」))
              则
                (
                  若(「等」于(「节名及数」中「一」)于(「长度」于「参数」))
                  则
                    「阳」
                  否则
                    「发生事故」于『参数长度不匹配62』
                )
              否则
                (「阴」))于「已有」)
          则
            (「收集模式头」于「已有」于「剩余」)
          否则
            (「收集模式头」
              于((「附加」授以(「节点名称」合「整数」))
              于「已有」
              于(((「列」于(「节点名称」合「整数」))也((「列」【(「节点」与(「长度」于「参数」))】)))))
              于「剩余」)
        )
        或有「其他」则
          「发生事故」于『50不支持的模式匹配项』附(「表达式表示」于「当前」)
    )
也。

「: 检查模式头全部统一乃化节点名称列而有也。
检查模式头全部统一者会名们而
    鉴名们而
        有【】则元
        或有「第一名」衔「后」则
                ((有列也态射于(检查模式头一致于第一名)于后);元)也。 :」

「:TODO Converage 
TODO 减少Code Copying:」
「展开模式匹配」乃
  化「表达式」 「:报错信息:」而
  化(「列」于「表达式」) 「:待匹配的:」而
  化(「列」于((「列」于「表达式」)合「表达式」)) 「:可能匹配分支:」而
  「表达式」 「:转换过的模式匹配表达式:」
也。
「展开模式匹配」者会「报错式」而会「待匹配」而会「可能匹配」而
  虑「递归」者
    (化(「列」于「表达式」)而化(「列」于((「列」于「表达式」)合「表达式」))而「表达式」也
    会「后待匹配」而会「后可能匹配」而
      「展开模式匹配」于「报错式」于「后待匹配」于「后可能匹配」
    )而
    虑「无」者
      (「编译调试打印行」
        于『pattern_expand』
        于(会「无」而
          『正在展开模式匹配:』附(「间合」于『||||』于((「态射」)于「待匹配」于「表达式表示」))附
            『「:换行:」可能分支:共』附(「整数表示」于(「长度」于「可能匹配」))附『个:』附(「间合」
              于
              『*********』于((「打表态射」授以((「列」于「表达式」)合「表达式」)授以「字符串」)
              于
                「可能匹配」于(会
                「可能匹配分支们」而「间合」
                  于『||||』
                  于((「态射」)
                  于(((「列」于「表达式」)合「表达式」也「可能匹配分支们」)中「零」)
                  于
                  「表达式表示」))))))而
    鉴「待匹配」而
      有「罄」则(
        若(「大于」于(「长度」于「可能匹配」)于「零」)
        则
          ((「第N个」授以((「列」于「表达式」)合「表达式」))于「零」于「可能匹配」)中「一」
        否则
          「报错式」
      )
      或有「非空待匹配」则(
        虑「所有模式头」者
          「收集模式头」
            于「罄」
            于((「态射」)
            于「可能匹配」
            于(会「模式」而(「第N个」授以「表达式」)于「零」于(「二对子取零」于「模式」)))
        而
        虑「匹配分支们」者
          (「态射」授以(「节点名称」合「整数」)授以「表达式」)
          于「所有模式头」
          于(会
          「模式头及参数长」
  而
  虑「符合分支」者
    「滤态射」授以((「列」于「表达式」)合「表达式」)授以((「列」于「表达式」)合「表达式」)
    于(会
      「当前」而
        鉴((「第N个」授以「表达式」)于「零」于(「二对子取零」于「当前」))而
          有(「式节点」于(「模式匹配新变量」于「变量名」)于「参」)
          则(
            虑「新变量名」者
              (「打表」授以「字符串」)
              于(「二对子取一」于「模式头及参数长」)
              于(会「数」而「下个字符序数」于『新参数』附(「整数表示」于「数」)附『_』)
            而
            (「可有」
              于(((「附加」授以「表达式」)
              于((「态射」)
              于
                「新变量名」于(会「名」而「式节点」
                  于(「模式匹配新变量」于「名」)
                  于(((「列」于「表达式」)也((「列」【(「式节点」于「待定节点」于「罄」)】))))))
                  于((「放」授以「表达式」)于「一」于(「二对子取零」于「当前」))
              )
  与(「式节点」
    于
                  「内联虑」于((「列」【
                    (
                      鉴(「模式头及参数长」中「零」)而
                        有(「展开后唯一构造器节点」于「序数甲」)则(「展开展开后唯一构造器节点」
                          于((「式节点」
                            于(「模式头及参数长」中「零」)
                            于((「态射」)于「新变量名」于「自由变量」))))
                        或有「其他」则((「式节点」
                          于(「模式头及参数长」中「零」)
                          于((「态射」)于「新变量名」于「自由变量」))
                        )
                    ),
                    (「进行抽象」于「变量名」于(「二对子取一」于「当前」))
                  】)))))
          )
          或有(「式节点」于(「其他头」)于「参数」)则(
            若(「检查模式头一致」于『116』于(「二对子取零」于「模式头及参数长」)于「其他头」)则(「可有」
              于(((「附加」授以「表达式」)
              于「参数」
              于((「放」授以「表达式」)于「一」于(「二对子取零」于「当前」))
              )与(「二对子取一」于「当前」)))
            否则
              (「可无」)
          ))于「可能匹配」
  而
  虑「递归分支」者「符合分支」而
  虑「无」者
    (「编译调试打印行」
      于『pattern_expand』
      于(会「无」而
        『递归匹配模式头:』附(「节点名称表示」于(「二对子取零」于「模式头及参数长」))附
          『。。。参数长:』附(「整数表示」于(「二对子取一」于「模式头及参数长」))))
  而
  鉴「模式头及参数长」中「零」而
    有(「展开后唯一构造器节点」于「构造序数」)则
      「式节点」
        于(「唯一构造器模式匹配分支」于「构造序数」)
        于((「列」【
          (「构造抽象」
            于
              『构造式元组』于(会「构造式元组」
                而
  虑「新待匹配」者
    ((「打表」授以「表达式」)
    于(「模式头及参数长」中「一」)
    于(会「序数」而「式节点」于(「元组解构节点」于「序数」)于((「列」【(「自由变量」于「构造式元组」)】)))
    )
  而
  「递归」于(「附加」于「新待匹配」于(「放」于「一」于「待匹配」))于
              「递归分支」))
        】)
        )
    或有(「整数节点」于「数」)则
      「式节点」
        于(「常量模式匹配分支」)
        于((「列」【
          (「式节点」于(「整数节点」于「数」)于「罄」),
          (「递归」于(「放」于「一」于「待匹配」)于「递归分支」)
        】)
        )
    或有(「字符串节点」于「串」)则
      「式节点」
        于(「常量模式匹配分支」)
        于((「列」【
          (「式节点」于(「字符串节点」于「串」)于「罄」),
          (「递归」于(「放」于「一」于「待匹配」)于「递归分支」)
        】)
        )
    或有(「内建节点」于「内建爻阳」)则
      「式节点」
        于(「常量模式匹配分支」)
        于((「列」【
          (「式节点」于(「内建节点」于「内建爻阳」)于「罄」),
          (「递归」于(「放」于「一」于「待匹配」)于「递归分支」)
        】)
        )
    或有(「内建节点」于「内建爻阴」)则
      「式节点」
        于(「常量模式匹配分支」)
        于((「列」【
          (「式节点」于(「内建节点」于「内建爻阴」)于「罄」),
          (「递归」于(「放」于「一」于「待匹配」)于「递归分支」)
        】)
        )
    或有「元组构造节点」则
      「式节点」
        于(「变量模式匹配分支」)
        于((「列」【
          (「构造抽象」
            于『构造式元组』
            于(会
              「构造式元组」
                而
  虑「新待匹配」者
    ((「打表」授以「表达式」)
    于(「模式头及参数长」中「一」)
    于(会「序数」而「式节点」于(「元组解构节点」于「序数」)于((「列」【(「自由变量」于「构造式元组」)】)))
    )
  而
  「递归」
    于(「附加」于「新待匹配」于(「放」于「一」于「待匹配」))
    于
            「递归分支」))
        】)
        ))
        而
        虑「默认分支」者
          (
            虑「新变量名」者「下个字符序数」于『模式匹配默认变量名』
            而
            虑「递归分支参数」者
              (「滤态射」授以((「列」于「表达式」)合「表达式」)授以((「列」于「表达式」)合「表达式」))
              于(会「当前」而鉴((「第N个」授以「表达式」)于「零」于(「二对子取零」于「当前」))而
                有(「式节点」于(「模式匹配新变量」于「变量名」)于「参」)则(「可有」
                  于(((「放」授以「表达式」)于「一」于(「二对子取零」于「当前」))
                    与(「式有名替换」于(「自由变量」于「新变量名」)于「变量名」于(「二对子取一」于「当前」))))
                或有(「式节点」于(「其他头」)于「参数」)则(「可无」))
                于「可能匹配」
            而
            (「或可有」于「表达式」也鉴「递归分支参数」而
                有「罄」则「可无」
                或有「其他」
                则(
                  虑「无」者
                    (「编译调试打印行」
                      于『pattern_expand』
                      于(会「无」而『递归默认模式匹配:』附(「间合」
                        于『||||』
                        于((「态射」)于「待匹配」于「表达式表示」))附
                          『(可能分支:共』附(「整数表示」于(「长度」于「可能匹配」))
                          附『个)』))
                  而
                  (「可有」
                    于(「式节点」
                      于(「变量模式匹配分支」)
                      于((「列」【
                        (「进行抽象」于「新变量名」于(「递归」于(「放」于「一」于「待匹配」)于「递归分支参数」))
                      】))))
                ))
          )
        而
        (
          「:展开爻匹配,并添加默认:」
          鉴「匹配分支们」而
            有「罄」则(
              鉴「默认分支」而
                有「可无」则
                  「发生事故」
                    于
                    『229不应当为零,因为待匹配分支不为零,其必属于匹配分支,或必属于默认分支』
                或有(「可有」于「首默认分支」)则(「式节点」
                  于「模式匹配」
                  于((「列」【((「第N个」授以「表达式」)于「零」于「待匹配」),「首默认分支」】)))
            )
            或有(「缀」
              于(「式节点」
                于(「常量模式匹配分支」)
                于((「列」【(「式节点」于(「内建节点」于「内建爻阳」)于「罄」),「阳结果」】)))
                于
                  「其余匹配分支」)则(
              鉴「其余匹配分支」而
                有「罄」则((
                    鉴「默认分支」而
                      有「可无」则(「式节点」
                        于「内联虑」
                        于((「列」【
                          ((「第N个」授以「表达式」)于「零」于「待匹配」),
                          (「构造抽象」
                            于『爻式』
                            于(会「爻式名」而「式节点」
                              于「爻分支节点」
                              于(「列」【「自由变量」于「爻式名」,「阳结果」,「报错式」】)))
                        】)))
                      或有(「可有」于(「式节点」于(「变量模式匹配分支」)于((「列」【「阴参」】))))
                      则(「式节点」
                        于「内联虑」
                        于((「列」【
                          ((「第N个」授以「表达式」)于「零」于「待匹配」),
                          (「构造抽象」
                            于『爻式』
                            于(会「爻式名」而「式节点」
                              于「爻分支节点」
                              于(「列」【
                                「自由变量」于「爻式名」,
                                「阳结果」,
                                「式替换」
                                  于(「自由变量」于「爻式名」)于「阴参」
                              】)))
                        】)))
                      或有「其他分支」则(「发生事故」于『默认分支格式不正确』)
                  )
                )
                或有((「列」【
                  (「式节点」
                    于(「常量模式匹配分支」)
                    于((「列」【(「式节点」于(「内建节点」于「内建爻阴」)于「罄」),「阴结果」】)))
                】))
                则(「式节点」
                  于「爻分支节点」
                  于(「列」【(「第N个」授以「表达式」)于「零」于「待匹配」,「阳结果」,「阴结果」】))
                或有「其他」则
                  「发生事故」于『常量匹配分支如果是爻,不应该有超过两个分支』
            )
            或有(「缀」
              于(「式节点」
                于(「常量模式匹配分支」)
                于((「列」【(「式节点」于(「内建节点」于「内建爻阴」)于「罄」),「阴结果」】)))
                于
                  「其余匹配分支」)则(
              鉴「其余匹配分支」而
                有「罄」则((
                    鉴「默认分支」而
                      有「可无」则(「式节点」
                        于「内联虑」
                        于((「列」【
                          ((「第N个」授以「表达式」)于「零」于「待匹配」),
                          (「构造抽象」
                            于『爻式』
                            于(会「爻式名」而「式节点」
                              于「爻分支节点」
                              于(「列」【「自由变量」于「爻式名」,「报错式」,「阴结果」】)))
                        】)))
                      或有(「可有」于(「式节点」于(「变量模式匹配分支」)于((「列」【「阳参」】))))
                      则(「式节点」
                        于「内联虑」
                        于((「列」【
                          ((「第N个」授以「表达式」)于「零」于「待匹配」),
                          (「构造抽象」
                            于『爻式』
                            于(会「爻式名」而「式节点」
                              于「爻分支节点」
                              于(「列」【
                                「自由变量」于「爻式名」,
                                「式替换」
                                  于(「自由变量」于「爻式名」)于「阳参」,
                                  「阴结果」
                              】)))
                        】)))
                      或有「其他分支」则(「发生事故」于『默认分支格式不正确』)
                  )
                )
                或有((「列」【
                  (「式节点」
                    于(「常量模式匹配分支」)
                    于((「列」【(「式节点」于(「内建节点」于「内建爻阳」)于「罄」),「阳结果」】)))
                】))
                则(「式节点」
                  于「爻分支节点」
                  于(「列」【(「第N个」授以「表达式」)于「零」于「待匹配」,「阳结果」,「阴结果」】))
                或有「其他」则
                  「发生事故」于『常量匹配分支如果是爻,不应该有超过两个分支』
            )
            或有((「列」【(「式节点」于(「变量模式匹配分支」)于「分支」)】))则(「式节点」
              于「模式匹配」
              于(「缀」于((「第N个」授以「表达式」)于「零」于「待匹配」)于「匹配分支们」))
            或有(「缀」于(「式节点」于(「变量模式匹配分支」)于「分支」)于「其他」)则
              (「发生事故」于『只可以有一个变量模式匹配分支』)
            或有「其他」则(
              鉴「默认分支」而
                有「可无」
                则(
                  虑「报错默认分支」者
                    (「式节点」于(「变量模式匹配分支」)于((「列」【(「进行无名抽象」于「报错式」)】)))
                  而
                  虑「所有分支」者
                    「附加」于「匹配分支们」
                    于((「列」【「报错默认分支」】))
                  而
                  「式节点」
                    于「模式匹配」
                    于(「缀」于((「第N个」授以「表达式」)于「零」于「待匹配」)于「所有分支」)
                )
                或有(「可有」于(「首默认」))
                则(
                  虑「所有分支」者
                    「附加」于「匹配分支们」
                    于((「列」【「首默认」】))
                  而
                  「式节点」
                    于「模式匹配」
                    于(「缀」于((「第N个」授以「表达式」)于「零」于「待匹配」)于「所有分支」)
                )
            )
        )
      )
也。

「:将一个归一过的模式匹配变成决策树(Decision Tree):」
「展开模式匹配内部顶层」乃化「字符串」而化「表达式」而「表达式」也。
「展开模式匹配内部顶层」者会「错误信息」而会「式」而
  鉴「式」而
    有(「式节点」于「模式匹配」于(「缀」于「分析式」于「分支们」))
    则(
      虑「展开后结果」者
        「展开模式匹配」
          于(「式节点」
            于(「顺序执行节点」)
            于(「缀」
              于(「式节点」
                于(「解析后外部调用节点无类型」于『豫言_打印通用值』)
                于((「列」【(「式节点」于(「字符串节点」于『模式匹配失败式』)于「罄」),「分析式」】)))
                于(「缀」
                  于(「添加函数调用参数」
                    于(「式节点」于(「解析后外部调用节点无类型」于『豫言_获取当前异常处理器』)于「罄」)
                    于
                    「显式」
                      于(「式节点」于(「字符串节点」于(『模式匹配错误,缺少分支:』附「错误信息」))于「罄」)) 「:仅取前100字符:」
  于「罄」)))
  于((「列」【「分析式」】))
  于((「态射」)
  于「分支们」
  于(会「分支式」而
  鉴「分支式」而
    有(「式节点」于(「模式匹配分支」)于((「列」【「模式」,「结果」】)))则
      (((「列」于「表达式」)也((「列」【「模式」】))))与「结果」
    或有「其他」则
      「发生事故」于『期待模式匹配分支』
  )
  )而
  虑「无」者
    (「编译调试打印行」
      于
        『pattern_expand』
          于(会「无」而『展开完成,结果:』附(「表达式表示」于「展开后结果」)附『友好表示:「:换行:」』附(「抽象语法友好表示顶层」
            于
              「展开后结果」)))而
              虑「最终结果」者
                (
                  鉴「展开后结果」而
                    有(「式节点」于「模式匹配」于「参」)则
                      (「模式匹配消除」于「展开后结果」)
                    或有「其他」则(「展开后结果」)
                )而
                虑「无」者
                  (「编译调试打印行」
                    于
                    『pattern_expand』
                      于(会「无」而『消除完成,结果:』附(「表达式表示」于「最终结果」)附『友好表示:「:换行:」』附
                        (「抽象语法友好表示顶层」于「最终结果」)))
                而
                「最终结果」
    )
    或有「其他」则
      (「发生事故」于『展开模式匹配期待模式匹配』)
也。

「展开模式匹配顶层」乃化「表达式」而「表达式」也。
「展开模式匹配顶层」者会「式」而
  鉴「式」而
    有(「式节点」于「模式匹配」于(「缀」于「分析式」于「分支们」))
    则(
      虑「分支续延们」者
        「新引用」授以(「列」于(「字符串」合「表达式」))于「罄」而
        虑「后分支式们」者
          (「打表态射」授以「表达式」授以「表达式」)
          于「分支们」
          于(会「分支式」而鉴「分支式」而
            有(「式节点」于(「模式匹配分支」)于((「列」【「模式」,「结果」】)))
            则(
              虑「模式新变量们」者
                (「滤」授以「字符串」)
                于(会「新变量」而「自由变量在式出现」于「新变量」于「结果」)
                于(「读取模式匹配新变量」于「模式」)而
                虑「抽象名」
                者
                  「下个字符序数」于
                  『匹配展开函数』
                而
                虑「无」者
                  (
                    若((「存在吗」授以「字符串」)
                    于(会「变量名」而「串相等」于「抽象名」于「变量名」)
                    于((「附加」授以「字符串」)于「模式新变量们」于(「读取式自由变量」于「结果」)))则
                      「发生事故」
                        于
                        『148重复名:』附「抽象名」附『,』附(「表达式表示」于「式」)
                    否则
                      「元」
                  )
                而
                虑「无」者
                  ((「列引用前衔」授以(「字符串」合「表达式」))
                  于
                    「分支续延们」
                      于(「抽象名」与(
                        虑「分支结果」者
                          「式节点」
                            于(「拉姆达抽象」于「显式」)
                            于( 「:这个地方理应用续延,但因为续延无法直接返回,所以还是用函数:」
                            (((「列」于「表达式」)也((「列」【
                              (「构造抽象」
                                于『所有新变量』
                                于(会「所有新变量」而(「从左折叠带序数」授以「字符串」授以「表达式」)
                                于「零」
                                于(会「序数」而会「新变量名」而会「已有式」而「式节点」
                                  于
                                  「内联虑」
                                    于(((「列」于「表达式」)也((「列」【
                                      (「式节点」
                                        于(「元组解构节点」于「序数」)
                                        于(((「列」于「表达式」)也((「列」【(「自由变量」于「所有新变量」)】))
                                        ))),
                                        (「进行抽象」于「新变量名」于「已有式」)
                                    】)
                                      )
                                    )))于
                                    「结果」于「模式新变量们」))
                            】)
                                )
                              )
                            ))
                        而
                        虑「无」者
                          (「编译调试打印行」
                            于『pattern_expand_branches』
                            于(会「无」而『分支名:』附(「抽象名」)附『分支内容:「:换行:」』附(「抽象语法友好表示顶层」
                              于「分支结果」)))
                        而
                        「分支结果」
                      ))
                  )
                而
                虑「结果」者
                  (「式节点」
                    于(「模式匹配分支」)
                    于(((「列」于「表达式」)也((「列」【
                      「模式」,
                      (「添加函数调用参数」
                        于(「自由变量」于「抽象名」)
                        于「显式」
                        于(「式节点」于「元组构造节点」于((「态射」)于「模式新变量们」于「自由变量」)))
                    】)
                      )
                    )))
                而
                「结果」
            )
            或有「其他」则
              「发生事故」于『期待模式匹配分支』)
        而
        (「从左折叠」授以(「字符串」合「表达式」)授以「表达式」)
        于(会「抽象名及抽象式」而会「已有式」
  而
  虑「抽象名」者「二对子取零」于
        「抽象名及抽象式」
  而
  虑「抽象式」者「二对子取一」于
          「抽象名及抽象式」
  而
  虑「出现次数」者「自由变量在式出现次数」于
          「抽象名」于「已有式」
  而
  (
    若(「等」于「出现次数」于「零」)则
      (「非常粗略调试打印行」
        于(会「无」而『错误警告:未使用的匹配分支式:』附(「表达式表示」于「抽象式」)附
          『,模式匹配:』附(「表达式表示」于「式」));
        「已有式」)
    否则
      (
        若(「等」于「出现次数」于「一」)则
          (「式有名替换」于「抽象式」于「抽象名」于「已有式」)
        否则
          (「式节点」
            于
              「内联虑」
                于(((「列」于「表达式」)也((「列」【「抽象式」,(「进行抽象」于(「抽象名」)于「已有式」)】))
                )))
      )
  ))
  于((「展开模式匹配内部顶层」
    于(「获取子字符串」于「零」于「一零零零」于(「表达式表示」于「式」))
    于(「式节点」于「模式匹配」于(「缀」于「分析式」于「后分支式们」)))
  )
  于(「读引用」于「分支续延们」)
    )
    或有「其他」则
      (「发生事故」于『展开模式匹配期待模式匹配』)
也。