编译步骤/类型检查/类型检查工具。豫
yuyan · 402 行 · 21857 字节 · 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 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402
寻观「标准库」之书。
寻观「编译器核心」之「编译步骤」之「类型检查」之「模式合一」之书。
寻观「编译器核心」之「编译数据」之「抽象绑定树结构」之「抽象语法树」之「总集」之书。
。
寻观「编译器核心」之「编译数据」之「抽象绑定树结构」之「模块操作」之书。
寻观「编译器核心」之「编译步骤」之「总体过程」之「编译文件缓存工具」之书。
寻观「编译器核心」之「编译数据」之「抽象绑定树结构」之「命名环境术」之书。
寻观「编译器核心」之「编译数据」之「语言服务信息」之书。
寻观「编译器核心」之「编译数据」之「编译配置」之「编译期输出」之书。
寻观「编译器核心」之「编译数据」之「操作符」之「操作符数据结构」之书。
寻观「编译器核心」之「编译数据」之「抽象绑定树结构」之「检查后定义处理」之书。
寻观「编译器核心」之「编译步骤」之「类型检查」之「类型检查基础」之书。
寻观「编译器核心」之「编译步骤」之「类型检查」之「函数应用隐式参数合成」之书。
「解开源码绑定范围标注」乃
化「表达式」而
「表达式」合(「或可有」于「源码范围」)
也。
「解开源码绑定范围标注」者会「式」而
鉴「式」而
有(「式节点」于(「源码绑定范围标注节点」于「范围」)于((「列」【「原式」】)))则
「原式」与(「可有」于「范围」)
或有「其他」则「式」与「可无」
也。
「记录源码绑定悬停」乃化(「或可有」于「源码范围」)而化「表达式」而「有」也。
「记录源码绑定悬停」者会「可能范围」而会「绑定类型」而
鉴「可能范围」而
有(「可有」于「范围」)则
「记录悬停文字信息」于「范围」于(「悬停类型文字」于「绑定类型」)
或有「可无」则「元」
也。
「单个抽象参数类型类型检查」乃
化(化「命名环境」而化「表达式」而「表达式」)而
化「命名环境」而
化「表达式」而
化「表达式」而
(「列」于「表达式」)
也。
「单个抽象参数类型类型检查」者会「类型类型检查」而会「境」而会「定义域」而会「值域」而
(
虑「查后定义域」者(「类型类型检查」于「境」于「定义域」)而
虑「新绑定及新环境」者
(「添加声明」于「境」于(「获取可能绑定名」于「值域」)于「查后定义域」)而
虑「新环境」者「新绑定及新环境」中「一」而
虑「新绑定」者「新绑定及新环境」中「零」而
虑「开值域及范围」者
「解开源码绑定范围标注」于(「式替换」于(「自由变量」于「新绑定」)于「值域」)而
虑「无」者
「记录源码绑定悬停」于(「开值域及范围」中「一」)于「查后定义域」而
虑「查后值域」者
(「类型类型检查」于「新环境」于(「开值域及范围」中「零」))
而
(「列」【「查后定义域」,(「进行抽象」于(「新绑定」)于「查后值域」)】)
)
也。
「多个隐式抽象参数类型类型检查」乃
化(化「命名环境」而化「表达式」而「表达式」)而
化「命名环境」而
化「整数」而
化
「表达式」而
「表达式」
也。
「多个隐式抽象参数类型类型检查」者会「类型类型检查」而
会「境」而
会「参数个数」而
会「绑定值域」而
递归虑「检查」其化「命名环境」而化「整数」而化「表达式」而「表达式」者
会「当前境」而会「剩余个数」而会「当前绑定值域」而
若(「等」于「剩余个数」于「零」)
则
「类型类型检查」于「当前境」于「当前绑定值域」
否则
(
虑「新绑定及新环境」者
「添加声明」
于「当前境」
于(「获取可能绑定名」于「当前绑定值域」)于
「内建元类型式」
而
虑「新绑定」者「新绑定及新环境」中「零」
而
虑「开值域及范围」者
「解开源码绑定范围标注」
于(「式替换」于(「自由变量」于「新绑定」)于「当前绑定值域」)
而
虑「无」者
「记录源码绑定悬停」
于(「开值域及范围」中「一」)于「内建元类型式」
而
虑「查后开值域」者
「检查」
于(「新绑定及新环境」中「一」)
于(「减」于「剩余个数」于「一」)
于(「开值域及范围」中「零」)
而
「进行抽象」于「新绑定」于「查后开值域」
)
而
「检查」于「境」于「参数个数」于「绑定值域」
也。
「进行绑定对象类型检查」乃
化「命名环境」而
化「表达式」 「:对象(是一个绑定):」而
化「表达式」 「:对象类型(是一个绑定):」而
化「表达式」 「:绑定类型:」而
「表达式」 「:检查过的对象(是一个绑定):」
也。
「进行绑定对象类型检查」者会「境」而
会「绑定物」而会「绑定物类型」而会「绑定类型」而
(
虑「绑名」者「获取可能绑定名」于「绑定物」而
虑「新绑名及新境」者「添加声明」于「境」于「绑名」于「绑定类型」而
虑「新绑名」者(「新绑名及新境」)中「零」而
虑「绑体及范围」者
「解开源码绑定范围标注」于(「式替换」于(「自由变量」于(「新绑名及新境」)中「零」)于(「绑定物」))
而
虑「无」者
「记录源码绑定悬停」于(「绑体及范围」中「一」)于「绑定类型」而
虑「绑体」者「绑体及范围」中「零」而
虑「绑类体」者
「式替换」于(「自由变量」于(「新绑名及新境」)中「零」)
于(「绑定物类型」)而
虑「后拉体」者
(「读引用」于「进行对象类型检查引用」)
于(「新绑名及新境」中「一」)于「绑体」于「绑类体」
而
「进行抽象」于「新绑名」于「后拉体」
)
也。
「进行绑定对象类型合成」乃
化「命名环境」而
化「表达式」 「:对象(是一个绑定):」而
化「表达式」 「:绑定类型:」而
「表达式」 「:对象类型(是一个绑定):」
合「表达式」 「:检查过的对象(是一个绑定):」
也。
「进行绑定对象类型合成」者会「境」而
会「绑定物」而会「绑定类型」而
(
虑「绑名」者「获取可能绑定名」于「绑定物」而
虑「新绑名及新境」者「添加声明」于「境」于「绑名」于「绑定类型」而
虑「新绑名」者(「新绑名及新境」)中「零」而
虑「绑体及范围」者
「解开源码绑定范围标注」于(「式替换」于(「自由变量」于「新绑名」)于「绑定物」)而
虑「无」者
「记录源码绑定悬停」于(「绑体及范围」中「一」)于「绑定类型」而
虑「绑体」者「绑体及范围」中「零」而
虑「体类及物」者
(「读引用」于「进行对象类型合成引用」)
于(「新绑名及新境」中「一」)于「绑体」
而
(「进行抽象」于「新绑名」于(「体类及物」中「零」))与
(「进行抽象」于「新绑名」于(「体类及物」中「一」))
)
也。
「进行对象类型合成」乃
化「命名环境」而
化「表达式」而
「表达式」 「:类型:」
合「表达式」 「:返回结果:」
也。
「进行对象类型合成」者会「境」而会「物」而
鉴「物」而
有(「式节点」于(「源码范围标注节点」于「范围」)于((「列」【「源码物」】)))
则(
虑「类及物」者
「进行对象类型合成」于
「境」于「源码物」而
虑「无」者
「记录悬停文字信息」
于「范围」
于(「悬停类型文字」于(「类及物」中「零」))
而
「类及物」
)
或有(「式节点」于(「内建节点」于「量」)于「罄」)则
((「内建物类型」于「量」))与「物」
或有(「式节点」于(「整数节点」于「数」)于「罄」)则
(「内建」于「内建类型整数」)与「物」
或有(「式节点」于(「小数节点」于「数」于「整小部」)于「罄」)则
(「内建」于「内建类型小数」)与「物」
或有(「式节点」于(「字符串节点」于「串」)于「罄」)则
(「内建」于「内建类型字符串」)与「物」
或有(「自由变量」于「名」)则(
鉴(「解析单个名称及物」于「境」于「名」)而
有「可无」则(「发生事故」于『变量·』附「名」附『·未找到84,环境:』附(「命名环境表示」于「境」))
或有(「可有」于(「未归一名类」与「名物」))则( 「:TODO真的未归一吗?:」
(「未归一名类」)与「名物」
)
)
或有(「式节点」于(「文件定义引用节点」于「文件名」于「投影名」于「原先序数」)于「罄」)则
(鉴(「文件定义引用类及物」于「境」于「文件名」于「投影名」)而
有(「后类」与「后物」)则(「后类」)与「后物」)
或有(「式节点」于(「拉姆达抽象带类型」于「拉形」)于((「列」【「原抽象类型」,「拉参」】)))
则(
虑「抽象类型」者
(「读引用」于「进行类型类型检查引用」)于「境」于「原抽象类型」而
虑「绑名」者「获取可能绑定名」于「拉参」而
虑「新绑名及新境」者「添加声明」于「境」于「绑名」于「抽象类型」而
虑「新绑名」者(「新绑名及新境」)中「零」而
虑「绑体及范围」者
「解开源码绑定范围标注」于(「式替换」于(「自由变量」于「新绑名」)于「拉参」)而
虑「无」者
「记录源码绑定悬停」于(「绑体及范围」中「一」)于「抽象类型」而
虑「绑体」者「绑体及范围」中「零」而
虑「体类及物」者
(「读引用」于「进行对象类型合成引用」)
于(「新绑名及新境」中「一」)于「绑体」而
鉴「拉形」而
有「显式」则
(「函数类型」于「抽象类型」于(「体类及物」中「零」))
与
(「式节点」
于(「拉姆达抽象带类型」于「显式」)
于((「列」【「抽象类型」,(「进行抽象」于「新绑名」于(「体类及物」中「一」))】)))
或有「隐式」则(
虑「无」者
「断言类型相等」于「抽象类型」于「内建元类型式」
而
(「隐式类型函数类型」于「新绑名」于(「体类及物」中「零」))
与
(「式节点」
于(「拉姆达抽象带类型」于「隐式」)
于((「列」【「内建元类型式」,(「进行抽象」于「新绑名」于(「体类及物」中「一」))】)))
)
或有「其他」则
「发生事故」于『拉姆达参数形式不匹配』
)
或有(「式节点」于(「唯一构造器节点」于「序数」于「文件路径」于「构造器名」)于((「列」【「构造器类」】)))
则
(「构造器类」)与「物」
或有(「式节点」于(「元组构造节点」)于「元素们」)
则(
虑「结果」者
(「从左折叠」授以「表达式」授以((「列」于「表达式」)合(「列」于「表达式」)))
于(会
「元素」而会「已有」而
虑「类物」者「进行对象类型合成」于「境」于「元素」而
(「缀」于(「类物」中「零」)于(「已有」中「零」))与
(「缀」于(「类物」中「一」)于(「已有」中「一」)))
于(「罄」与「罄」)于「元素们」
而
(「式节点」于(「元组类型节点」)于(「反转」于(「结果」中「零」)))
与(「式节点」于(「元组构造节点」)于(「反转」于(「结果」中「一」)))
)
或有(「式节点」于「类型判断节点」于((「列」【「判断类」,「判断式」】)))
则(
虑「后判断类」者
(「读引用」于「进行类型类型检查引用」)于「境」于「判断类」而
虑「后判断式」者
(「读引用」于「进行对象类型检查引用」)
于
「境」于「判断式」于「后判断类」
而
「后判断类」与
「后判断式」
)
或有(「式节点」于「内联虑」于((「列」【「定义式」,「尾式」】)))
则(
虑「后定义式类及物」者
(
鉴
「定义式」而
有(「式节点」于「函数调用」于「忽略项们」)则
「进行函数应用头脊类型合成」
于「境」
于「定义式」
或有(「式节点」于(「递归节点」)于((「列」【「递归定义域」,「递归值域」】)))
则(
虑「后递归定义域」者
(「读引用」于「进行类型类型检查引用」)于「境」于「递归定义域」
而
「后递归定义域」与((「读引用」于「进行对象类型检查引用」)于「境」于「定义式」于「后递归定义域」)
)
或有「其他定义式」则
「进行对象类型合成」于「境」于「定义式」
)而
虑「尾类及物」者
「进行绑定对象类型合成」
于「境」于「尾式」
于(「后定义式类及物」中「零」)而
虑「结果类」者
「式替换」
于(「后定义式类及物」中「一」)
于(「尾类及物」中「零」)
而
「结果类」
与(「式节点」
于
「内联虑带类型」
于(「列」【「后定义式类及物」中「零」,「后定义式类及物」中「一」,「尾类及物」中「一」】))
)
或有(「式节点」于(「元组解构节点」于「序数」)于((「列」【「元组」】)))
则(
虑「元组类及物」者
「进行对象类型合成」于「境」于
「元组」而
鉴((「元组类及物」中「零」))
而
有(「式节点」于(「元组类型节点」)于「类型们」)则
(「第N个」于「序数」于「类型们」)
与(「式节点」于(「元组解构节点」于「序数」)于((「列」【(「元组类及物」中「一」)】)))
或有「其他类型」则
「发生事故」
于
『元组解构只能从明确元组类型合成,得到:』附(「表达式表示」于「其他类型」)
)
或有(「式节点」于(「爻分支节点」)于(「列」【「爻式」,「阳式」,「阴式」】))
则(
虑「后爻式」者
(「读引用」于「进行对象类型检查引用」)于「境」于「爻式」
于(「内建」于「内建类型爻」)
而
「尝试运行」
于(会「无」而
虑「阳类及物」者「进行对象类型合成」于「境」于「阳式」而
虑「后阴式」者
(「读引用」于「进行对象类型检查引用」)
于「境」于「阴式」
于(「阳类及物」中「零」)
而
(「阳类及物」中「零」)
与(「式节点」于(「爻分支节点」)于(「列」【「后爻式」,「阳类及物」中「一」,「后阴式」】)))
于(会「阳支异常」而
虑「阴类及物」者「进行对象类型合成」于「境」于「阴式」而
虑「后阳式」者
(「读引用」于「进行对象类型检查引用」)
于「境」于「阳式」
于(「阴类及物」中「零」)
而
(「阴类及物」中「零」)
与(「式节点」于(「爻分支节点」)于(「列」【「后爻式」,「后阳式」,「阴类及物」中「一」】)))
)
或有(「式节点」于(「模式匹配」)于(「缀」于「分析式」于「分支们」))则(
鉴(「进行对象类型合成」于「境」于「分析式」)而
有(「分析类」与「分析后式」)则(
鉴「分支们」而
有「罄」则「发生事故」
于『模式匹配没有分支,无法合成返回类型』
或有(「缀」于「首分支」于「后分支们」)则(
鉴((「读引用」于「模式匹配分支类型合成引用」)于「境」于「首分支」于「分析类」)
而
有(「返回类」与「后首分支」)
则(
虑「后后分支们」者
(「态射」授以「表达式」授以「表达式」)
于「后分支们」
于(会「支」而(「读引用」于「检查模式匹配分支引用」)于「境」于「支」于「返回类」于「分析类」)
而
「返回类」
与(「式节点」
于(「模式匹配」)
于((「缀」授以「表达式」)于「分析后式」于((「缀」授以「表达式」)于「后首分支」于「后后分支们」)))
)
)
)
)
或有(「式节点」于「顺序执行节点」于((「列」【「式甲」,「式乙」】)))
则(
虑「后式甲类及式」者
「进行对象类型合成」于
「境」于「式甲」而
虑「后式乙类及式」者「进行对象类型合成」于「境」于「式乙」而
(「后式乙类及式」中「零」)
与(「式节点」
于
「顺序执行节点」
于((「列」【(「后式甲类及式」中「一」),(「后式乙类及式」中「一」)】)))
)
或有(「式节点」于「函数调用」于「忽略项们」)则
(「进行函数应用头脊类型合成」于「境」于「物」)
或有「其他」则
「发生事故」于『无法合成对象类型,请添加类型标注或改走检查模式:』附(「表达式表示」于「物」)
也。
「写引用」于「进行对象类型合成引用」于「进行对象类型合成」。
「对象子类型检查」乃
化「命名环境」而
化「表达式」 「:对象:」而
化「表达式」 「:对象的合成类型:」而
化「表达式」 「:对象的检查类型:」而
「表达式」 「:检查过的对象:」
也。
「对象子类型检查」者会「境」而会「原物」而会「子类」而会「父类」而
虑「无」者
(「详细调试打印行」于(会「无」而『[D]正在进行对象子类型检查,对象:』附(「表达式表示」于「原物」)附
『,合成类型:』附(「表达式表示」于「子类」)附『,检查类型:』附(「表达式表示」于「父类」)))而
虑「无」者「断言类型相等」于「子类」于「父类」而
「原物」
也。