编译步骤/闭包转换/正则前闭包转换。豫
yuyan · 168 行 · 9374 字节 · UTF-8
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168
「:This is untyped closure conversion.
I have prepared groundwork for typed closure conversion, but I
have not yet studied it.
Part of the reason is that type annotation and typed ANF conversion take
too long to execute.
:」
寻观「标准库」之书。
寻观「编译器核心」之「编译数据」之「抽象绑定树结构」之「抽象语法树」之「总集」之书。
。
寻观「编译器核心」之「编译数据」之「编译配置」之「编译期输出」之书。
寻观「编译器核心」之「编译数据」之「编译配置」之「全局配置」之书。
寻观「编译器核心」之「编译步骤」之「闭包转换」之「函数提升」之书。
寻观「编译器核心」之「编译步骤」之「总体过程」之「编译过程工具」之书。
寻观「编译器核心」之「顺序标识符」之「顺序标识符」之书。
寻观「编译器核心」之「编译步骤」之「闭包转换」之「全局结构变量储存变换」之书。
寻观「编译器核心」之「编译步骤」之「优化」之「基础工具」之「表达式带定义操作」之书。
「前闭包转换」乃化「表达式」而「表达式」也。
「前闭包转换」者会「式」而
虑「递归」者「前闭包转换」而
虑「无」者
「编译调试打印行」于『clo_conv』于(会「无」而『正在编译:』附(「表达式表示」于「式」))而
鉴「式」而
有(「式节点」
于「函数调用」
于(「缀」
于(「式节点」于(「函数引用节点」于「函数名」)于「罄」) 「:函数引用式节点发生在闭包转换及提升前,判定不需要闭包:」
于((「列」【(「式节点」于(「参数节点」于(「多参数形」于「个数」))于「参数」)】))))
则(
虑「无」者
「编译调试打印行」于
『clo_conv』
于(会「无」而『选择分支1』)
而
「分组函数调用式」
于(「多参数形」于「个数」)
于(「式节点」于(「函数引用节点」于「函数名」)于「罄」)
于((「态射」)于「参数」于「递归」)
)
或有(「式节点」
于「函数调用」
于(「缀」
于(「式节点」于(「函数引用节点」于「函数名」)于「罄」) 「:函数引用式节点发生在闭包转换及提升前,判定不需要闭包:」
于((「列」【(「式节点」于(「参数节点」于(「尾多参数形」于「个数」))于「参数」)】))))
则(
虑「无」者
「编译调试打印行」于
『clo_conv』
于(会「无」而『选择分支1.2』)
而
「分组函数调用式」
于(「尾多参数形」于「个数」)
于(「式节点」于(「函数引用节点」于「函数名」)于「罄」)
于((「态射」)于「参数」于「递归」)
)
或有(「式节点」
于「函数调用」
于((「列」【「函数」,(「式节点」于(「参数节点」于(「多参数形」于「个数」))于「参数」)】)))
则(
虑「无」者
「编译调试打印行」于『clo_conv』于(会「无」而『选择分支2』)
而
「式节点」
于「内联虑」
于((「列」【
(「递归」于「函数」),
(「构造抽象」
于『闭包函数』
于(会
「闭包函数名」而
「分组函数调用式」
于(「多参数形」于(「加」于「个数」于「一」))
于(「式节点」于(「元组解构节点」于「零」)于((「列」【(「自由变量」于「闭包函数名」)】)))
于(「缀」于(「自由变量」于「闭包函数名」)于((「态射」)于「参数」于「递归」))))
】))
)
或有(「式节点」
于「函数调用」
于((「列」【「函数」,(「式节点」于(「参数节点」于(「尾多参数形」于「个数」))于「参数」)】)))
则(
虑「无」者
「编译调试打印行」于『clo_conv』于(会「无」而『选择分支3』)
而
「式节点」
于「内联虑」
于((「列」【
(「递归」于「函数」),
(「构造抽象」
于『闭包函数』
于(会
「闭包函数名」而
「分组函数调用式」
于(「尾多参数形」于(「加」于「个数」于「一」))
于(「式节点」于(「元组解构节点」于「零」)于((「列」【(「自由变量」于「闭包函数名」)】)))
于(「缀」于(「自由变量」于「闭包函数名」)于((「态射」)于「参数」于「递归」))))
】))
)
或有(「式节点」
于(「函数全局声明节点」于「函数名」)
于((「列」【(「式节点」于(「拉姆达抽象」于(「多参数形」于「个数」))于((「列」【「绑定拉体」】)))】)))
则( 「:全局声明节点同样不需要闭包转换:」
虑「无」者
「编译调试打印行」于『clo_conv』于(会「无」而『选择分支4』)
而
(「式节点」
于(「函数全局声明节点」于「函数名」)
于((「列」【
(「式节点」于(「拉姆达抽象」于(「多参数形」于「个数」))于((「列」【(「递归」于「绑定拉体」)】)))
】)))
)
或有(「式节点」于(「拉姆达抽象」于(「多参数形」于「个数」))于((「列」【「绑定拉体」】)))
则(
虑「无」者
「编译调试打印行」于
『clo_conv』
于(会「无」而『选择分支5』)而
虑「所有自由变量」者
((「移除重复」授以「字符串」)于「串相等」于(「读取式自由变量」于「绑定拉体」))
而
虑「闭包名」者「下个字符序数」于『函数闭包』而
虑「新式」者
(「式节点」
于(「元组构造节点」)
于(「缀」
于(「式节点」
于(「拉姆达抽象」于(「多参数形」于(「加」于「个数」于「一」)))
于((「列」【
(「进行抽象」
于「闭包名」
于(「多绑定递归」
于「个数」
于「绑定拉体」
于(会「拉体」而
虑「引用式」者
(「新引用」授以「表达式」)
于(「递归」于「拉体」)而
虑「无」者
(「打表」授以「有」)
于(「长度」于「所有自由变量」)
于(会「序数」而「写引用」
于「引用式」
于(「式有名替换」
于(「式节点」
于(「元组解构节点」于(「加」于「序数」于「一」))
于((「列」【
(「式节点」
于(「自由变量标注节点」于(「第N个」于「序数」于「所有自由变量」))
于((「列」【(「自由变量」于「闭包名」)】)))
】)))
于(「第N个」于「序数」于「所有自由变量」)
于(「读引用」于「引用式」)))
而
((「读引用」于「引用式」)))))
】)))
于((「态射」)于「所有自由变量」于「自由变量」)))
而
「新式」
)
或有((「式节点」于(「函数引用节点」于「函数名」)于「罄」))则
(「发生事故」于『函数引用节点不可以单独出现,必须出现在函数引用的函数位置:』附(「表达式表示」于「式」))
或有「其他」则(「表达式统一操作」于「递归」于「式」)
也。