编译步骤/类型检查/模式匹配类型检查。豫
yuyan · 422 行 · 24910 字节 · 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 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422
寻观「标准库」之书。
寻观「编译器核心」之「编译步骤」之「类型检查」之「模式合一」之书。
寻观「编译器核心」之「编译数据」之「抽象绑定树结构」之「抽象语法树」之「总集」之书。
。
寻观「编译器核心」之「编译数据」之「抽象绑定树结构」之「命名环境术」之书。
寻观「编译器核心」之「编译数据」之「语言服务信息」之书。
寻观「编译器核心」之「编译数据」之「操作符」之「操作符数据结构」之书。
寻观「编译器核心」之「顺序标识符」之「顺序标识符」之书。
寻观「编译器核心」之「编译数据」之「编译配置」之「编译期输出」之书。
寻观「编译器核心」之「编译步骤」之「类型检查」之「类型检查工具」之书。
寻观「编译器核心」之「编译步骤」之「类型检查」之「类型检查基础」之书。
寻观「编译器核心」之「编译步骤」之「类型检查」之「函数应用隐式参数合成」之书。
「检查模式类型并更新环境」乃
化「命名环境」而
化「表达式」 「:对象:」而
化「表达式」 「:模式的类型:」而
「表达式」合
「命名环境」 「:检查后的环境及类型:」
也。
「检查模式类型并更新环境」者会「境」而会「物」而会「类」而
虑「结果」者
(化「命名环境」而化「表达式」而化「表达式」而「表达式」合「命名环境」也会「境」而会「物」而会「类」而
虑「无」者
「详细调试打印行」于(会「无」而『[D]正在检查模式类型,模式:』附(「表达式表示」于「物」)附
『,类型:』附(「表达式表示」于「类」))
而
虑「检查模式函数应用」者
(化「命名环境」而化「表达式」而化「表达式」而「表达式」合「命名环境」也
会「初境」而会「应用物」而会「期望类」而
虑「头及脊」者「收集函数调用头脊」于「应用物」而
虑「头类及物」者
(「读引用」于「进行对象类型合成引用」)于「初境」
于(「头及脊」中「零」)而
递归虑「处理参数组」其
化「表达式」而化「表达式」而化「命名环境」而化(「列」于(「参数形式」合「表达式」))而
「表达式」合「表达式」合「命名环境」者
会「当前类」而会「当前物」而会「当前境」而会「剩余脊」而
虑「初已用名」者
(「附加」授以「字符串」)
于(「读取式自由变量」于「当前物」)
于((「附加」授以「字符串」)
于(「读取式自由变量」于「期望类」)
于(「命名环境获取所有名称」于「当前境」))
而
鉴(「读取函数应用类型骨架」于「初已用名」于「当前类」)而
有(「上下文」与「隐式名们」与「参数类型们」与「返回类型」)则
若(「且」
于(「等」于(「长度」于「隐式名们」)于「零」)
于(「等」于(「长度」于「参数类型们」)于「零」))
则
「发生事故」
于『模式函数调用的当前结果不是函数:』附(「表达式表示」于「当前类」)
否则
(
鉴(「拆分函数应用参数组」
于(「长度」于「隐式名们」)
于(「长度」于「参数类型们」)于
「阳」于「剩余脊」)而
有(「已给隐式参数们」与「显式参数们」与「后脊」)
则(
虑「当前可能期望类」者
(
鉴「后脊」而
有「罄」则(「可有」授以「表达式」)
于「期望类」
或有「非空后脊」则
「可无」授以「表达式」
)
而
虑「接地骨架」者「上下文」与「隐式名们」与「参数类型们」与
「返回类型」
而
虑「缺省隐式参数们」者
「求解函数应用隐式参数」
于「当前境」
于
「接地骨架」
于「已给隐式参数们」
于「显式参数们」于
「当前可能期望类」
而
虑「全部隐式参数们」者
(「附加」授以「表达式」)
于
「已给隐式参数们」于「缺省隐式参数们」而
递归虑「检查隐式参数们」其化「表达式」而化「表达式」而化「爻」而化(「列」于「表达式」)而
「表达式」合「表达式」合
「爻」者会「隐式当前类」而会「隐式当前物」而会「已经开始」
而
会「待查隐式参数们」而
鉴「待查隐式参数们」而
有「罄」则「隐式当前类」与「隐式当前物」与「已经开始」
或有(「缀」于「参数」于「后参数们」)
则(
虑「后参数」者
(「读引用」于「进行类型类型检查引用」)于「当前境」于「参数」
而
虑「后类」者
「应用首隐式类型参数」于
「隐式当前类」于
「后参数」
而
虑「后物」者
「添加当前函数应用组参数」于
「已经开始」于
「隐式当前物」于
「隐式」于
「后参数」
而
「检查隐式参数们」于
「后类」于
「后物」于「阳」于
「后参数们」
)
而
鉴(「检查隐式参数们」于「当前类」于「当前物」于「阴」于「全部隐式参数们」)而
有(「显式函数类」与「隐式后物」与「已经开始」)则(
鉴
「显式参数们」而
有「罄」则(
鉴「后脊」而
有「罄」则「显式函数类」与「隐式后物」与「当前境」
或有「非空后脊」则
「处理参数组」
于「显式函数类」
于
「隐式后物」于「当前境」于「后脊」
)
或有「非空显式参数们」则(
鉴(「拆分多参数函数类型」于「显式函数类」)而
有(「可有」于(「实际参数类型们」与「实际返回类型」))
则(
虑「无」者
若(「等」于(「长度」于「实际参数类型们」)于(「长度」于「显式参数们」))则
「元」
否则
「发生事故」
于
『模式函数应用显式参数数量与函数类型不一致』而
递归虑
「检查显式参数们」其化「表达式」而化「命名环境」而化「爻」而化(「列」于「表达式」)而
化(「列」于「表达式」)而「表达式」合「命名环境」者会「显式当前物」而会
「显式当前境」而会「已有参数」而会「待查参数们」而会「待查类型们」而鉴
「待查参数们」与「待查类型们」而
有「罄」与「罄」则「显式当前物」
与「显式当前境」
或有(「缀」于「参数」于「后参数们」)与(「缀」于「定义域」于「后类型们」)
则(
鉴(「检查模式类型并更新环境」于「显式当前境」于「参数」于「定义域」)而
有(「后参数」与「后境」)则(
虑「后物」者
「添加当前函数应用组参数」
于「已有参数」
于「显式当前物」
于「显式」于「后参数」
而
「检查显式参数们」
于「后物」
于「后境」
于「阳」
于「后参数们」于「后类型们」
)
)
或有「其他」则
「发生事故」
于『模式函数应用参数与参数类型没有一一对应』而鉴(「检查显式参数们」
于「隐式后物」
于「当前境」
于「已经开始」
于「显式参数们」于「实际参数类型们」)而
有(「显式后物」与「显式后境」)则(
鉴「后脊」而
有「罄」则「实际返回类型」与「显式后物」与「显式后境」
或有「非空后脊」则
「处理参数组」
于「实际返回类型」
于「显式后物」
于「显式后境」于「后脊」
)
)
或有「可无」则
「发生事故」
于
『模式函数调用的当前类型不是显式函数类型』
)
)
)
)
而
鉴(「处理参数组」于(「头类及物」中「零」)于(「头类及物」中「一」)于「初境」于(「头及脊」中「一」))
而
有(「结果类」与「结果物」与「结果境」)
则(虑「无」者「断言类型相等」于「结果类」于「期望类」而「结果物」与「结果境」)
)
而
「尝试运行」
于(会「无」而
鉴「类」而
「:TODO 检查对象节点的匹配:」
有「其他类」则(
鉴「物」而
有(「式节点」于(「源码范围标注节点」于「范围」)于((「列」【「源码物」】)))
则(
虑「后物及境」者
「检查模式类型并更新环境」于
「境」于
「源码物」于
「类」
而
虑「无」者
「记录悬停文字信息」于「范围」
于(「悬停类型文字」于「类」)
而
「后物及境」
)
或有「自由变量」于「名」则(
鉴(「解析单个名称及物」于「境」于「名」)而
有(「可有」于(「名类」与「名物」))则(
鉴「名类」而
有「构造器类」则(
鉴「构造器类」而
「:TODO 为何要加隐式参数?:」
有(「式节点」于(「隐式派类型节点」于「忽略参数个数」)于((「列」【「值域」】)))
则
(「检查模式函数应用」于「境」于「名物」于「类」)
或有「其他构造器类」
则(虑「无」者「断言类型相等」于「构造器类」于「类」而「名物」与「境」)
)
)
或有「可无」则( 「:新绑定:」
鉴「类」而
有「其他」则(
虑「后境」者
「添加声明不改变名」于『129』于「境」于「名」于「类」而
「:TODO:被绑定的变量仍以自由变量形式存在:」
(「式节点」于(「模式匹配新变量」于「名」)于((「列」【「类」】)))与
「后境」
)
)
)
或有「式节点」
于(「模式匹配新变量」于「名」)
于((「列」【「模式名类」】))则(
鉴(「解析单个名称及物」于「境」于「名」)而
有(「可有」于(「名类」与「名物」))则(「发生事故」于『模式匹配不应当存在』)
或有「可无」则(
虑「无」者「断言类型相等」于「类」于「模式名类」
而
虑「后境」者
「添加声明不改变名」于『144』于「境」于「名」于「类」
而
(「式节点」于(「模式匹配新变量」于「名」)于((「列」【「模式名类」】)))与
「后境」
)
)
或有(「式节点」于「空缺」于「罄」)
则(
虑「新名」者「下个字符序数」于『匿名模式』
而
虑「后境」者
「添加声明不改变名」于『模式空缺』于「境」于「新名」于
「类」
而
(「式节点」于(「模式匹配新变量」于「新名」)于((「列」【「类」】)))与「后境」
)
或有(「式节点」于「函数调用」于「忽略项们」)则
(「检查模式函数应用」于「境」于「物」于「类」)
或有(「式节点」于(「元组构造节点」)于「元素们」)则(
鉴「类」而
有
(「式节点」于(「元组类型节点」)于「类型们」)则(
若(「不等于」于(「长度」于「元素们」)于(「长度」于「类型们」))
则
(「发生事故」于『元组模式元素个数和元组类型个数不匹配』)
否则
(
虑「结果」者
(「从左折叠」授以(「表达式」合「表达式」)授以((「列」于「表达式」)合「命名环境」))
于(遇
「表达式」合「表达式」者「元素及类型」而会「已有」
而
虑「后元素及境」者
「检查模式类型并更新环境」
于(「已有」中「一」)
于(「元素及类型」中「零」)
于(「元素及类型」中「一」)
而
((「缀」授以「表达式」)于(「后元素及境」中「零」)于(「已有」中「零」))与(「后元素及境」中「一」))
于((「罄」授以「表达式」)与「境」)
于((「拉链合并」授以「表达式」授以「表达式」)于「元素们」于「类型们」)而
(「式节点」于(「元组构造节点」)于(「反转」于(「结果」中「零」)))与(「结果」中「一」)
)
)
或有「其他」则
「发生事故」
于『元组模式需要明确的元组类型:』附(「表达式表示」于「类」)
)
或有(「式节点」于(「内建节点」于「内建爻阳」)于「罄」)
则(
虑「无」者
「断言类型相等」
于(「式节点」于(「内建节点」于「内建类型爻」)于「罄」)
于「类」
而
「物」与「境」
)
或有(「式节点」于(「内建节点」于「内建爻阴」)于「罄」)
则(
虑「无」者
「断言类型相等」
于(「式节点」于(「内建节点」于「内建类型爻」)于「罄」)
于「类」
而
「物」与「境」
)
或有(「式节点」于(「整数节点」于「数」)于「罄」)
则(
虑「无」者
「断言类型相等」
于(「式节点」于(「内建节点」于「内建类型整数」)于「罄」)
于「类」
而
「物」与「境」
)
或有(「式节点」于(「字符串节点」于「串」)于「罄」)
则(
虑「无」者
「断言类型相等」
于(「式节点」于(「内建节点」于「内建类型字符串」)于「罄」)
于「类」
而
「物」与「境」
)
「:其他表达式假设是直接值,不含变量,直接检查类型:」
或有(「式节点」于(「结构投影」于「投影名」)于「参」)则
(虑「后物」者(「读引用」于「进行对象类型检查引用」)于「境」于「物」于「类」而「后物」与「境」)
或有(「式节点」于(「结构投影带序数」于「投影名」于「序数」)于「参」)则
(虑「后物」者(「读引用」于「进行对象类型检查引用」)于「境」于「物」于「类」而「后物」与「境」)
或有(「式节点」于(「文件定义引用节点」于「文件名」于「定义名」于「序数」)于「参」)则
(虑「后物」者(「读引用」于「进行对象类型检查引用」)于「境」于「物」于「类」而「后物」与「境」)
或有(「式节点」
于(「唯一构造器节点」于「序数」于「文件路径」于「构造器名」)
于((「列」【「构造器类」】)))
则
(虑「无」者「断言类型相等」于「构造器类」于「类」而「物」与「境」)
或有「其他」则
「发生事故」
于『不是支持的模式匹配项:』附(「表达式表示」于「物」)
))
于(会「异常」而
「发生事故」于(「异常」附『「:换行:」=======》》》》 在检查模式|』附(「表达式表示」于「物」)
附『|「:换行:」 拥有类型|』附(「表达式表示」于「类」)
附『|「:换行:」 即:|』附(「表达式表示」于(「类」))附『|时』
附『|「:换行:」 环境::|』附(「间合」于『,』于(「命名环境获取所有名称」于「境」))附
『|时』))
)而
「结果」于「境」于「物」于「类」
也。
「检查模式匹配分支」乃
化「命名环境」而
化「表达式」 「:分支:」而
化「表达式」 「:返回的类型:」而
化「表达式」 「:被匹配的类型:」而
「表达式」 「:检查后的分支:」
也。
「检查模式匹配分支」者会「境」而会「分支」而会「返回类」而会「原匹配类」而
鉴「分支」而
有(「式节点」于(「模式匹配分支」)于((「列」【「模式」,「尾式」】)))
则(
虑「后模式及后境」者
「检查模式类型并更新环境」于
「境」于「模式」于
「原匹配类」而
虑「后模式」者「后模式及后境」中「零」而
虑「后境」者「后模式及后境」中「一」而
虑「后尾式」者
(「读引用」于「进行对象类型检查引用」)
于
「后境」于「尾式」于「返回类」
而
(「式节点」于(「模式匹配分支」)于((「列」【「后模式」,「后尾式」】)))
)
或有「其他」则
「发生事故」于『不是模式匹配分支』
也。
「模式匹配分支类型合成」乃
化「命名环境」而
化「表达式」 「:分支:」而
化「表达式」 「:被匹配的类型:」而
「表达式」合
「表达式」 「:检查后的分支类及物:」
也。
「模式匹配分支类型合成」者会「境」而会「分支」而会「原匹配类」而
鉴「分支」而
有(「式节点」于(「模式匹配分支」)于((「列」【「模式」,「尾式」】)))
则(
虑「后模式及后境」者
「检查模式类型并更新环境」于
「境」于「模式」于
「原匹配类」而
虑「后模式」者「后模式及后境」中「零」而
虑「后境」者「后模式及后境」中「一」而
虑「尾类及物」者
(「读引用」于「进行对象类型合成引用」)于
「后境」于「尾式」
而
(「尾类及物」中「零」)
与(「式节点」于(「模式匹配分支」)于((「列」【「后模式」,(「尾类及物」中「一」)】)))
)
或有「其他」则
「发生事故」于『不是模式匹配分支』
也。
「写引用」于「检查模式匹配分支引用」于「检查模式匹配分支」。
「写引用」于「模式匹配分支类型合成引用」于「模式匹配分支类型合成」。