From 9445a6aa6387b20f67812aca163f3acfbd36b152 Mon Sep 17 00:00:00 2001 From: Jack Works Date: Wed, 6 Sep 2023 20:47:58 +0800 Subject: [PATCH 01/71] Normative: New pattern matching design --- index.html | 507 ++++++++++++++++++++++++++++------------------------- spec.emu | 172 +++++++++--------- 2 files changed, 351 insertions(+), 328 deletions(-) diff --git a/index.html b/index.html index e8f7dd3..428a075 100644 --- a/index.html +++ b/index.html @@ -1422,8 +1422,8 @@ }); }); -let sdoMap = JSON.parse(`{"prod-NtCnMbkE":{"MatchClausesEvaluation":{"clause":"13.5.4","ids":["prod-Xwb0apYm"]}},"prod-hpGY7qqi":{"MatchClausesEvaluation":{"clause":"13.5.4","ids":["prod-q06SCYJ_"]}},"prod-QL92K4xk":{"MatchClauseEvaluation":{"clause":"13.5.5","ids":["prod-13W_xPag"]}},"prod-2EY42XQ4":{"MatchClauseEvaluation":{"clause":"13.5.5","ids":["prod-oq8b6umT"]}},"prod-NTBaKJzT":{"MatchClauseEvaluation":{"clause":"13.5.5","ids":["prod-9inxrCDR"]}},"prod-EOsV1MJJ":{"MatchClauseEvaluation":{"clause":"13.5.5","ids":["prod-jN0a5aCs"]}},"prod-LAj8DpMp":{"MatchPatternMatches":{"clause":"13.5.6","ids":["prod-EquXXU0V"]}},"prod-1RFmL8Qt":{"MatchPatternMatches":{"clause":"13.5.6","ids":["prod-liq0D1Xk"]}},"prod-PbjcjCab":{"MatchPatternMatches":{"clause":"13.5.6","ids":["prod-zQ-YBKpf"]}},"prod-cFd-DHvq":{"MatchPatternMatches":{"clause":"13.5.6","ids":["prod-8jR82WrM"]}},"prod-k3YtxQvb":{"MatchPatternMatches":{"clause":"13.5.6","ids":["prod-cOkAJWE1"]}},"prod-fExjcDDE":{"MatchPatternMatches":{"clause":"13.5.6","ids":["prod-fqe2KfNk"]}},"prod-KUcUUgsn":{"MatchPatternMatches":{"clause":"13.5.6","ids":["prod-U80C8biY"]}},"prod-BMX8uZDG":{"CombinedMatchPatternMatches":{"clause":"13.5.7","ids":["prod-hYdo8hkU"]}},"prod-a_2cW9fV":{"CombinedMatchPatternMatches":{"clause":"13.5.7","ids":["prod-TGrK8XcZ"]}},"prod-nifi7mAV":{"InterpolationPatternMatches":{"clause":"13.5.8","ids":["prod-7sPnWYxk"]}},"prod-1IyOY8Lj":{"InterpolationPatternMatches":{"clause":"13.5.8","ids":["prod-3rvUQvrP"]}},"prod-qpIlZNwe":{"NearLiteralMatchPatternMatches":{"clause":"13.5.9","ids":["prod-8zqNnsKM"]}},"prod-YKKHeFvr":{"NearLiteralMatchPatternMatches":{"clause":"13.5.9","ids":["prod-7rBxP_c3"]}},"prod-X9fZpBq-":{"NearLiteralMatchPatternMatches":{"clause":"13.5.9","ids":["prod-7_4ORieJ"]}},"prod-V3KpiHah":{"NearLiteralMatchPatternMatches":{"clause":"13.5.9","ids":["prod-nFT2R-a-"]}},"prod-O-bqVGtn":{"NearLiteralMatchPatternMatches":{"clause":"13.5.9","ids":["prod-CpNm3utq"]}},"prod-J-2C3CeI":{"NearLiteralMatchPatternMatches":{"clause":"13.5.9","ids":["prod-r1eQGmrs"]}},"prod-9MjM10Vp":{"NearLiteralMatchPatternMatches":{"clause":"13.5.9","ids":["prod-uiyyW_3g"]}},"prod-RBPOoq5M":{"NearLiteralMatchPatternMatches":{"clause":"13.5.9","ids":["prod-wGAFufTu"]}},"prod-Ya_CFKf9":{"NearLiteralMatchPatternMatches":{"clause":"13.5.9","ids":["prod-vQdlOG2y"]}},"prod-T58skk9n":{"NearLiteralMatchPatternMatches":{"clause":"13.5.9","ids":["prod-FRFrVYuM"]}},"prod-4SlT9cEm":{"NearLiteralMatchPatternMatches":{"clause":"13.5.9","ids":["prod-isdYFa8G"]}},"prod-XRM2b6i2":{"NearLiteralMatchPatternMatches":{"clause":"13.5.9","ids":["prod-siRqJo6M"]}},"prod-qhN0aaqQ":{"NearLiteralMatchPatternMatches":{"clause":"13.5.9","ids":["prod-jl24oH4F"]}},"prod-unmh-9e8":{"DestructuringMatchPatternMatches":{"clause":"13.5.10","ids":["prod-rB2BCLrd"]}},"prod-d3l2MJR8":{"DestructuringMatchPatternMatches":{"clause":"13.5.10","ids":["prod-BoVijmHY"]}},"prod-ET9gkIxZ":{"DestructuringMatchPatternMatches":{"clause":"13.5.10","ids":["prod-d-8AfJQi"]}},"prod-oVyP9tOR":{"DestructuringMatchPatternMatches":{"clause":"13.5.10","ids":["prod-qOh4-CSh"]}},"prod-xAnKRO00":{"DestructuringMatchPatternMatches":{"clause":"13.5.10","ids":["prod-UiZ1CKq4"]}},"prod-0L-SNO44":{"DestructuringMatchPatternMatches":{"clause":"13.5.10","ids":["prod-tgC_dqGi"]}},"prod-_CB2K_5H":{"DestructuringMatchPatternMatches":{"clause":"13.5.10","ids":["prod-GMVs0DgI"]}},"prod-kRoJE3bP":{"MatchPropertyEvaluation":{"clause":"13.5.11","ids":["prod-KsfuMy9v"]}},"prod-_cQam8pS":{"MatchPropertyEvaluation":{"clause":"13.5.11","ids":["prod-3r0zVjpr"]}},"prod-PB4a74MT":{"MatchPropertyEvaluation":{"clause":"13.5.11","ids":["prod-M6BPolEc"]}},"prod-dglw2W8H":{"MatchPropertyEvaluation":{"clause":"13.5.11","ids":["prod-H6NF6IK-"]}},"prod-crmMTtbu":{"MatchRestPropertyEvaluation":{"clause":"13.5.12","ids":["prod-OocR-Eo_"]}},"prod-w_IWHbxt":{"MatchElementEvaluation":{"clause":"13.5.13","ids":["prod-RG6U7f5v"]}},"prod-gb-onOzg":{"MatchElementEvaluation":{"clause":"13.5.13","ids":["prod-8m5VJRRv"]}},"prod--q9atpfX":{"MatchElementEvaluation":{"clause":"13.5.13","ids":["prod-asdAN81g"]}},"prod-12vERrSa":{"MatchElementEvaluation":{"clause":"13.5.13","ids":["prod-aIuWE2ZN"]}}}`); -let biblio = JSON.parse(`{"refsByClause":{"sec-create-match-record":["_ref_0"],"sec-create-match-result":["_ref_1"],"sec-match-constructor-instance":["_ref_2","_ref_3","_ref_4","_ref_5"],"sec-match-expression-runtime-semantics":["_ref_6","_ref_7","_ref_252","_ref_253","_ref_254"],"sec-match-clauses-evaluation":["_ref_8","_ref_9","_ref_10","_ref_11","_ref_255","_ref_256","_ref_257","_ref_258","_ref_259","_ref_260"],"sec-match-clause-evaluation":["_ref_12","_ref_13","_ref_14","_ref_15","_ref_16","_ref_17","_ref_18","_ref_19","_ref_20","_ref_21","_ref_22","_ref_261","_ref_262","_ref_263","_ref_264"],"sec-match-pattern-matches":["_ref_23","_ref_24","_ref_25","_ref_26","_ref_27","_ref_28","_ref_29","_ref_30","_ref_265","_ref_266","_ref_267","_ref_268","_ref_269","_ref_270","_ref_271","_ref_272","_ref_273","_ref_274","_ref_275","_ref_276","_ref_277","_ref_278"],"sec-combined-match-pattern-matches":["_ref_31","_ref_32","_ref_33","_ref_34","_ref_35","_ref_279","_ref_280","_ref_281","_ref_282","_ref_283","_ref_284","_ref_285","_ref_286"],"sec-interpolation-pattern-matches":["_ref_36","_ref_37","_ref_38","_ref_39","_ref_287","_ref_288"],"sec-near-literal-match-pattern-matches":["_ref_40","_ref_41","_ref_42","_ref_43","_ref_289","_ref_290"],"sec-destructuring-match-pattern-matches":["_ref_44","_ref_45","_ref_46","_ref_47","_ref_48","_ref_49","_ref_50","_ref_51","_ref_52","_ref_53","_ref_54","_ref_55","_ref_56","_ref_57","_ref_58","_ref_59","_ref_60","_ref_61","_ref_62","_ref_63","_ref_291","_ref_292","_ref_293","_ref_294","_ref_295","_ref_296","_ref_297","_ref_298","_ref_299","_ref_300","_ref_301","_ref_302","_ref_303","_ref_304","_ref_305","_ref_306","_ref_307","_ref_308","_ref_309"],"sec-match-property-evaluation":["_ref_64","_ref_65","_ref_66","_ref_67","_ref_68","_ref_69","_ref_70","_ref_71","_ref_72","_ref_73","_ref_310","_ref_311","_ref_312","_ref_313","_ref_314","_ref_315","_ref_316","_ref_317","_ref_318","_ref_319"],"sec-match-rest-property-evaluation":["_ref_74","_ref_75","_ref_320","_ref_321"],"sec-match-element-evaluation":["_ref_76","_ref_77","_ref_78","_ref_79","_ref_80","_ref_81","_ref_82","_ref_83","_ref_84","_ref_85","_ref_86","_ref_87","_ref_88","_ref_322","_ref_323","_ref_324","_ref_325","_ref_326","_ref_327","_ref_328","_ref_329","_ref_330","_ref_331","_ref_332"],"sec-match-record":["_ref_89"],"sec-custom-matcher":["_ref_90","_ref_91","_ref_92","_ref_93","_ref_94","_ref_95","_ref_96"],"sec-get-match-cache":["_ref_97","_ref_98"],"sec-match-cached-has-property":["_ref_99","_ref_100","_ref_101"],"sec-match-cached-get":["_ref_102","_ref_103","_ref_104"],"sec-match-cached-is-iterable":["_ref_105","_ref_106","_ref_107","_ref_108"],"sec-match-cached-get-iterator":["_ref_109","_ref_110","_ref_111","_ref_112"],"sec-match-cached-iterator-step":["_ref_113","_ref_114","_ref_115","_ref_116"],"sec-match-cached-get-iterator-nth-item":["_ref_117","_ref_118","_ref_119","_ref_120"],"sec-match-iterator-length-match":["_ref_121","_ref_122","_ref_123","_ref_124"],"sec-add-match-binding":["_ref_125"],"sec-relational-operators-runtime-semantics-evaluation":["_ref_126","_ref_334","_ref_335"],"sec-object-@@matcher":["_ref_127","_ref_128","_ref_129"],"sec-function-@@matcher":["_ref_130","_ref_131"],"sec-function-prototype-@@matcher":["_ref_132"],"sec-boolean-@@matcher":["_ref_133","_ref_134"],"sec-boolean-prototype-@@matcher":["_ref_135","_ref_136"],"sec-symbol-@@matcher":["_ref_137","_ref_138","_ref_139"],"sec-symbol-prototype-@@matcher":["_ref_140","_ref_141"],"error-@@matcher":["_ref_142","_ref_143","_ref_144"],"nativeerror-@@matcher":["_ref_145","_ref_146","_ref_147"],"aggregate-error-@@matcher":["_ref_148","_ref_149","_ref_150"],"sec-number-@@matcher":["_ref_151","_ref_152"],"sec-number-prototype-@@matcher":["_ref_153","_ref_154"],"sec-bigint-@@matcher":["_ref_155","_ref_156"],"sec-bigint-prototype-@@matcher":["_ref_157","_ref_158"],"date-@@matcher":["_ref_159","_ref_160","_ref_161"],"string-@@matcher":["_ref_162","_ref_163"],"sec-string-prototype-@@matcher":["_ref_164","_ref_165"],"regexp-@@matcher":["_ref_166","_ref_167"],"regexp-prototype-@@matcher":["_ref_168","_ref_169"],"array-@@matcher":["_ref_170","_ref_171"],"typedarray-@@matcher":["_ref_172","_ref_173","_ref_174","_ref_175","_ref_176"],"map-@@matcher":["_ref_177","_ref_178","_ref_179"],"set-@@matcher":["_ref_180","_ref_181","_ref_182"],"weakmap-@@matcher":["_ref_183","_ref_184","_ref_185"],"weakset-@@matcher":["_ref_186","_ref_187","_ref_188"],"arraybuffer-@@matcher":["_ref_189","_ref_190","_ref_191"],"sharedarraybuffer-@@matcher":["_ref_192","_ref_193","_ref_194","_ref_195"],"dataview-@@matcher":["_ref_196","_ref_197","_ref_198"],"weak-ref-@@matcher":["_ref_199","_ref_200","_ref_201"],"finalization-registry-@@matcher":["_ref_202","_ref_203","_ref_204"],"promise-@@matcher":["_ref_205","_ref_206"],"sec-match-expression-syntax":["_ref_207","_ref_208","_ref_209","_ref_210","_ref_211","_ref_212","_ref_213","_ref_214","_ref_215","_ref_216","_ref_217","_ref_218","_ref_219","_ref_220","_ref_221","_ref_222","_ref_223","_ref_224","_ref_225","_ref_226","_ref_227","_ref_228","_ref_229","_ref_230","_ref_231","_ref_232","_ref_233","_ref_234","_ref_235","_ref_236","_ref_237","_ref_238","_ref_239","_ref_240","_ref_241","_ref_242","_ref_243","_ref_244","_ref_245","_ref_246"],"sec-match-expression-early-errors":["_ref_247","_ref_248","_ref_249","_ref_250","_ref_251"],"sec-relational-operators":["_ref_333"]},"entries":[{"type":"table","id":"table-1","number":1,"caption":"Table 1: Well-known Symbols"},{"type":"term","term":"@@matcher","refId":"sec-well-known-symbols"},{"type":"clause","id":"sec-well-known-symbols","titleHTML":"Well-Known Symbols","number":"6.1.5.1","referencingIds":["_ref_94","_ref_107","_ref_112"]},{"type":"clause","id":"sec-ecmascript-language-types-symbol-type","titleHTML":"The Symbol Type","number":"6.1.5","referencingIds":["_ref_137"]},{"type":"clause","id":"sec-ecmascript-language-types","titleHTML":"ECMAScript Language Types","number":"6.1","referencingIds":["_ref_0","_ref_1","_ref_2","_ref_8","_ref_12","_ref_23","_ref_31","_ref_36","_ref_40","_ref_44","_ref_64","_ref_74","_ref_76","_ref_89","_ref_90","_ref_91","_ref_92","_ref_97","_ref_98","_ref_99","_ref_102","_ref_103","_ref_105","_ref_109","_ref_121","_ref_125"]},{"type":"op","aoid":"Type","refId":"sec-ecmascript-data-types-and-values"},{"type":"clause","id":"sec-ecmascript-data-types-and-values","titleHTML":"ECMAScript Data Types and Values","number":"6","referencingIds":["_ref_45","_ref_47","_ref_49","_ref_93","_ref_95","_ref_96","_ref_101","_ref_108","_ref_127","_ref_142","_ref_145","_ref_148","_ref_159","_ref_172","_ref_177","_ref_180","_ref_183","_ref_186","_ref_189","_ref_192","_ref_196","_ref_199","_ref_202"]},{"type":"op","aoid":"CreateMatchRecord","refId":"sec-create-match-record"},{"type":"clause","id":"sec-create-match-record","title":"CreateMatchRecord ( matched [ , value ] )","titleHTML":"CreateMatchRecord ( matched [ , value ] )","number":"7.1","referencingIds":["_ref_14","_ref_15","_ref_16","_ref_18","_ref_19","_ref_20","_ref_21","_ref_22","_ref_113","_ref_115","_ref_116","_ref_118","_ref_119"]},{"type":"op","aoid":"CreateMatchResultObject","refId":"sec-create-match-result"},{"type":"clause","id":"sec-create-match-result","title":"CreateMatchResultObject ( matched [ , value ] )","titleHTML":"CreateMatchResultObject ( matched [ , value ] )","number":"7.2","referencingIds":["_ref_3","_ref_4","_ref_5","_ref_128","_ref_129","_ref_130","_ref_133","_ref_134","_ref_135","_ref_136","_ref_138","_ref_139","_ref_140","_ref_141","_ref_143","_ref_146","_ref_149","_ref_151","_ref_152","_ref_153","_ref_154","_ref_155","_ref_156","_ref_157","_ref_158","_ref_160","_ref_162","_ref_163","_ref_164","_ref_165","_ref_166","_ref_168","_ref_169","_ref_170","_ref_173","_ref_174","_ref_175","_ref_178","_ref_181","_ref_184","_ref_187","_ref_190","_ref_193","_ref_194","_ref_197","_ref_200","_ref_203","_ref_205"]},{"type":"op","aoid":"MatchConstructorInstance","refId":"sec-match-constructor-instance"},{"type":"clause","id":"sec-match-constructor-instance","title":"MatchConstructorInstance ( value, target [ , intrinsicName ] )","titleHTML":"MatchConstructorInstance ( value, target [ , intrinsicName ] )","number":"7.3","referencingIds":["_ref_131","_ref_132","_ref_144","_ref_147","_ref_150","_ref_161","_ref_167","_ref_171","_ref_176","_ref_179","_ref_182","_ref_185","_ref_188","_ref_191","_ref_195","_ref_198","_ref_201","_ref_204","_ref_206"]},{"type":"clause","id":"sec-intrinsic-matcher","titleHTML":"Misc","number":"7"},{"type":"production","id":"prod-MatchExpression","name":"MatchExpression"},{"type":"production","id":"prod-MatchClauses","name":"MatchClauses","referencingIds":["_ref_207","_ref_209","_ref_248","_ref_252","_ref_253","_ref_254","_ref_257","_ref_259"]},{"type":"production","id":"prod-MatchClause","name":"MatchClause","referencingIds":["_ref_208","_ref_210","_ref_247","_ref_249","_ref_255","_ref_256","_ref_258","_ref_260"]},{"type":"production","id":"prod-MatchPattern","name":"MatchPattern","referencingIds":["_ref_211","_ref_212","_ref_219","_ref_220","_ref_221","_ref_222","_ref_223","_ref_224","_ref_225","_ref_241","_ref_243","_ref_244","_ref_250","_ref_261","_ref_262","_ref_263","_ref_264","_ref_277","_ref_278","_ref_279","_ref_280","_ref_281","_ref_282","_ref_283","_ref_284","_ref_285","_ref_286","_ref_287","_ref_288","_ref_289","_ref_290","_ref_318","_ref_319","_ref_322","_ref_323","_ref_324","_ref_331","_ref_332","_ref_333","_ref_334","_ref_335"]},{"type":"production","id":"prod-CombinedMatchPattern","name":"CombinedMatchPattern","referencingIds":["_ref_213","_ref_251","_ref_265","_ref_266"]},{"type":"production","id":"prod-InterpolationPattern","name":"InterpolationPattern","referencingIds":["_ref_214","_ref_267","_ref_268"]},{"type":"production","id":"prod-IdentifierMatchPattern","name":"IdentifierMatchPattern","referencingIds":["_ref_215","_ref_234","_ref_242","_ref_245","_ref_269","_ref_270","_ref_316","_ref_317","_ref_320","_ref_321"]},{"type":"production","id":"prod-NearLiteralMatchPattern","name":"NearLiteralMatchPattern","referencingIds":["_ref_216","_ref_246","_ref_271","_ref_272"]},{"type":"production","id":"prod-ObjectMatchPattern","name":"ObjectMatchPattern","referencingIds":["_ref_217","_ref_273","_ref_274"]},{"type":"production","id":"prod-ArrayMatchPattern","name":"ArrayMatchPattern","referencingIds":["_ref_218","_ref_275","_ref_276"]},{"type":"production","id":"prod-MatchRestProperty","name":"MatchRestProperty","referencingIds":["_ref_226","_ref_229","_ref_291","_ref_292","_ref_296","_ref_298","_ref_299"]},{"type":"production","id":"prod-MatchPropertyList","name":"MatchPropertyList","referencingIds":["_ref_227","_ref_228","_ref_236","_ref_293","_ref_294","_ref_295","_ref_297","_ref_312","_ref_314"]},{"type":"production","id":"prod-MatchElementList","name":"MatchElementList","referencingIds":["_ref_231","_ref_232","_ref_239","_ref_303","_ref_304","_ref_305","_ref_307","_ref_327","_ref_329"]},{"type":"production","id":"prod-MatchElisionElement","name":"MatchElisionElement","referencingIds":["_ref_238","_ref_240","_ref_325","_ref_326","_ref_328","_ref_330"]},{"type":"production","id":"prod-MatchProperty","name":"MatchProperty","referencingIds":["_ref_235","_ref_237","_ref_310","_ref_311","_ref_313","_ref_315"]},{"type":"production","id":"prod-MatchRestElement","name":"MatchRestElement","referencingIds":["_ref_230","_ref_233","_ref_300","_ref_301","_ref_302","_ref_306","_ref_308","_ref_309"]},{"type":"clause","id":"sec-match-expression-syntax","titleHTML":"Syntax","number":"13.5.1"},{"type":"clause","id":"sec-match-expression-early-errors","title":"Static Semantics: Early Errors","titleHTML":"Static Semantics: Early Errors","number":"13.5.2"},{"type":"clause","id":"sec-match-expression-runtime-semantics","title":"Runtime Semantics: Evaluation","titleHTML":"Runtime Semantics: Evaluation","number":"13.5.3"},{"type":"op","aoid":"MatchClausesEvaluation","refId":"sec-match-clauses-evaluation"},{"type":"clause","id":"sec-match-clauses-evaluation","titleHTML":"Runtime Semantics: MatchClausesEvaluation","number":"13.5.4","referencingIds":["_ref_6","_ref_10"]},{"type":"op","aoid":"MatchClauseEvaluation","refId":"sec-match-clause-evaluation"},{"type":"clause","id":"sec-match-clause-evaluation","titleHTML":"Runtime Semantics: MatchClauseEvaluation","number":"13.5.5","referencingIds":["_ref_9","_ref_11"]},{"type":"op","aoid":"MatchPatternMatches","refId":"sec-match-pattern-matches"},{"type":"clause","id":"sec-match-pattern-matches","titleHTML":"Runtime Semantics: MatchPatternMatches","number":"13.5.6","referencingIds":["_ref_13","_ref_17","_ref_30","_ref_32","_ref_33","_ref_34","_ref_35","_ref_39","_ref_42","_ref_73","_ref_79","_ref_85","_ref_126"]},{"type":"op","aoid":"CombinedMatchPatternMatches","refId":"sec-combined-match-pattern-matches"},{"type":"clause","id":"sec-combined-match-pattern-matches","titleHTML":"Runtime Semantics: CombinedMatchPatternMatches","number":"13.5.7","referencingIds":["_ref_24"]},{"type":"op","aoid":"InterpolationPatternMatches","refId":"sec-interpolation-pattern-matches"},{"type":"clause","id":"sec-interpolation-pattern-matches","titleHTML":"Runtime Semantics: InterpolationPatternMatches","number":"13.5.8","referencingIds":["_ref_25"]},{"type":"op","aoid":"NearLiteralMatchPatternMatches","refId":"sec-near-literal-match-pattern-matches"},{"type":"clause","id":"sec-near-literal-match-pattern-matches","titleHTML":"Runtime Semantics: NearLiteralMatchPatternMatches","number":"13.5.9","referencingIds":["_ref_27"]},{"type":"op","aoid":"DestructuringMatchPatternMatches","refId":"sec-destructuring-match-pattern-matches"},{"type":"clause","id":"sec-destructuring-match-pattern-matches","titleHTML":"Runtime Semantics: DestructuringMatchPatternMatches","number":"13.5.10","referencingIds":["_ref_28","_ref_29"]},{"type":"op","aoid":"MatchPropertyEvaluation","refId":"sec-match-property-evaluation"},{"type":"clause","id":"sec-match-property-evaluation","titleHTML":"Runtime Semantics: MatchPropertyEvaluation","number":"13.5.11","referencingIds":["_ref_48","_ref_50","_ref_65","_ref_66","_ref_67"]},{"type":"op","aoid":"MatchRestPropertyEvaluation","refId":"sec-match-rest-property-evaluation"},{"type":"clause","id":"sec-match-rest-property-evaluation","titleHTML":"Runtime Semantics: MatchRestPropertyEvaluation","number":"13.5.12","referencingIds":["_ref_46","_ref_51"]},{"type":"op","aoid":"MatchElementEvaluation","refId":"sec-match-element-evaluation"},{"type":"clause","id":"sec-match-element-evaluation","titleHTML":"Runtime Semantics: MatchElementEvaluation","number":"13.5.13","referencingIds":["_ref_53","_ref_54","_ref_57","_ref_60","_ref_61","_ref_62","_ref_80","_ref_81","_ref_82","_ref_83","_ref_87"]},{"type":"clause","id":"sec-match-record","title":"Match Records","titleHTML":"Match Records","number":"13.5.14"},{"type":"op","aoid":"InvokeCustomMatcher","refId":"sec-custom-matcher"},{"type":"clause","id":"sec-custom-matcher","title":"InvokeCustomMatcher ( val, matchable )","titleHTML":"InvokeCustomMatcher ( val, matchable )","number":"13.5.15","referencingIds":["_ref_37","_ref_38"]},{"type":"op","aoid":"RegularExpressionNamedCaptureGroupBindingInitialization","refId":"sec-regex-named-capture-group-binding"},{"type":"clause","id":"sec-regex-named-capture-group-binding","title":"RegularExpressionNamedCaptureGroupBindingInitialization ( regexMatchResult )","titleHTML":"RegularExpressionNamedCaptureGroupBindingInitialization ( regexMatchResult )","number":"13.5.16","referencingIds":["_ref_41","_ref_43"]},{"type":"op","aoid":"GetMatchCache","refId":"sec-get-match-cache"},{"type":"clause","id":"sec-get-match-cache","title":"GetMatchCache ( cacheGroup, object )","titleHTML":"GetMatchCache ( cacheGroup, object )","number":"13.5.17","referencingIds":["_ref_100","_ref_104","_ref_110","_ref_114","_ref_117","_ref_123"]},{"type":"op","aoid":"MatchCachedHasProperty","refId":"sec-match-cached-has-property"},{"type":"clause","id":"sec-match-cached-has-property","title":"MatchCachedHasProperty ( cacheGroup, object, propertyName )","titleHTML":"MatchCachedHasProperty ( cacheGroup, object, propertyName )","number":"13.5.18","referencingIds":["_ref_68","_ref_71"]},{"type":"op","aoid":"MatchCachedGet","refId":"sec-match-cached-get"},{"type":"clause","id":"sec-match-cached-get","title":"MatchCachedGet ( cacheGroup, object, propertyName )","titleHTML":"MatchCachedGet ( cacheGroup, object, propertyName )","number":"13.5.19","referencingIds":["_ref_69","_ref_72","_ref_106","_ref_111"]},{"type":"op","aoid":"MatchCachedIsIterable","refId":"sec-match-cached-is-iterable"},{"type":"clause","id":"sec-match-cached-is-iterable","title":"MatchCachedIsIterable ( cacheGroup, object )","titleHTML":"MatchCachedIsIterable ( cacheGroup, object )","number":"13.5.20","referencingIds":["_ref_52","_ref_56","_ref_59"]},{"type":"op","aoid":"MatchCachedGetIterator","refId":"sec-match-cached-get-iterator"},{"type":"clause","id":"sec-match-cached-get-iterator","title":"MatchCachedGetIterator ( cacheGroup, object )","titleHTML":"MatchCachedGetIterator ( cacheGroup, object )","number":"13.5.21","referencingIds":["_ref_77","_ref_122"]},{"type":"op","aoid":"MatchCachedIteratorStep","refId":"sec-match-cached-iterator-step"},{"type":"clause","id":"sec-match-cached-iterator-step","title":"MatchCachedIteratorStep ( cacheGroup, iterator )","titleHTML":"MatchCachedIteratorStep ( cacheGroup, iterator )","number":"13.5.22","referencingIds":["_ref_78","_ref_120"]},{"type":"op","aoid":"MatchCachedGetIteratorNthItem","refId":"sec-match-cached-get-iterator-nth-item"},{"type":"clause","id":"sec-match-cached-get-iterator-nth-item","title":"MatchCachedGetIteratorNthItem ( cacheGroup, iterator, n )","titleHTML":"MatchCachedGetIteratorNthItem ( cacheGroup, iterator, n )","number":"13.5.23","referencingIds":["_ref_84","_ref_86","_ref_88","_ref_124"]},{"type":"op","aoid":"MatchIteratorLengthMatch","refId":"sec-match-iterator-length-match"},{"type":"clause","id":"sec-match-iterator-length-match","title":"MatchIteratorLengthMatch ( cacheGroup, matchable, lastIndex )","titleHTML":"MatchIteratorLengthMatch ( cacheGroup, matchable, lastIndex )","number":"13.5.24","referencingIds":["_ref_55","_ref_58","_ref_63"]},{"type":"op","aoid":"CloseIterators","refId":"sec-close-iterators"},{"type":"clause","id":"sec-close-iterators","title":"CloseIterators ( iterators )","titleHTML":"CloseIterators ( iterators )","number":"13.5.25","referencingIds":["_ref_7"]},{"type":"op","aoid":"AddMatchBinding","refId":"sec-add-match-binding"},{"type":"clause","id":"sec-add-match-binding","title":"AddMatchBinding ( name, value )","titleHTML":"AddMatchBinding ( name, value )","number":"13.5.26","referencingIds":["_ref_26","_ref_70","_ref_75"]},{"type":"clause","id":"sec-match-expression","title":"Match Expression","titleHTML":"Match Expression","number":"13.5"},{"type":"clause","id":"sec-relational-operators-runtime-semantics-evaluation","titleHTML":"Runtime Semantics: Evaluation","number":"13.10.1"},{"type":"clause","id":"sec-relational-operators","titleHTML":"Relational Operators","number":"13.10"},{"type":"clause","id":"sec-ecmascript-language-expressions","titleHTML":"ECMAScript Language: Expressions","number":"13"},{"type":"clause","id":"sec-object-@@matcher","title":"Object [ @@matcher ] ( value )","titleHTML":"Object [ @@matcher ] ( value )","number":"20.1.2.23"},{"type":"clause","id":"sec-properties-of-the-object-constructor","titleHTML":"Properties of the Object Constructor","number":"20.1.2"},{"type":"clause","id":"sec-object-objects","titleHTML":"Object Objects","number":"20.1"},{"type":"clause","id":"sec-function-@@matcher","title":"Function [ @@matcher ] ( value )","titleHTML":"Function [ @@matcher ] ( value )","number":"20.2.2.3"},{"type":"clause","id":"sec-properties-of-the-function-constructor","titleHTML":"Properties of the Function Constructor","number":"20.2.2"},{"type":"clause","id":"sec-function-prototype-@@matcher","title":"Function.prototype [ @@matcher ] ( value )","titleHTML":"Function.prototype [ @@matcher ] ( value )","number":"20.2.3.7"},{"type":"clause","id":"sec-properties-of-the-function-prototype-object","titleHTML":"Properties of the Function Prototype Object","number":"20.2.3"},{"type":"clause","id":"sec-function-objects","titleHTML":"Function Objects","number":"20.2"},{"type":"clause","id":"sec-boolean-@@matcher","title":"Boolean [ @@matcher ] ( value )","titleHTML":"Boolean [ @@matcher ] ( value )","number":"20.3.2.2"},{"type":"clause","id":"sec-properties-of-the-boolean-constructor","titleHTML":"Properties of the Boolean Constructor","number":"20.3.2"},{"type":"clause","id":"sec-boolean-prototype-@@matcher","title":"Boolean.prototype [ @@matcher ] ( value )","titleHTML":"Boolean.prototype [ @@matcher ] ( value )","number":"20.3.3.4"},{"type":"clause","id":"sec-properties-of-the-boolean-prototype-object","titleHTML":"Properties of the Boolean Prototype Object","number":"20.3.3"},{"type":"clause","id":"sec-boolean-objects","titleHTML":"Boolean Objects","number":"20.3"},{"type":"clause","id":"sec-symbol-@@matcher","title":"Symbol [ @@matcher ] ( value )","titleHTML":"Symbol [ @@matcher ] ( value )","number":"20.4.2.17"},{"type":"clause","id":"sec-properties-of-the-symbol-constructor","titleHTML":"Properties of the Symbol Constructor","number":"20.4.2"},{"type":"clause","id":"sec-symbol-prototype-@@matcher","title":"Symbol.prototype [ @@matcher ] ( value )","titleHTML":"Symbol.prototype [ @@matcher ] ( value )","number":"20.4.3.5"},{"type":"clause","id":"sec-properties-of-the-symbol-prototype-object","titleHTML":"Properties of the Symbol Prototype Object","number":"20.4.3"},{"type":"clause","id":"sec-symbol-objects","titleHTML":"Symbol Objects","number":"20.4"},{"type":"clause","id":"error-@@matcher","title":"Error [ @@matcher ] ( value )","titleHTML":"Error [ @@matcher ] ( value )","number":"20.5.2.2"},{"type":"clause","id":"sec-properties-of-the-error-constructor","titleHTML":"Properties of the Error Constructor","number":"20.5.2"},{"type":"clause","id":"nativeerror-@@matcher","title":"NativeError [ @@matcher ] ( value )","titleHTML":"NativeError [ @@matcher ] ( value )","number":"20.5.6.2.2"},{"type":"clause","id":"sec-properties-of-the-nativeerror-constructors","title":"Properties of the NativeError Constructors","titleHTML":"Properties of the NativeError Constructors","number":"20.5.6.2"},{"type":"clause","id":"sec-nativeerror-object-structure","title":"NativeError Object Structure","titleHTML":"NativeError Object Structure","number":"20.5.6"},{"type":"clause","id":"sec-aggregate-error","title":"AggregateError ( errors, message [ , options ] )","titleHTML":"AggregateError ( errors, message [ , options ] )","number":"20.5.7.1.1"},{"type":"clause","id":"sec-aggregate-error-constructor","titleHTML":"The AggregateError Constructor","number":"20.5.7.1"},{"type":"clause","id":"aggregate-error-@@matcher","title":"AggregateError [ @@matcher ] ( value )","titleHTML":"AggregateError [ @@matcher ] ( value )","number":"20.5.7.2.2"},{"type":"clause","id":"sec-properties-of-the-aggregate-error-constructor","titleHTML":"Properties of the AggregateError Constructor","number":"20.5.7.2"},{"type":"clause","id":"sec-aggregate-error-objects","titleHTML":"AggregateError Objects","number":"20.5.7"},{"type":"clause","id":"sec-error-objects","titleHTML":"Error Objects","number":"20.5"},{"type":"clause","id":"sec-fundamental-objects","titleHTML":"Fundamental Objects","number":"20"},{"type":"clause","id":"sec-number-@@matcher","title":"Number [ @@matcher ] ( value )","titleHTML":"Number [ @@matcher ] ( value )","number":"21.1.2.16"},{"type":"clause","id":"sec-properties-of-the-number-constructor","titleHTML":"Properties of the Number Constructor","number":"21.1.2"},{"type":"clause","id":"sec-number-prototype-@@matcher","title":"Number.prototype [ @@matcher ] ( value )","titleHTML":"Number.prototype [ @@matcher ] ( value )","number":"21.1.3.8"},{"type":"clause","id":"sec-properties-of-the-number-prototype-object","titleHTML":"Properties of the Number Prototype Object","number":"21.1.3"},{"type":"clause","id":"sec-number-objects","titleHTML":"Number Objects","number":"21.1"},{"type":"clause","id":"sec-bigint-@@matcher","title":"BigInt [ @@matcher ] ( value )","titleHTML":"BigInt [ @@matcher ] ( value )","number":"21.2.2.4"},{"type":"clause","id":"sec-properties-of-the-bigint-constructor","titleHTML":"Properties of the BigInt Constructor","number":"21.2.2"},{"type":"clause","id":"sec-bigint-prototype-@@matcher","title":"BigInt.prototype [ @@matcher ] ( value )","titleHTML":"BigInt.prototype [ @@matcher ] ( value )","number":"21.2.3.6"},{"type":"clause","id":"sec-properties-of-the-bigint-prototype-object","titleHTML":"Properties of the BigInt Prototype Object","number":"21.2.3"},{"type":"clause","id":"sec-bigint-objects","titleHTML":"BigInt Objects","number":"21.2"},{"type":"clause","id":"date-@@matcher","title":"Date [ @@matcher ] ( value )","titleHTML":"Date [ @@matcher ] ( value )","number":"21.4.3.5"},{"type":"clause","id":"sec-properties-of-the-date-constructor","titleHTML":"Properties of the Date Constructor","number":"21.4.3"},{"type":"clause","id":"sec-date-objects","titleHTML":"Date Objects","number":"21.4"},{"type":"clause","id":"sec-numbers-and-dates","titleHTML":"Numbers and Dates","number":"21"},{"type":"clause","id":"string-@@matcher","title":"String [ @@matcher ] ( value )","titleHTML":"String [ @@matcher ] ( value )","number":"22.1.2.5"},{"type":"clause","id":"sec-properties-of-the-string-constructor","titleHTML":"Properties of the String Constructor","number":"22.1.2"},{"type":"clause","id":"sec-string-prototype-@@matcher","title":"String.prototype [ @@matcher ] ( value )","titleHTML":"String.prototype [ @@matcher ] ( value )","number":"22.1.3.35"},{"type":"clause","id":"sec-properties-of-the-string-prototype-object","titleHTML":"Properties of the String Prototype Object","number":"22.1.3"},{"type":"clause","id":"sec-string-objects","titleHTML":"String Objects","number":"22.1"},{"type":"clause","id":"regexp-@@matcher","title":"RegExp [ @@matcher ] ( value )","titleHTML":"RegExp [ @@matcher ] ( value )","number":"22.2.4.1"},{"type":"clause","id":"sec-properties-of-the-regexp-constructor","titleHTML":"Properties of the RegExp Constructor","number":"22.2.4"},{"type":"clause","id":"regexp-prototype-@@matcher","title":"RegExp.prototype [ @@matcher ] ( value )","titleHTML":"RegExp.prototype [ @@matcher ] ( value )","number":"22.2.5.10"},{"type":"clause","id":"sec-properties-of-the-regexp-prototype-object","titleHTML":"Properties of the RegExp Prototype Object","number":"22.2.5"},{"type":"clause","id":"sec-regexp-regular-expression-objects","titleHTML":"RegExp (Regular Expression) Objects","number":"22.2"},{"type":"clause","id":"sec-text-processing","titleHTML":"Text Processing","number":"22"},{"type":"clause","id":"array-@@matcher","title":"Array [ @@matcher ] ( value )","titleHTML":"Array [ @@matcher ] ( value )","number":"23.1.1.6"},{"type":"clause","id":"sec-properties-of-the-array-constructor","titleHTML":"Properties of the Array Constructor","number":"23.1.1"},{"type":"clause","id":"sec-array-objects","titleHTML":"Array Objects","number":"23.1"},{"type":"clause","id":"typedarray-@@matcher","title":"TypedArray [ @@matcher ] ( value )","titleHTML":"TypedArray [ @@matcher ] ( value )","number":"23.2.6.3"},{"type":"clause","id":"sec-properties-of-the-typedarray-constructors","title":"Properties of the TypedArray Constructors","titleHTML":"Properties of the TypedArray Constructors","number":"23.2.6"},{"type":"clause","id":"sec-typedarray-objects","titleHTML":"TypedArray Objects","number":"23.2"},{"type":"clause","id":"sec-indexed-collections","titleHTML":"Indexed Collections","number":"23"},{"type":"clause","id":"map-@@matcher","title":"Map [ @@matcher ] ( value )","titleHTML":"Map [ @@matcher ] ( value )","number":"24.1.2.3"},{"type":"clause","id":"sec-properties-of-the-map-constructor","titleHTML":"Properties of the Map Constructor","number":"24.1.2"},{"type":"clause","id":"sec-map-objects","titleHTML":"Map Objects","number":"24.1"},{"type":"clause","id":"set-@@matcher","title":"Set [ @@matcher ] ( value )","titleHTML":"Set [ @@matcher ] ( value )","number":"24.2.2.3"},{"type":"clause","id":"sec-properties-of-the-set-constructor","titleHTML":"Properties of the Set Constructor","number":"24.2.2"},{"type":"clause","id":"sec-set-objects","titleHTML":"Set Objects","number":"24.2"},{"type":"clause","id":"weakmap-@@matcher","title":"WeakMap [ @@matcher ] ( value )","titleHTML":"WeakMap [ @@matcher ] ( value )","number":"24.3.2.2"},{"type":"clause","id":"sec-properties-of-the-weakmap-constructor","titleHTML":"Properties of the WeakMap Constructor","number":"24.3.2"},{"type":"clause","id":"sec-weakmap-objects","titleHTML":"WeakMap Objects","number":"24.3"},{"type":"clause","id":"weakset-@@matcher","title":"WeakSet [ @@matcher ] ( value )","titleHTML":"WeakSet [ @@matcher ] ( value )","number":"24.4.2.2"},{"type":"clause","id":"sec-properties-of-the-weakset-constructor","titleHTML":"Properties of the WeakSet Constructor","number":"24.4.2"},{"type":"clause","id":"sec-weakset-objects","titleHTML":"WeakSet Objects","number":"24.4"},{"type":"clause","id":"sec-keyed-collections","titleHTML":"Keyed Collections","number":"24"},{"type":"clause","id":"arraybuffer-@@matcher","title":"ArrayBuffer [ @@matcher ] ( value )","titleHTML":"ArrayBuffer [ @@matcher ] ( value )","number":"25.1.4.4"},{"type":"clause","id":"sec-properties-of-the-arraybuffer-constructor","titleHTML":"Properties of the ArrayBuffer Constructor","number":"25.1.4"},{"type":"clause","id":"sec-arraybuffer-objects","titleHTML":"ArrayBuffer Objects","number":"25.1"},{"type":"clause","id":"sharedarraybuffer-@@matcher","title":"SharedArrayBuffer [ @@matcher ] ( value )","titleHTML":"SharedArrayBuffer [ @@matcher ] ( value )","number":"25.2.3.3"},{"type":"clause","id":"sec-properties-of-the-sharedarraybuffer-constructor","titleHTML":"Properties of the SharedArrayBuffer Constructor","number":"25.2.3"},{"type":"clause","id":"sec-sharedarraybuffer-objects","titleHTML":"SharedArrayBuffer Objects","number":"25.2"},{"type":"clause","id":"dataview-@@matcher","title":"DataView [ @@matcher ] ( value )","titleHTML":"DataView [ @@matcher ] ( value )","number":"25.3.3.2"},{"type":"clause","id":"sec-properties-of-the-dataview-constructor","titleHTML":"Properties of the DataView Constructor","number":"25.3.3"},{"type":"clause","id":"sec-dataview-objects","titleHTML":"DataView Objects","number":"25.3"},{"type":"clause","id":"sec-structured-data","titleHTML":"Structured Data","number":"25"},{"type":"clause","id":"weak-ref-@@matcher","title":"WeakRef [ @@matcher ] ( value )","titleHTML":"WeakRef [ @@matcher ] ( value )","number":"26.1.2.2"},{"type":"clause","id":"sec-properties-of-the-weak-ref-constructor","titleHTML":"Properties of the WeakRef Constructor","number":"26.1.2"},{"type":"clause","id":"sec-weak-ref-objects","titleHTML":"WeakRef Objects","number":"26.1"},{"type":"clause","id":"finalization-registry-@@matcher","title":"FinalizationRegistry [ @@matcher ] ( value )","titleHTML":"FinalizationRegistry [ @@matcher ] ( value )","number":"26.2.2.2"},{"type":"clause","id":"sec-properties-of-the-finalization-registry-constructor","titleHTML":"Properties of the FinalizationRegistry Constructor","number":"26.2.2"},{"type":"clause","id":"sec-finalization-registry-objects","titleHTML":"FinalizationRegistry Objects","number":"26.2"},{"type":"clause","id":"sec-managing-memory","titleHTML":"Managing Memory","number":"26"},{"type":"clause","id":"promise-@@matcher","title":"Promise [ @@matcher ] ( value )","titleHTML":"Promise [ @@matcher ] ( value )","number":"27.2.4.9"},{"type":"clause","id":"sec-properties-of-the-promise-constructor","titleHTML":"Properties of the Promise Constructor","number":"27.2.4"},{"type":"clause","id":"sec-promise-objects","titleHTML":"Promise Objects","number":"27.2"},{"type":"clause","id":"sec-control-abstraction-objects","titleHTML":"Control Abstraction Objects","number":"27"},{"type":"clause","id":"todo-constructors","titleHTML":"Confirm we do not want matchers for these constructors","number":"1000.1"},{"type":"clause","id":"todo-object-instances","titleHTML":"Should we add builtin matchers on the prototype for relevant class instances, so they do something useful?","number":"1000.2"},{"type":"clause","id":"sec-todo","titleHTML":"TODO","number":"1000"},{"type":"clause","id":"sec-copyright-and-software-license","title":"Copyright & Software License","titleHTML":"Copyright & Software License","number":"A"}]}`); +let sdoMap = JSON.parse(`{"prod-NtCnMbkE":{"MatchClausesEvaluation":{"clause":"13.5.4","ids":["prod-Xwb0apYm"]}},"prod-hpGY7qqi":{"MatchClausesEvaluation":{"clause":"13.5.4","ids":["prod-q06SCYJ_"]}},"prod-QL92K4xk":{"MatchClauseEvaluation":{"clause":"13.5.5","ids":["prod-13W_xPag"]}},"prod-2EY42XQ4":{"MatchClauseEvaluation":{"clause":"13.5.5","ids":["prod-oq8b6umT"]}},"prod-NTBaKJzT":{"MatchClauseEvaluation":{"clause":"13.5.5","ids":["prod-9inxrCDR"]}},"prod-EOsV1MJJ":{"MatchClauseEvaluation":{"clause":"13.5.5","ids":["prod-jN0a5aCs"]}},"prod-LAj8DpMp":{"MatchPatternMatches":{"clause":"13.5.6","ids":["prod-EquXXU0V"]}},"prod-cFd-DHvq":{"MatchPatternMatches":{"clause":"13.5.6","ids":["prod-8jR82WrM"]}},"prod-k3YtxQvb":{"MatchPatternMatches":{"clause":"13.5.6","ids":["prod-cOkAJWE1"]}},"prod-fExjcDDE":{"MatchPatternMatches":{"clause":"13.5.6","ids":["prod-fqe2KfNk"]}},"prod-KUcUUgsn":{"MatchPatternMatches":{"clause":"13.5.6","ids":["prod-U80C8biY"]}},"prod-BMX8uZDG":{"CombinedMatchPatternMatches":{"clause":"13.5.7","ids":["prod-hYdo8hkU"]}},"prod-a_2cW9fV":{"CombinedMatchPatternMatches":{"clause":"13.5.7","ids":["prod-TGrK8XcZ"]}},"prod-qpIlZNwe":{"NearLiteralMatchPatternMatches":{"clause":"13.5.9","ids":["prod-8zqNnsKM"]}},"prod-YKKHeFvr":{"NearLiteralMatchPatternMatches":{"clause":"13.5.9","ids":["prod-7rBxP_c3"]}},"prod-TWKDZZ0b":{"NearLiteralMatchPatternMatches":{"clause":"13.5.9","ids":["prod-7_4ORieJ","prod-wGAFufTu"]}},"prod-V3KpiHah":{"NearLiteralMatchPatternMatches":{"clause":"13.5.9","ids":["prod-nFT2R-a-"]}},"prod-J-2C3CeI":{"NearLiteralMatchPatternMatches":{"clause":"13.5.9","ids":["prod-r1eQGmrs"]}},"prod-9MjM10Vp":{"NearLiteralMatchPatternMatches":{"clause":"13.5.9","ids":["prod-uiyyW_3g"]}},"prod-Ya_CFKf9":{"NearLiteralMatchPatternMatches":{"clause":"13.5.9","ids":["prod-vQdlOG2y"]}},"prod-n_LIEilf":{"NearLiteralMatchPatternMatches":{"clause":"13.5.9","ids":["prod-FRFrVYuM"]}},"prod-4SlT9cEm":{"NearLiteralMatchPatternMatches":{"clause":"13.5.9","ids":["prod-isdYFa8G"]}},"prod-unmh-9e8":{"DestructuringMatchPatternMatches":{"clause":"13.5.10","ids":["prod-rB2BCLrd"]}},"prod-d3l2MJR8":{"DestructuringMatchPatternMatches":{"clause":"13.5.10","ids":["prod-BoVijmHY"]}},"prod-enRKXBgs":{"DestructuringMatchPatternMatches":{"clause":"13.5.10","ids":["prod-dpmQTyp1"]}},"prod-tcZ1471m":{"DestructuringMatchPatternMatches":{"clause":"13.5.10","ids":["prod-JBWDFoiE"]}},"prod-CgU6R4LP":{"DestructuringMatchPatternMatches":{"clause":"13.5.10","ids":["prod-GmBfo4xP"]}},"prod-_NAV0zCQ":{"DestructuringMatchPatternMatches":{"clause":"13.5.10","ids":["prod-OWt1hUl9"]}},"prod-f2qqRFH4":{"DestructuringMatchPatternMatches":{"clause":"13.5.10","ids":["prod-3lDWyiA5"]}},"prod-KTFggBlk":{"ObjectMatchPatternPropertyEvaluation":{"clause":"13.5.11","ids":["prod-vGtys9CT"]}},"prod-sihW8Z9r":{"ObjectMatchPatternPropertyEvaluation":{"clause":"13.5.11","ids":["prod-c9nkgulJ"]}},"prod-25i_2Zrq":{"ObjectMatchPatternPropertyEvaluation":{"clause":"13.5.11","ids":["prod-_mC5C6Gd"]}},"prod-xjk_A2yA":{"MatchElementEvaluation":{"clause":"13.5.13","ids":["prod-bffzn9GC"]}},"prod-IRAp5lmr":{"MatchElementEvaluation":{"clause":"13.5.13","ids":["prod-qoZrp7Rn"]}},"prod-XVL_RqS5":{"MatchElementEvaluation":{"clause":"13.5.13","ids":["prod-qjtNnhT8"]}},"prod-2pUFCl_x":{"MatchElementEvaluation":{"clause":"13.5.13","ids":["prod-IDF7asIM"]}}}`); +let biblio = JSON.parse(`{"refsByClause":{"sec-create-match-record":["_ref_0"],"sec-create-match-result":["_ref_1"],"sec-match-constructor-instance":["_ref_2","_ref_3","_ref_4","_ref_5"],"sec-match-expression-runtime-semantics":["_ref_6","_ref_7","_ref_257","_ref_258","_ref_259"],"sec-match-clauses-evaluation":["_ref_8","_ref_9","_ref_10","_ref_11","_ref_260","_ref_261","_ref_262","_ref_263","_ref_264","_ref_265"],"sec-match-clause-evaluation":["_ref_12","_ref_13","_ref_14","_ref_15","_ref_16","_ref_17","_ref_18","_ref_19","_ref_20","_ref_21","_ref_22","_ref_266","_ref_267","_ref_268","_ref_269"],"sec-match-pattern-matches":["_ref_23","_ref_24","_ref_25","_ref_26","_ref_27","_ref_28","_ref_29","_ref_30","_ref_270","_ref_271","_ref_272","_ref_273","_ref_274","_ref_275","_ref_276","_ref_277","_ref_278","_ref_279"],"sec-combined-match-pattern-matches":["_ref_31","_ref_32","_ref_33","_ref_34","_ref_35","_ref_280","_ref_281","_ref_282","_ref_283","_ref_284","_ref_285","_ref_286","_ref_287"],"sec-interpolation-pattern-matches":["_ref_36","_ref_37","_ref_38","_ref_39","_ref_288","_ref_289"],"sec-near-literal-match-pattern-matches":["_ref_40","_ref_41","_ref_42","_ref_43","_ref_290","_ref_291"],"sec-destructuring-match-pattern-matches":["_ref_44","_ref_45","_ref_46","_ref_47","_ref_48","_ref_49","_ref_50","_ref_51","_ref_52","_ref_53","_ref_54","_ref_55","_ref_56","_ref_57","_ref_58","_ref_59","_ref_60","_ref_61","_ref_62","_ref_63","_ref_292","_ref_293","_ref_294","_ref_295","_ref_296","_ref_297","_ref_298","_ref_299","_ref_300","_ref_301","_ref_302","_ref_303","_ref_304","_ref_305","_ref_306","_ref_307","_ref_308","_ref_309","_ref_310"],"sec-match-property-evaluation":["_ref_64","_ref_65","_ref_66","_ref_67","_ref_68","_ref_69","_ref_70","_ref_71","_ref_72","_ref_73","_ref_311","_ref_312","_ref_313","_ref_314","_ref_315","_ref_316","_ref_317","_ref_318"],"sec-match-rest-property-evaluation":["_ref_74","_ref_75"],"sec-match-element-evaluation":["_ref_76","_ref_77","_ref_78","_ref_79","_ref_80","_ref_81","_ref_82","_ref_83","_ref_84","_ref_85","_ref_86","_ref_87","_ref_88","_ref_319","_ref_320","_ref_321","_ref_322","_ref_323","_ref_324","_ref_325","_ref_326","_ref_327","_ref_328","_ref_329"],"sec-match-record":["_ref_89"],"sec-custom-matcher":["_ref_90","_ref_91","_ref_92","_ref_93","_ref_94","_ref_95","_ref_96"],"sec-get-match-cache":["_ref_97","_ref_98"],"sec-match-cached-has-property":["_ref_99","_ref_100","_ref_101"],"sec-match-cached-get":["_ref_102","_ref_103","_ref_104"],"sec-match-cached-is-iterable":["_ref_105","_ref_106","_ref_107","_ref_108"],"sec-match-cached-get-iterator":["_ref_109","_ref_110","_ref_111","_ref_112"],"sec-match-cached-iterator-step":["_ref_113","_ref_114","_ref_115","_ref_116"],"sec-match-cached-get-iterator-nth-item":["_ref_117","_ref_118","_ref_119","_ref_120"],"sec-match-iterator-length-match":["_ref_121","_ref_122","_ref_123","_ref_124"],"sec-add-match-binding":["_ref_125"],"sec-relational-operators-runtime-semantics-evaluation":["_ref_126","_ref_331","_ref_332"],"sec-object-@@matcher":["_ref_127","_ref_128","_ref_129"],"sec-function-@@matcher":["_ref_130","_ref_131"],"sec-function-prototype-@@matcher":["_ref_132"],"sec-boolean-@@matcher":["_ref_133","_ref_134"],"sec-boolean-prototype-@@matcher":["_ref_135","_ref_136"],"sec-symbol-@@matcher":["_ref_137","_ref_138","_ref_139"],"sec-symbol-prototype-@@matcher":["_ref_140","_ref_141"],"error-@@matcher":["_ref_142","_ref_143","_ref_144"],"nativeerror-@@matcher":["_ref_145","_ref_146","_ref_147"],"aggregate-error-@@matcher":["_ref_148","_ref_149","_ref_150"],"sec-number-@@matcher":["_ref_151","_ref_152"],"sec-number-prototype-@@matcher":["_ref_153","_ref_154"],"sec-bigint-@@matcher":["_ref_155","_ref_156"],"sec-bigint-prototype-@@matcher":["_ref_157","_ref_158"],"date-@@matcher":["_ref_159","_ref_160","_ref_161"],"string-@@matcher":["_ref_162","_ref_163"],"sec-string-prototype-@@matcher":["_ref_164","_ref_165"],"regexp-@@matcher":["_ref_166","_ref_167"],"regexp-prototype-@@matcher":["_ref_168","_ref_169"],"array-@@matcher":["_ref_170","_ref_171"],"typedarray-@@matcher":["_ref_172","_ref_173","_ref_174","_ref_175","_ref_176"],"map-@@matcher":["_ref_177","_ref_178","_ref_179"],"set-@@matcher":["_ref_180","_ref_181","_ref_182"],"weakmap-@@matcher":["_ref_183","_ref_184","_ref_185"],"weakset-@@matcher":["_ref_186","_ref_187","_ref_188"],"arraybuffer-@@matcher":["_ref_189","_ref_190","_ref_191"],"sharedarraybuffer-@@matcher":["_ref_192","_ref_193","_ref_194","_ref_195"],"dataview-@@matcher":["_ref_196","_ref_197","_ref_198"],"weak-ref-@@matcher":["_ref_199","_ref_200","_ref_201"],"finalization-registry-@@matcher":["_ref_202","_ref_203","_ref_204"],"promise-@@matcher":["_ref_205","_ref_206"],"sec-match-expression-syntax":["_ref_207","_ref_208","_ref_209","_ref_210","_ref_211","_ref_212","_ref_213","_ref_214","_ref_215","_ref_216","_ref_217","_ref_218","_ref_219","_ref_220","_ref_221","_ref_222","_ref_223","_ref_224","_ref_225","_ref_226","_ref_227","_ref_228","_ref_229","_ref_230","_ref_231","_ref_232","_ref_233","_ref_234","_ref_235","_ref_236","_ref_237","_ref_238","_ref_239","_ref_240","_ref_241","_ref_242","_ref_243","_ref_244","_ref_245","_ref_246","_ref_247","_ref_248","_ref_249","_ref_250","_ref_251","_ref_252"],"sec-match-expression-early-errors":["_ref_253","_ref_254","_ref_255","_ref_256"],"sec-relational-operators":["_ref_330"]},"entries":[{"type":"table","id":"table-1","number":1,"caption":"Table 1: Well-known Symbols"},{"type":"term","term":"@@matcher","refId":"sec-well-known-symbols"},{"type":"clause","id":"sec-well-known-symbols","titleHTML":"Well-Known Symbols","number":"6.1.5.1","referencingIds":["_ref_94","_ref_107","_ref_112"]},{"type":"clause","id":"sec-ecmascript-language-types-symbol-type","titleHTML":"The Symbol Type","number":"6.1.5","referencingIds":["_ref_137"]},{"type":"clause","id":"sec-ecmascript-language-types","titleHTML":"ECMAScript Language Types","number":"6.1","referencingIds":["_ref_0","_ref_1","_ref_2","_ref_8","_ref_12","_ref_23","_ref_31","_ref_36","_ref_40","_ref_44","_ref_64","_ref_74","_ref_76","_ref_89","_ref_90","_ref_91","_ref_92","_ref_97","_ref_98","_ref_99","_ref_102","_ref_103","_ref_105","_ref_109","_ref_121","_ref_125"]},{"type":"op","aoid":"Type","refId":"sec-ecmascript-data-types-and-values"},{"type":"clause","id":"sec-ecmascript-data-types-and-values","titleHTML":"ECMAScript Data Types and Values","number":"6","referencingIds":["_ref_45","_ref_47","_ref_49","_ref_93","_ref_95","_ref_96","_ref_101","_ref_108","_ref_127","_ref_142","_ref_145","_ref_148","_ref_159","_ref_172","_ref_177","_ref_180","_ref_183","_ref_186","_ref_189","_ref_192","_ref_196","_ref_199","_ref_202"]},{"type":"op","aoid":"CreateMatchRecord","refId":"sec-create-match-record"},{"type":"clause","id":"sec-create-match-record","title":"CreateMatchRecord ( matched [ , value ] )","titleHTML":"CreateMatchRecord ( matched [ , value ] )","number":"7.1","referencingIds":["_ref_14","_ref_15","_ref_16","_ref_18","_ref_19","_ref_20","_ref_21","_ref_22","_ref_113","_ref_115","_ref_116","_ref_118","_ref_119"]},{"type":"op","aoid":"CreateMatchResultObject","refId":"sec-create-match-result"},{"type":"clause","id":"sec-create-match-result","title":"CreateMatchResultObject ( matched [ , value ] )","titleHTML":"CreateMatchResultObject ( matched [ , value ] )","number":"7.2","referencingIds":["_ref_3","_ref_4","_ref_5","_ref_128","_ref_129","_ref_130","_ref_133","_ref_134","_ref_135","_ref_136","_ref_138","_ref_139","_ref_140","_ref_141","_ref_143","_ref_146","_ref_149","_ref_151","_ref_152","_ref_153","_ref_154","_ref_155","_ref_156","_ref_157","_ref_158","_ref_160","_ref_162","_ref_163","_ref_164","_ref_165","_ref_166","_ref_168","_ref_169","_ref_170","_ref_173","_ref_174","_ref_175","_ref_178","_ref_181","_ref_184","_ref_187","_ref_190","_ref_193","_ref_194","_ref_197","_ref_200","_ref_203","_ref_205"]},{"type":"op","aoid":"MatchConstructorInstance","refId":"sec-match-constructor-instance"},{"type":"clause","id":"sec-match-constructor-instance","title":"MatchConstructorInstance ( value, target [ , intrinsicName ] )","titleHTML":"MatchConstructorInstance ( value, target [ , intrinsicName ] )","number":"7.3","referencingIds":["_ref_131","_ref_132","_ref_144","_ref_147","_ref_150","_ref_161","_ref_167","_ref_171","_ref_176","_ref_179","_ref_182","_ref_185","_ref_188","_ref_191","_ref_195","_ref_198","_ref_201","_ref_204","_ref_206"]},{"type":"clause","id":"sec-intrinsic-matcher","titleHTML":"Misc","number":"7"},{"type":"production","id":"prod-MatchExpression","name":"MatchExpression"},{"type":"production","id":"prod-MatchClauses","name":"MatchClauses","referencingIds":["_ref_207","_ref_209","_ref_254","_ref_257","_ref_258","_ref_259","_ref_262","_ref_264"]},{"type":"production","id":"prod-MatchClause","name":"MatchClause","referencingIds":["_ref_208","_ref_210","_ref_253","_ref_255","_ref_260","_ref_261","_ref_263","_ref_265"]},{"type":"production","id":"prod-MatchPattern","name":"MatchPattern","referencingIds":["_ref_211","_ref_212","_ref_220","_ref_223","_ref_224","_ref_226","_ref_228","_ref_237","_ref_238","_ref_239","_ref_240","_ref_241","_ref_245","_ref_246","_ref_251","_ref_252","_ref_266","_ref_267","_ref_268","_ref_269","_ref_278","_ref_279","_ref_280","_ref_281","_ref_282","_ref_283","_ref_284","_ref_285","_ref_286","_ref_287","_ref_288","_ref_289","_ref_290","_ref_291","_ref_317","_ref_318","_ref_319","_ref_320","_ref_321","_ref_328","_ref_329","_ref_330","_ref_331","_ref_332"]},{"type":"production","id":"prod-NearLiteralMatchPattern","name":"NearLiteralMatchPattern","referencingIds":["_ref_213","_ref_272","_ref_273"]},{"type":"production","id":"prod-MemberExpressionMatchPattern","name":"MemberExpressionMatchPattern","referencingIds":["_ref_214"]},{"type":"production","id":"prod-ExtractorMatchPattern","name":"ExtractorMatchPattern","referencingIds":["_ref_215"]},{"type":"production","id":"prod-ExtractorPatternList","name":"ExtractorPatternList","referencingIds":["_ref_221","_ref_222","_ref_225","_ref_227"]},{"type":"production","id":"prod-BindingIdentifierMatchPattern","name":"BindingIdentifierMatchPattern","referencingIds":["_ref_216","_ref_250"]},{"type":"production","id":"prod-ArrayMatchPattern","name":"ArrayMatchPattern","referencingIds":["_ref_217","_ref_276","_ref_277"]},{"type":"production","id":"prod-ObjectMatchPattern","name":"ObjectMatchPattern","referencingIds":["_ref_218","_ref_274","_ref_275"]},{"type":"production","id":"prod-CombinedMatchPattern","name":"CombinedMatchPattern","referencingIds":["_ref_219","_ref_256","_ref_270","_ref_271"]},{"type":"production","id":"prod-ArrayMatchPatternElementList","name":"ArrayMatchPatternElementList","referencingIds":["_ref_230","_ref_231","_ref_243","_ref_304","_ref_305","_ref_306","_ref_308","_ref_324","_ref_326"]},{"type":"production","id":"prod-ArrayMatchPatternElisionElement","name":"ArrayMatchPatternElisionElement","referencingIds":["_ref_242","_ref_244","_ref_322","_ref_323","_ref_325","_ref_327"]},{"type":"production","id":"prod-ArrayMatchPatternRestElement","name":"ArrayMatchPatternRestElement","referencingIds":["_ref_229","_ref_232","_ref_301","_ref_302","_ref_303","_ref_307","_ref_309","_ref_310"]},{"type":"production","id":"prod-ObjectMatchPatternPropertyList","name":"ObjectMatchPatternPropertyList","referencingIds":["_ref_234","_ref_235","_ref_248","_ref_294","_ref_295","_ref_296","_ref_298","_ref_313","_ref_315"]},{"type":"production","id":"prod-ObjectMatchPatternProperty","name":"ObjectMatchPatternProperty","referencingIds":["_ref_247","_ref_249","_ref_311","_ref_312","_ref_314","_ref_316"]},{"type":"production","id":"prod-MatchRestProperty","name":"MatchRestProperty","referencingIds":["_ref_233","_ref_236","_ref_292","_ref_293","_ref_297","_ref_299","_ref_300"]},{"type":"clause","id":"sec-match-expression-syntax","titleHTML":"Syntax","number":"13.5.1"},{"type":"clause","id":"sec-match-expression-early-errors","title":"Static Semantics: Early Errors","titleHTML":"Static Semantics: Early Errors","number":"13.5.2"},{"type":"clause","id":"sec-match-expression-runtime-semantics","title":"Runtime Semantics: Evaluation","titleHTML":"Runtime Semantics: Evaluation","number":"13.5.3"},{"type":"op","aoid":"MatchClausesEvaluation","refId":"sec-match-clauses-evaluation"},{"type":"clause","id":"sec-match-clauses-evaluation","titleHTML":"Runtime Semantics: MatchClausesEvaluation","number":"13.5.4","referencingIds":["_ref_6","_ref_10"]},{"type":"op","aoid":"MatchClauseEvaluation","refId":"sec-match-clause-evaluation"},{"type":"clause","id":"sec-match-clause-evaluation","titleHTML":"Runtime Semantics: MatchClauseEvaluation","number":"13.5.5","referencingIds":["_ref_9","_ref_11"]},{"type":"op","aoid":"MatchPatternMatches","refId":"sec-match-pattern-matches"},{"type":"clause","id":"sec-match-pattern-matches","titleHTML":"Runtime Semantics: MatchPatternMatches","number":"13.5.6","referencingIds":["_ref_13","_ref_17","_ref_30","_ref_32","_ref_33","_ref_34","_ref_35","_ref_39","_ref_42","_ref_73","_ref_79","_ref_85","_ref_126"]},{"type":"op","aoid":"CombinedMatchPatternMatches","refId":"sec-combined-match-pattern-matches"},{"type":"clause","id":"sec-combined-match-pattern-matches","titleHTML":"Runtime Semantics: CombinedMatchPatternMatches","number":"13.5.7","referencingIds":["_ref_24"]},{"type":"op","aoid":"InterpolationPatternMatches","refId":"sec-interpolation-pattern-matches"},{"type":"clause","id":"sec-interpolation-pattern-matches","titleHTML":"Runtime Semantics: InterpolationPatternMatches","number":"13.5.8","referencingIds":["_ref_25"]},{"type":"op","aoid":"NearLiteralMatchPatternMatches","refId":"sec-near-literal-match-pattern-matches"},{"type":"clause","id":"sec-near-literal-match-pattern-matches","titleHTML":"Runtime Semantics: NearLiteralMatchPatternMatches","number":"13.5.9","referencingIds":["_ref_27"]},{"type":"op","aoid":"DestructuringMatchPatternMatches","refId":"sec-destructuring-match-pattern-matches"},{"type":"clause","id":"sec-destructuring-match-pattern-matches","titleHTML":"Runtime Semantics: DestructuringMatchPatternMatches","number":"13.5.10","referencingIds":["_ref_28","_ref_29"]},{"type":"op","aoid":"ObjectMatchPatternPropertyEvaluation","refId":"sec-match-property-evaluation"},{"type":"clause","id":"sec-match-property-evaluation","titleHTML":"Runtime Semantics: ObjectMatchPatternPropertyEvaluation","number":"13.5.11","referencingIds":["_ref_48","_ref_50","_ref_65","_ref_66","_ref_67"]},{"type":"op","aoid":"MatchRestPropertyEvaluation","refId":"sec-match-rest-property-evaluation"},{"type":"clause","id":"sec-match-rest-property-evaluation","titleHTML":"Runtime Semantics: MatchRestPropertyEvaluation","number":"13.5.12","referencingIds":["_ref_46","_ref_51"]},{"type":"op","aoid":"MatchElementEvaluation","refId":"sec-match-element-evaluation"},{"type":"clause","id":"sec-match-element-evaluation","titleHTML":"Runtime Semantics: MatchElementEvaluation","number":"13.5.13","referencingIds":["_ref_53","_ref_54","_ref_57","_ref_60","_ref_61","_ref_62","_ref_80","_ref_81","_ref_82","_ref_83","_ref_87"]},{"type":"clause","id":"sec-match-record","title":"Match Records","titleHTML":"Match Records","number":"13.5.14"},{"type":"op","aoid":"InvokeCustomMatcher","refId":"sec-custom-matcher"},{"type":"clause","id":"sec-custom-matcher","title":"InvokeCustomMatcher ( val, matchable )","titleHTML":"InvokeCustomMatcher ( val, matchable )","number":"13.5.15","referencingIds":["_ref_37","_ref_38"]},{"type":"op","aoid":"RegularExpressionNamedCaptureGroupBindingInitialization","refId":"sec-regex-named-capture-group-binding"},{"type":"clause","id":"sec-regex-named-capture-group-binding","title":"RegularExpressionNamedCaptureGroupBindingInitialization ( regexMatchResult )","titleHTML":"RegularExpressionNamedCaptureGroupBindingInitialization ( regexMatchResult )","number":"13.5.16","referencingIds":["_ref_41","_ref_43"]},{"type":"op","aoid":"GetMatchCache","refId":"sec-get-match-cache"},{"type":"clause","id":"sec-get-match-cache","title":"GetMatchCache ( cacheGroup, object )","titleHTML":"GetMatchCache ( cacheGroup, object )","number":"13.5.17","referencingIds":["_ref_100","_ref_104","_ref_110","_ref_114","_ref_117","_ref_123"]},{"type":"op","aoid":"MatchCachedHasProperty","refId":"sec-match-cached-has-property"},{"type":"clause","id":"sec-match-cached-has-property","title":"MatchCachedHasProperty ( cacheGroup, object, propertyName )","titleHTML":"MatchCachedHasProperty ( cacheGroup, object, propertyName )","number":"13.5.18","referencingIds":["_ref_68","_ref_71"]},{"type":"op","aoid":"MatchCachedGet","refId":"sec-match-cached-get"},{"type":"clause","id":"sec-match-cached-get","title":"MatchCachedGet ( cacheGroup, object, propertyName )","titleHTML":"MatchCachedGet ( cacheGroup, object, propertyName )","number":"13.5.19","referencingIds":["_ref_69","_ref_72","_ref_106","_ref_111"]},{"type":"op","aoid":"MatchCachedIsIterable","refId":"sec-match-cached-is-iterable"},{"type":"clause","id":"sec-match-cached-is-iterable","title":"MatchCachedIsIterable ( cacheGroup, object )","titleHTML":"MatchCachedIsIterable ( cacheGroup, object )","number":"13.5.20","referencingIds":["_ref_52","_ref_56","_ref_59"]},{"type":"op","aoid":"MatchCachedGetIterator","refId":"sec-match-cached-get-iterator"},{"type":"clause","id":"sec-match-cached-get-iterator","title":"MatchCachedGetIterator ( cacheGroup, object )","titleHTML":"MatchCachedGetIterator ( cacheGroup, object )","number":"13.5.21","referencingIds":["_ref_77","_ref_122"]},{"type":"op","aoid":"MatchCachedIteratorStep","refId":"sec-match-cached-iterator-step"},{"type":"clause","id":"sec-match-cached-iterator-step","title":"MatchCachedIteratorStep ( cacheGroup, iterator )","titleHTML":"MatchCachedIteratorStep ( cacheGroup, iterator )","number":"13.5.22","referencingIds":["_ref_78","_ref_120"]},{"type":"op","aoid":"MatchCachedGetIteratorNthItem","refId":"sec-match-cached-get-iterator-nth-item"},{"type":"clause","id":"sec-match-cached-get-iterator-nth-item","title":"MatchCachedGetIteratorNthItem ( cacheGroup, iterator, n )","titleHTML":"MatchCachedGetIteratorNthItem ( cacheGroup, iterator, n )","number":"13.5.23","referencingIds":["_ref_84","_ref_86","_ref_88","_ref_124"]},{"type":"op","aoid":"MatchIteratorLengthMatch","refId":"sec-match-iterator-length-match"},{"type":"clause","id":"sec-match-iterator-length-match","title":"MatchIteratorLengthMatch ( cacheGroup, matchable, lastIndex )","titleHTML":"MatchIteratorLengthMatch ( cacheGroup, matchable, lastIndex )","number":"13.5.24","referencingIds":["_ref_55","_ref_58","_ref_63"]},{"type":"op","aoid":"CloseIterators","refId":"sec-close-iterators"},{"type":"clause","id":"sec-close-iterators","title":"CloseIterators ( iterators )","titleHTML":"CloseIterators ( iterators )","number":"13.5.25","referencingIds":["_ref_7"]},{"type":"op","aoid":"AddMatchBinding","refId":"sec-add-match-binding"},{"type":"clause","id":"sec-add-match-binding","title":"AddMatchBinding ( name, value )","titleHTML":"AddMatchBinding ( name, value )","number":"13.5.26","referencingIds":["_ref_26","_ref_70","_ref_75"]},{"type":"clause","id":"sec-match-expression","title":"Match Expression","titleHTML":"Match Expression","number":"13.5"},{"type":"clause","id":"sec-relational-operators-runtime-semantics-evaluation","titleHTML":"Runtime Semantics: Evaluation","number":"13.10.1"},{"type":"clause","id":"sec-relational-operators","titleHTML":"Relational Operators","number":"13.10"},{"type":"clause","id":"sec-ecmascript-language-expressions","titleHTML":"ECMAScript Language: Expressions","number":"13"},{"type":"clause","id":"sec-object-@@matcher","title":"Object [ @@matcher ] ( value )","titleHTML":"Object [ @@matcher ] ( value )","number":"20.1.2.23"},{"type":"clause","id":"sec-properties-of-the-object-constructor","titleHTML":"Properties of the Object Constructor","number":"20.1.2"},{"type":"clause","id":"sec-object-objects","titleHTML":"Object Objects","number":"20.1"},{"type":"clause","id":"sec-function-@@matcher","title":"Function [ @@matcher ] ( value )","titleHTML":"Function [ @@matcher ] ( value )","number":"20.2.2.3"},{"type":"clause","id":"sec-properties-of-the-function-constructor","titleHTML":"Properties of the Function Constructor","number":"20.2.2"},{"type":"clause","id":"sec-function-prototype-@@matcher","title":"Function.prototype [ @@matcher ] ( value )","titleHTML":"Function.prototype [ @@matcher ] ( value )","number":"20.2.3.7"},{"type":"clause","id":"sec-properties-of-the-function-prototype-object","titleHTML":"Properties of the Function Prototype Object","number":"20.2.3"},{"type":"clause","id":"sec-function-objects","titleHTML":"Function Objects","number":"20.2"},{"type":"clause","id":"sec-boolean-@@matcher","title":"Boolean [ @@matcher ] ( value )","titleHTML":"Boolean [ @@matcher ] ( value )","number":"20.3.2.2"},{"type":"clause","id":"sec-properties-of-the-boolean-constructor","titleHTML":"Properties of the Boolean Constructor","number":"20.3.2"},{"type":"clause","id":"sec-boolean-prototype-@@matcher","title":"Boolean.prototype [ @@matcher ] ( value )","titleHTML":"Boolean.prototype [ @@matcher ] ( value )","number":"20.3.3.4"},{"type":"clause","id":"sec-properties-of-the-boolean-prototype-object","titleHTML":"Properties of the Boolean Prototype Object","number":"20.3.3"},{"type":"clause","id":"sec-boolean-objects","titleHTML":"Boolean Objects","number":"20.3"},{"type":"clause","id":"sec-symbol-@@matcher","title":"Symbol [ @@matcher ] ( value )","titleHTML":"Symbol [ @@matcher ] ( value )","number":"20.4.2.17"},{"type":"clause","id":"sec-properties-of-the-symbol-constructor","titleHTML":"Properties of the Symbol Constructor","number":"20.4.2"},{"type":"clause","id":"sec-symbol-prototype-@@matcher","title":"Symbol.prototype [ @@matcher ] ( value )","titleHTML":"Symbol.prototype [ @@matcher ] ( value )","number":"20.4.3.5"},{"type":"clause","id":"sec-properties-of-the-symbol-prototype-object","titleHTML":"Properties of the Symbol Prototype Object","number":"20.4.3"},{"type":"clause","id":"sec-symbol-objects","titleHTML":"Symbol Objects","number":"20.4"},{"type":"clause","id":"error-@@matcher","title":"Error [ @@matcher ] ( value )","titleHTML":"Error [ @@matcher ] ( value )","number":"20.5.2.2"},{"type":"clause","id":"sec-properties-of-the-error-constructor","titleHTML":"Properties of the Error Constructor","number":"20.5.2"},{"type":"clause","id":"nativeerror-@@matcher","title":"NativeError [ @@matcher ] ( value )","titleHTML":"NativeError [ @@matcher ] ( value )","number":"20.5.6.2.2"},{"type":"clause","id":"sec-properties-of-the-nativeerror-constructors","title":"Properties of the NativeError Constructors","titleHTML":"Properties of the NativeError Constructors","number":"20.5.6.2"},{"type":"clause","id":"sec-nativeerror-object-structure","title":"NativeError Object Structure","titleHTML":"NativeError Object Structure","number":"20.5.6"},{"type":"clause","id":"sec-aggregate-error","title":"AggregateError ( errors, message [ , options ] )","titleHTML":"AggregateError ( errors, message [ , options ] )","number":"20.5.7.1.1"},{"type":"clause","id":"sec-aggregate-error-constructor","titleHTML":"The AggregateError Constructor","number":"20.5.7.1"},{"type":"clause","id":"aggregate-error-@@matcher","title":"AggregateError [ @@matcher ] ( value )","titleHTML":"AggregateError [ @@matcher ] ( value )","number":"20.5.7.2.2"},{"type":"clause","id":"sec-properties-of-the-aggregate-error-constructor","titleHTML":"Properties of the AggregateError Constructor","number":"20.5.7.2"},{"type":"clause","id":"sec-aggregate-error-objects","titleHTML":"AggregateError Objects","number":"20.5.7"},{"type":"clause","id":"sec-error-objects","titleHTML":"Error Objects","number":"20.5"},{"type":"clause","id":"sec-fundamental-objects","titleHTML":"Fundamental Objects","number":"20"},{"type":"clause","id":"sec-number-@@matcher","title":"Number [ @@matcher ] ( value )","titleHTML":"Number [ @@matcher ] ( value )","number":"21.1.2.16"},{"type":"clause","id":"sec-properties-of-the-number-constructor","titleHTML":"Properties of the Number Constructor","number":"21.1.2"},{"type":"clause","id":"sec-number-prototype-@@matcher","title":"Number.prototype [ @@matcher ] ( value )","titleHTML":"Number.prototype [ @@matcher ] ( value )","number":"21.1.3.8"},{"type":"clause","id":"sec-properties-of-the-number-prototype-object","titleHTML":"Properties of the Number Prototype Object","number":"21.1.3"},{"type":"clause","id":"sec-number-objects","titleHTML":"Number Objects","number":"21.1"},{"type":"clause","id":"sec-bigint-@@matcher","title":"BigInt [ @@matcher ] ( value )","titleHTML":"BigInt [ @@matcher ] ( value )","number":"21.2.2.4"},{"type":"clause","id":"sec-properties-of-the-bigint-constructor","titleHTML":"Properties of the BigInt Constructor","number":"21.2.2"},{"type":"clause","id":"sec-bigint-prototype-@@matcher","title":"BigInt.prototype [ @@matcher ] ( value )","titleHTML":"BigInt.prototype [ @@matcher ] ( value )","number":"21.2.3.6"},{"type":"clause","id":"sec-properties-of-the-bigint-prototype-object","titleHTML":"Properties of the BigInt Prototype Object","number":"21.2.3"},{"type":"clause","id":"sec-bigint-objects","titleHTML":"BigInt Objects","number":"21.2"},{"type":"clause","id":"date-@@matcher","title":"Date [ @@matcher ] ( value )","titleHTML":"Date [ @@matcher ] ( value )","number":"21.4.3.5"},{"type":"clause","id":"sec-properties-of-the-date-constructor","titleHTML":"Properties of the Date Constructor","number":"21.4.3"},{"type":"clause","id":"sec-date-objects","titleHTML":"Date Objects","number":"21.4"},{"type":"clause","id":"sec-numbers-and-dates","titleHTML":"Numbers and Dates","number":"21"},{"type":"clause","id":"string-@@matcher","title":"String [ @@matcher ] ( value )","titleHTML":"String [ @@matcher ] ( value )","number":"22.1.2.5"},{"type":"clause","id":"sec-properties-of-the-string-constructor","titleHTML":"Properties of the String Constructor","number":"22.1.2"},{"type":"clause","id":"sec-string-prototype-@@matcher","title":"String.prototype [ @@matcher ] ( value )","titleHTML":"String.prototype [ @@matcher ] ( value )","number":"22.1.3.35"},{"type":"clause","id":"sec-properties-of-the-string-prototype-object","titleHTML":"Properties of the String Prototype Object","number":"22.1.3"},{"type":"clause","id":"sec-string-objects","titleHTML":"String Objects","number":"22.1"},{"type":"clause","id":"regexp-@@matcher","title":"RegExp [ @@matcher ] ( value )","titleHTML":"RegExp [ @@matcher ] ( value )","number":"22.2.4.1"},{"type":"clause","id":"sec-properties-of-the-regexp-constructor","titleHTML":"Properties of the RegExp Constructor","number":"22.2.4"},{"type":"clause","id":"regexp-prototype-@@matcher","title":"RegExp.prototype [ @@matcher ] ( value )","titleHTML":"RegExp.prototype [ @@matcher ] ( value )","number":"22.2.5.10"},{"type":"clause","id":"sec-properties-of-the-regexp-prototype-object","titleHTML":"Properties of the RegExp Prototype Object","number":"22.2.5"},{"type":"clause","id":"sec-regexp-regular-expression-objects","titleHTML":"RegExp (Regular Expression) Objects","number":"22.2"},{"type":"clause","id":"sec-text-processing","titleHTML":"Text Processing","number":"22"},{"type":"clause","id":"array-@@matcher","title":"Array [ @@matcher ] ( value )","titleHTML":"Array [ @@matcher ] ( value )","number":"23.1.1.6"},{"type":"clause","id":"sec-properties-of-the-array-constructor","titleHTML":"Properties of the Array Constructor","number":"23.1.1"},{"type":"clause","id":"sec-array-objects","titleHTML":"Array Objects","number":"23.1"},{"type":"clause","id":"typedarray-@@matcher","title":"TypedArray [ @@matcher ] ( value )","titleHTML":"TypedArray [ @@matcher ] ( value )","number":"23.2.6.3"},{"type":"clause","id":"sec-properties-of-the-typedarray-constructors","title":"Properties of the TypedArray Constructors","titleHTML":"Properties of the TypedArray Constructors","number":"23.2.6"},{"type":"clause","id":"sec-typedarray-objects","titleHTML":"TypedArray Objects","number":"23.2"},{"type":"clause","id":"sec-indexed-collections","titleHTML":"Indexed Collections","number":"23"},{"type":"clause","id":"map-@@matcher","title":"Map [ @@matcher ] ( value )","titleHTML":"Map [ @@matcher ] ( value )","number":"24.1.2.3"},{"type":"clause","id":"sec-properties-of-the-map-constructor","titleHTML":"Properties of the Map Constructor","number":"24.1.2"},{"type":"clause","id":"sec-map-objects","titleHTML":"Map Objects","number":"24.1"},{"type":"clause","id":"set-@@matcher","title":"Set [ @@matcher ] ( value )","titleHTML":"Set [ @@matcher ] ( value )","number":"24.2.2.3"},{"type":"clause","id":"sec-properties-of-the-set-constructor","titleHTML":"Properties of the Set Constructor","number":"24.2.2"},{"type":"clause","id":"sec-set-objects","titleHTML":"Set Objects","number":"24.2"},{"type":"clause","id":"weakmap-@@matcher","title":"WeakMap [ @@matcher ] ( value )","titleHTML":"WeakMap [ @@matcher ] ( value )","number":"24.3.2.2"},{"type":"clause","id":"sec-properties-of-the-weakmap-constructor","titleHTML":"Properties of the WeakMap Constructor","number":"24.3.2"},{"type":"clause","id":"sec-weakmap-objects","titleHTML":"WeakMap Objects","number":"24.3"},{"type":"clause","id":"weakset-@@matcher","title":"WeakSet [ @@matcher ] ( value )","titleHTML":"WeakSet [ @@matcher ] ( value )","number":"24.4.2.2"},{"type":"clause","id":"sec-properties-of-the-weakset-constructor","titleHTML":"Properties of the WeakSet Constructor","number":"24.4.2"},{"type":"clause","id":"sec-weakset-objects","titleHTML":"WeakSet Objects","number":"24.4"},{"type":"clause","id":"sec-keyed-collections","titleHTML":"Keyed Collections","number":"24"},{"type":"clause","id":"arraybuffer-@@matcher","title":"ArrayBuffer [ @@matcher ] ( value )","titleHTML":"ArrayBuffer [ @@matcher ] ( value )","number":"25.1.4.4"},{"type":"clause","id":"sec-properties-of-the-arraybuffer-constructor","titleHTML":"Properties of the ArrayBuffer Constructor","number":"25.1.4"},{"type":"clause","id":"sec-arraybuffer-objects","titleHTML":"ArrayBuffer Objects","number":"25.1"},{"type":"clause","id":"sharedarraybuffer-@@matcher","title":"SharedArrayBuffer [ @@matcher ] ( value )","titleHTML":"SharedArrayBuffer [ @@matcher ] ( value )","number":"25.2.3.3"},{"type":"clause","id":"sec-properties-of-the-sharedarraybuffer-constructor","titleHTML":"Properties of the SharedArrayBuffer Constructor","number":"25.2.3"},{"type":"clause","id":"sec-sharedarraybuffer-objects","titleHTML":"SharedArrayBuffer Objects","number":"25.2"},{"type":"clause","id":"dataview-@@matcher","title":"DataView [ @@matcher ] ( value )","titleHTML":"DataView [ @@matcher ] ( value )","number":"25.3.3.2"},{"type":"clause","id":"sec-properties-of-the-dataview-constructor","titleHTML":"Properties of the DataView Constructor","number":"25.3.3"},{"type":"clause","id":"sec-dataview-objects","titleHTML":"DataView Objects","number":"25.3"},{"type":"clause","id":"sec-structured-data","titleHTML":"Structured Data","number":"25"},{"type":"clause","id":"weak-ref-@@matcher","title":"WeakRef [ @@matcher ] ( value )","titleHTML":"WeakRef [ @@matcher ] ( value )","number":"26.1.2.2"},{"type":"clause","id":"sec-properties-of-the-weak-ref-constructor","titleHTML":"Properties of the WeakRef Constructor","number":"26.1.2"},{"type":"clause","id":"sec-weak-ref-objects","titleHTML":"WeakRef Objects","number":"26.1"},{"type":"clause","id":"finalization-registry-@@matcher","title":"FinalizationRegistry [ @@matcher ] ( value )","titleHTML":"FinalizationRegistry [ @@matcher ] ( value )","number":"26.2.2.2"},{"type":"clause","id":"sec-properties-of-the-finalization-registry-constructor","titleHTML":"Properties of the FinalizationRegistry Constructor","number":"26.2.2"},{"type":"clause","id":"sec-finalization-registry-objects","titleHTML":"FinalizationRegistry Objects","number":"26.2"},{"type":"clause","id":"sec-managing-memory","titleHTML":"Managing Memory","number":"26"},{"type":"clause","id":"promise-@@matcher","title":"Promise [ @@matcher ] ( value )","titleHTML":"Promise [ @@matcher ] ( value )","number":"27.2.4.9"},{"type":"clause","id":"sec-properties-of-the-promise-constructor","titleHTML":"Properties of the Promise Constructor","number":"27.2.4"},{"type":"clause","id":"sec-promise-objects","titleHTML":"Promise Objects","number":"27.2"},{"type":"clause","id":"sec-control-abstraction-objects","titleHTML":"Control Abstraction Objects","number":"27"},{"type":"clause","id":"todo-constructors","titleHTML":"Confirm we do not want matchers for these constructors","number":"1000.1"},{"type":"clause","id":"todo-object-instances","titleHTML":"Should we add builtin matchers on the prototype for relevant class instances, so they do something useful?","number":"1000.2"},{"type":"clause","id":"sec-todo","titleHTML":"TODO","number":"1000"},{"type":"clause","id":"sec-copyright-and-software-license","title":"Copyright & Software License","titleHTML":"Copyright & Software License","number":"A"}]}`); ;let usesMultipage = false + +

Work in progress. Before continuing, please read the Editor's notes.

+ + +

1 Editor's notes

+ +

1.1 Layering

+

The pattern-matching champion group designed this proposal with a layering approach. It does not mean the proposal is an MVP. The champion group wishes to ship the proposal as a whole when possible, but we can drop some features if there is strong pushback from the committee.

+

This approach allows the champion group to consider how all features combine and also how the proposal should behave if any of the features are missing.

+

A feature will have a note if

+
    +
  • it is a convenient feature instead of a necessary feature.
  • +
  • not all champion group members represent the hope to include it.
  • +
+
+ +

1.2 Code example

+

The code example in the patterns section will be in one of the forms:

+
value is <pattern>;
+when <pattern>: ...,
+

The first form is an expression that can be used in any expression position.

+
const isOk = response is { ok: true, status: > 100 and < 400 };
+

The second form is a clause of the match expression that is only available inside a match expression.

+
const type = match(expr) {
+  { ok: true, status: > 100 and < 400 }: "ok",
+  { ok: false, status: 404 }: "not found",
+  default: "unknown",
+};
+

The "when" keyword was removed, but for the readability of code examples, "when" is kept.

+

This document prefers the is form unless the declaration pattern (let x) appears.

+
+

A Copyright & Software License

Copyright Notice

@@ -2929,4 +2972,5 @@

Software License

THIS SOFTWARE IS PROVIDED BY THE ECMA INTERNATIONAL "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ECMA INTERNATIONAL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

-
\ No newline at end of file + + \ No newline at end of file diff --git a/spec.emu b/spec.emu index 82779ec..a64e0c2 100644 --- a/spec.emu +++ b/spec.emu @@ -14,3 +14,53 @@ contributors: - Ross Kirsling - Tab Atkins + + +

Work in progress. Before continuing, please read the .

+ + +

Editor's notes

+ +

Layering

+

The pattern-matching champion group designed this proposal with a layering approach. It does not mean the proposal is an MVP. The champion group wishes to ship the proposal as a whole when possible, but we can drop some features if there is strong pushback from the committee.

+

This approach allows the champion group to consider how all features combine and also how the proposal should behave if any of the features are missing.

+

A feature will have a note if

+
    +
  • it is a convenient feature instead of a necessary feature.
  • +
  • not all champion group members represent the hope to include it.
  • +
+
+ +

Code example

+

The code example in the patterns section will be in one of the forms:

+

+      value is <pattern>;
+      when <pattern>: ...,
+    
+

The first form is an expression that can be used in any expression position.

+

+      const isOk = response is { ok: true, status: > 100 and < 400 };
+    
+

The second form is a clause of the match expression that is only available inside a match expression.

+

+      const type = match(expr) {
+        { ok: true, status: > 100 and < 400 }: "ok",
+        { ok: false, status: 404 }: "not found",
+        default: "unknown",
+      };
+    
+

The "when" keyword was removed, but for the readability of code examples, "when" is kept.

+

This document prefers the `is` form unless the declaration pattern (`let x`) appears.

+
+
From 2f25d73a44e1d839e71f33246a6765754dee833c Mon Sep 17 00:00:00 2001 From: Jack Works Date: Sun, 29 Oct 2023 12:35:34 +0800 Subject: [PATCH 09/71] ecmarkup: use --assets-dir flag --- assets/IBMPlexMono-Bold-SlashedZero.woff2 | Bin 0 -> 10548 bytes .../IBMPlexMono-BoldItalic-SlashedZero.woff2 | Bin 0 -> 11932 bytes assets/IBMPlexMono-Italic-SlashedZero.woff2 | Bin 0 -> 11948 bytes assets/IBMPlexMono-Regular-SlashedZero.woff2 | Bin 0 -> 10396 bytes assets/IBMPlexSans-Bold-SlashedZero.woff2 | Bin 0 -> 14828 bytes .../IBMPlexSans-BoldItalic-SlashedZero.woff2 | Bin 0 -> 16228 bytes assets/IBMPlexSans-Italic-SlashedZero.woff2 | Bin 0 -> 16156 bytes assets/IBMPlexSans-Regular-SlashedZero.woff2 | Bin 0 -> 14620 bytes assets/IBMPlexSerif-Bold-SlashedZero.woff2 | Bin 0 -> 15736 bytes .../IBMPlexSerif-BoldItalic-SlashedZero.woff2 | Bin 0 -> 17188 bytes assets/IBMPlexSerif-Italic-SlashedZero.woff2 | Bin 0 -> 16808 bytes assets/IBMPlexSerif-Regular-SlashedZero.woff2 | Bin 0 -> 15596 bytes assets/ecmarkup.css | 1369 ++++++++ assets/ecmarkup.js | 1529 +++++++++ index.html | 2903 +---------------- package.json | 2 +- 16 files changed, 2902 insertions(+), 2901 deletions(-) create mode 100644 assets/IBMPlexMono-Bold-SlashedZero.woff2 create mode 100644 assets/IBMPlexMono-BoldItalic-SlashedZero.woff2 create mode 100644 assets/IBMPlexMono-Italic-SlashedZero.woff2 create mode 100644 assets/IBMPlexMono-Regular-SlashedZero.woff2 create mode 100644 assets/IBMPlexSans-Bold-SlashedZero.woff2 create mode 100644 assets/IBMPlexSans-BoldItalic-SlashedZero.woff2 create mode 100644 assets/IBMPlexSans-Italic-SlashedZero.woff2 create mode 100644 assets/IBMPlexSans-Regular-SlashedZero.woff2 create mode 100644 assets/IBMPlexSerif-Bold-SlashedZero.woff2 create mode 100644 assets/IBMPlexSerif-BoldItalic-SlashedZero.woff2 create mode 100644 assets/IBMPlexSerif-Italic-SlashedZero.woff2 create mode 100644 assets/IBMPlexSerif-Regular-SlashedZero.woff2 create mode 100644 assets/ecmarkup.css create mode 100644 assets/ecmarkup.js diff --git a/assets/IBMPlexMono-Bold-SlashedZero.woff2 b/assets/IBMPlexMono-Bold-SlashedZero.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..de464a690845792b076ecd1dcc57c4efcbaddb70 GIT binary patch literal 10548 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 COh9%3 literal 0 HcmV?d00001 diff --git a/assets/IBMPlexMono-BoldItalic-SlashedZero.woff2 b/assets/IBMPlexMono-BoldItalic-SlashedZero.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..1697592ff25efa8a05abf02058bad708c3394efd GIT binary patch literal 11932 zcmV;NE@RPmPew8T0RR9104|&W4gdfE0Bpzr04_oR0RR9100000000000000000000 z0000QbQ_6Q9EN5FU;uT|}ZzN1|gqA+y{ehobZ=H;d!Cx}Q zijC+c0~Rc(5=KsRhwx^zG-Z$GyjxT$O>%H!N$YmSZeb`3KB?_qfF1LmUFpZ#Syt)+^acScfi? z>T+GK=q9WKz@}QwpOtrKy;iig9BbFI6UiZmSjoL73dsTH>W&pTKzIbu0hWYSb8Sgn zUQsq&4Wy%E%*J{j6Mq){`DTug(m9LGS?B1lmA@zHi@4$4!Mkdz(Q*Ck^3Kdo(<{+MzJDkIX|*IpuOt zxd4?xy%rt%44Y%2WhSk&#V-3C@s<-#x!{_c?)$`7p8DCJ{tp&KMlt0ZrBszV6HV8m zQ;$K*tg*qcUG_T*RB+aXeK5t;a{>`vQUfq_)lao>;DG`y5;NTa4Ya2i<%7KaSMxvF z;?kV+N|#abr>6^p6NbY*2t+zcLu)>@A8Qp5Gn7l-LnD$i0Z5XCIniPycZfa=LKLf} zm{x0@ub-%gntVv2i;vcAj8Px(8a`Bs!n*XEWu9@%t+K&3uR7p0?|9dl$(h~u&}Y+o zJol@=1E?m7ief7;TDfWsCY!0vJPRzc!f7_yW{-o8y1*sA>>4+LN>7e~O1ol)FDIBs zhwlgDHs`u$9Gd)eMZNEo&+j$$GnfFjMGqRQ!YHNYp298QB$W1OB@ohpk06EksiPW; z&Izjl@&XOn6ou7W-545ey%HdE5OO|IB=4ChE^cBzC1RAR7Q3cFiw->oC9Gp^8KGfZ zaviK~z^_SYNRnl;)jXv@kqXl^Y13oy_aB7<=z7@kV-41ACoZ#&SEZzLM+MasCpH5+ zMB+Ym+}^jn3y^k4XFI5V@J0aW&dzA>fy8ZLJxB+Widq{|V+8{$z4-tHOacgvM422= z08lbnjV_LzhBrm)UX6 zrOGD30f0#L@H6yqz6&~e&rzboZNMqk^_)g?B(T$NXx!rEDRmm<^wSkD%l`~Kwl_RZ zlt!yyl2S8DXX6r7p38X+tQ0!4{=?f-u4+@&tZ_P3Q^i2wS8l4agBeU_@ZF zMZlBxKN=sNwApApcyfkCw(^iPD7lP^7v}lJ@^PN=i!FS-|-@- z?SQl!i~9dBzy`(n0O|<Cma5~*aRl=tEV46KN4)?kiX?-vf^AVwt3Iw56WdzRn!`A%(O z-GB6d0091b4?cPQbJx#}KifV@dSU?p04j=uRVcb=U4}J}hr3YmqDwA&uei!+_nPZI z^08O(hMR6RyX}sx?E9ryOJ`RL=@cW&IA@_{G69z6ztp&xf) z!M*t}Em`sM#PZc^VAadb8&93T*bQ*u3IG5K1`!z(uDoyt0H^@~0KE#J<^ldg0P&v$ zU>^YJ??7kC=sIs;)@fm19T_S*!Z1bx9W+42P!V88S1*b~2Ss~A8Fifm51|f0qZGGi zMWQ^yqA#MJM%h3`1nGjvMwG-Fjhz@35xX+2n?qEna-uT8QfSwSEJ{Thvd9_HHx)H> zSiz9K#@}EfAI$y07bTiH8CxOeGB$2*LRq+XGBjyO)PS@kBns=e6+*H}GBC{XoY|(n zWkr^>AUq8lF~D(1Vaa+ow4%L=c1>-l9l&CUT}QOSn?)D(PW|-9lEd8Y@FXho}a0;gj8jC*+`5C(}~!Tq`EX{N}^m=KiQ~Q~<$%2y*Y^>Oe*4 z97CvKOPWcgfFihM#BMtSd5%VK)d}GS6~8$Ga9Z(1;&1@ug{DLDpMeLjYM*|Ao|u_| z?>o0}Ssk5Fy~c7Y+?7F+BB80Y3cRWpuy@A>>LXLjnjq(Lt_`)?DOZ ziIN0av0(^^w!e)%0`3lP`Z~ zX>K&Ki^o?_iOX2p;Gx+EIa2FQkEOSM|!5&iexGJN>$jNfxx2OplvLJ+=t@ zCS-@)98eoN5wMK_A!q#<7XZiI2tS$%95qus8j-aXmY3zWjEuGxGYf*dP`Cmr-UOzs z{anavjl{b%{(azjTt%)LUvlFh+0&84a}-yYNML9fu~c85h3?i=zKWnd-oI|q!>cJe zB}i}++AvFNZXT}x`GpO_oh=xFEP2TDp0xv7k>hw!RCFwG1zM#TG2E`+=F|M zttkw;S^Ks*qb*yPpnvHpZnl`Pxeo2zAlaE9aXeOa`3pB#U_GuuN`p_8;4MF><;B*? zndR2zp9%1!?`4Bz8S@q>&wy##~Ib zM9E%jtMjK}r?gn;!zN+PjVZ^H*Qu;qTHo3Z#z1{8MlT`h5isZKf)~73{x~4;`Om$Op_0W9e5J1uL zqvD(Zr)Q*=$#{n2)&ARniC9K7*f91x1IZNQZ}pq%>xh~Qi;;Mj>JU7Zqg0*nI~V@& zqjJVKBt&il>EweOqgMUexy%E`nz-hhkWHIax8EP%SE)Y*w&N9d6-ZIXZcD8I{~2=Q z-N*v=>SHK{j1E`u-}Rt zd(wKKW*};8S^NEv$Dr&T`MyItFp=2)Zc(fxzqP6bmdH~-*AqQnCya!#Hmv+}DNL+H zc}^o0!gYlQmc!8;(dJ3k&Rgr7O5f|HB8FsB(>}iu>_Q5S7o#r!p;}Om&H`TzamFT_ z(r?!~wxcYD679pYkk<=zGi&k@pGJpl(nwyy-ITw;eAYmo zLVvA7Pj~$HXeq>=(Z&Ki=vxsi!pga|N1|Su6~?+)6&9y|ks2t! zY_%aJ2~Wj_9q4>|who|!8{+H;axqGC08XO;Y97n7w?X>46TDq~Ag0Ng>E>IwngElHL5etwXNsR)Exi ziiHK9pCBLH5&r(1?=>87PQrb*2g%EWMyf^5#j1wIEK7+JuIdDO`V)SVo!%BJqn{;@ z^r~f>Zz_P;{ipJ~1<7+loivcE#Cfk+pe`z82gf}Ih#PEKT-d1#cd)ccr->^%!u=fW zjZ|-GvDN1N&JGf93wQNt_{BwG^KYnrRz{4L?q9MHrK_@*J}S=lZ+D@W2P zD@Ti5{ir3&mf2(6pzGL{B8f#I?*#12biS5cGASMdHmWB4N}ucjxI+kxT%{tJu2x;N zb75MHDj)eC%1Vg2=9*;5*!a|J^DS|2wF~P;Q6Z|rll6RJyCA~4usV&&%rMe{oJsCA zt<0iZeJ-p45ESr$U)#2XnRVC+!3TXDveV+YkloJ-?YGv;y9!7OZI&{$pM?Tk{*)Mn znzt&LtN9Tr_Zr|EL;d09Zv9>*m*UHy;n@=~2#(@nblbJgP2?A<#*D7xni&e2{?EN7 z>A_HYUNZVH+5t_$QseEfc~`yEW@9GHdbkOP$Jxe+LHaP>U_VR5J3P%|wX9v1Z*SJz zZBODR%3EZ}+9nHJCAN8ZSWjLCSiR)Wn?=dZ-Wj~`wfj0|;kurs>B~^#lJOyppsvYS z)5%XIHRIs9NHdz*$d)eF3s0Vx59-JNOwseuJ_1$i1A4|Im^A z=yl%RtM?#D`otnnm<@`~bU%x{RrB$mM67tyB9D~*B?;eH9eZn3?XiJtx^IMZC`Gx? zpP$lL9#ZK`1Wm{Xj8NhtOIuDV3ZbT^60hz+>ZZJd6MD+yG7I&HZ^!*zMSH`OKEPiQ zyR)-&AblV<{GU$?kFQyj^d^`+^D-YNF}A&$o8!0z=o_~3_ZY`wyL)v*|4mbfQdxqZ zPN{#=3e(f4S?JATh*ZkN=M|Y=@^9ov4UWSN{>P!X!IU_r_n=3rjTj&X+*c1LFlSaC zTlD-@>vruT$G{GEyYf*X2dpaHy3f}^jg?k^Y0a#wN~k8()vUVY=2}@-vnb7KOG=9y zFgN-5fZw4UX2Y}H)fb;zS`oE4N-FDWT}SMQJoC0&p=St2eidh?&O&&SHSHEr1@APq zo3#>i1B7lPQ~~w%kl*14>d)q%)}`%|OSS)4{?{)M;@QbQq0wwS4z!)>U`?MJT{(U3 zXw-J9_xV)skvWDf?Ph|H@K$0dX?=O+v>Zig%*mu}y7@Ju1D!->Qx~gE=+#ZDEXN-_ zA9e7Ci(eVcO^69REK{yddBM($XlTBQ81|A3i>C{4IMoEcuSVGz*J^|0%{bQH(-gXUbix0E@+#c?;F%0*^A% zw|t~Ty3;+{?T^JcQjeTO8U+iET-UC%x*SWlKiK{TL;i{ z29A4glJ-oMy3RlNrq;Sze&+%F%3JjBF~YaMu`(=`7_&Prvh({;&+G)Q!D7`1gr@ev zaG5qbH`Nj_%U4f#fZ~;`#V!GvAmORiE;%(&*^>Iu#n2@N`TPG>=9E-;nAjnEzBxf2 z%*||-1xdSWdJ8A&Hvurz|aMepX$1T}9goj14U=hsFb0Z^}hV_<^mS}NP;6#5uImEYmnu1bX2;{o-%s` zz97?;7AN!Pn!`$Kck=r!Vk%KaFkCODF)?9gi-d-Jp@jjydljs#H+1Soj=DE^kh#og z6K8oQr^n}}mmw#kOW3ctx$*v|{KYrEh*)mhM4)fx%>!R6r}rVJ7xiVVE;!cM!xqM- z51jEY_=|6T1!un%tS!QnYsUmEwDeP{vii5~#Ou4KyaHomPpCwPxE6V2uTY%f-&Qa` zIahWKEbLvrOiykaq2}smxvRoSuH=BYSm@SL1meu;-LwE!g^5km`CJ+NkUIZ@LV4eT z4Ms(fG7cxoUL`3)R1bF~If~`aDGCm!on&?`8BX!gic-2o2y51C90TZB6THmabH=e} zqjBn*d+M}`)J|9iYp0%7)|Tc^zAVFr)2*oqi0^J$bPD}hvvHy&MIgh=MzlfXTsSVN zW>yN8O_1(WSz_J;31w#AvXLh3?!tk7t1G=oJR{1jSso==>_tS`);d}tt4(4TBt1wG z^t`BbqY72sXcN3Nb+vzZ{z!BD&Z6#-jKJq#_SxMYnx8u&kMgHC_4Ph28)YnF?6iwn@g zwCq}%pV=s}aFebXk}|BbX3u1{{GZi3AC}4AFvwT+POZ|3-Z)9TBS2W~YkiN_GUF6> z9Gp|ZA7r;4wT9bJrAs13=?0a)JFELU&JZAxfr^-SjhC08CU%a`-+l;_v|;`(Fxj43 zvo3F)r;=mOklt;|X(9>En3Cu8P3_e`C5=4Y!;a>_(;H;(jkyKculcbO;8V<%vJAVZ zE~{Mn$_geN`4WQz=JaY>F=wDqo;YP7J_kY3H}$X1Df~%bS7l0TEY?a{+JO2+;y{6k zH_MBq5v3k&0j$2F+(D>XTE#3L3)^{vDiBVj4wjXCm=yS>sL<{BwN&@%*%hg!X1zIi zjefj~tE3GV|Rn=ctEA?rw8f4SfI~Z=J zqsp2nFU-jZ#bmpOOpm6ObvmTllz=+g_q~-lAzzj(FUvJIOJSe6*1YPKdWkcn`nm%4 zRNk8|8AX|^ldKxM705rf(z%zCgS2MmPLsK_i-ZWz5iczB+1J22+tikb8sZg__sXK0 z9dT1Y&YzmC-_Be?8eP8#x1J%hbE{x#YgNpnS!!MAA;OwohBK^F<5)tI7_f zlbF-#?bz`&2=AzVn>@Y6urqp`QDIRmt^j|lLpSv6Yghy?J#38DKyW* zsJq;E@-njy@)wg=&Kpp}!>@m&KWZ<%Xl=^bq;}K)i#IJ;43u{{{SP?(@Y;7X(>6u8K=@>)kQK8KotL`q%WBMSHIlMpASOSm3)@O2+8*h0~# zWN+9g;M3(3u;TN{)C$})m@kvWElp(RYrT?LS!E@Lr%TylTP;bKkv?y-%6NUCa%k@*&3$I$82^P$EEEU9099-ki?6{ zLRv+7=4WrYdGt37_Eefp>%bJSnm1At;lK^i(b~-TB_T)CqBjE1cCx#7QoUqLu|Mz{ zyZacc{TRFZxceNfu+RlhZsdi;?Iq>2&dZ{XOJK7M19d z&3AVY8MTwXC)|-`Lj_*ZAot`Cg=AZyHz766KGrITU`n3D%67ehuX%E_mAQi7qWRuJ zEql@+7kfD5;*Y{CVJZI57d{Pj5`wu}n-Is8_>OAhpWDTS*;$qpmboVO)+Tnh!LuH_ zbh*!&nWHL8gF82(KOUPA`YGh-+HfZL(@A!>uTsUR4)}?osNyu3bmf}GuP^r4EICe7 zUU_**WL*1a0bh~E-eBaO) z*Cw?X(@!tQQwQTzJ8ZbIzWY8w*)&$FBt6uhS|s3+*=0RundA(&%}WI$CEVNJ>{8G01j6xF;;ALI87_`dy#ggk_cYGeAY6P@V{E1g zv6E8GD28zv-N>JL|K-UH4gM0Cv`zH0yNSY$_?Y~$ILI-p393jI%PoPZ}?^JuT)NbJ~>?z5vcH*2I1v#oN~BVOnVUS>|||&8n*s z0FPqJ%t@zflI0H;u)7Npl9e+wE`IY8yZe$pCVAsXW*YybuOid$Osuj?6v?Js8-u_LT5}Q- z(%sn%0il=1RN}cpA}2_wQPK(IH^-_nJ({~dnZl6f^b@!NhXd{|r1L$&8Xlz;x5Y)M zQIlG>JMN!__1b{V6uF1KpuuFMSKZAwqwA8>zIk%B`=LnOH^X_h>unwETd$ zv`GFP^=gDbjK)Gwb9vhPNMzQ{=~A3rDZ|dTrQ44(>)tNRBt~9&eS4ZvZ%KC$A{r_A z?DvGN$7Np^cfHN1JCY$*;5GGmIB&_m_5U#vLgjE^Z7~Si`lx|)xL|&7y z_<-uuMq3wGE1TWK-7XE%K9k?Xf#q*XF4g{LsRR;Z)mZ5fAQAWFGdmwP}>V z2yYoD&60>CVy813T!@pKs4C6Ls+A^t!`6ShohZ4|_;&`|VmQidc!?OR`7`-x{sCrL zedOjH8wC*$w)cWKoHXihts8@aWJc4hk2Byp zO&#T!S13wJ?~>$rOUs>6%Gj0B{Kr3L3G95cEiTjU&SyuZBX&7^sYzG(50>TeC*M$x zMe0k0>%KU81Wqq@88m+EL-hIqot0LrbmS?TZAGS~6`|1-cUsMuqTHgKq{MPbPPV>e zK}#YF+~6Twa3p-hNs-Wd%ddX@ zi=_y(7i}TNIP(qfY0OpGPZ^Lgu$VtE7+&Ds_r z8p;ntcXG^o#hl(NCKDu;%ifw=qKJ#mFL5Cn;-!?jVs>ZxtsBG=LSl+N+ke-;o*Mm5 z74k4bI5#EAlI7%oEtKJ~C?;Pp3U6FZU^XT|PJ!~ECFw2Zx%Swd;EYFh2(UN|eFc|mS61$~MkknajPWsZ?x1aSi!o^TWLo1M+YR$c zV%|>@EDjT$prU%fmR79oIoX{7#Pb7}Cyja;%VpuM!F(8(s*hRozTa|s@fCK5iOYNk zkDJG+2l!287a~zkZCZS7o})%-(i3m^`i36n4n6Dx<+Za1`#tK0cHhVH!H@rQ?BJ~)gldh%d%A_W3f#42N1radj$dtT;DZDqA@62Cs7Qzv4MZ+tdo zo?v%IQDO#kc#qmPLQ&q?SWNh*>*Ph%h)e-vmb#vn2>!E7I~A%MZ6Svi_ZZ0-KheLu#^1lfDDNuShgPf!_>{^S&Z^SX^1g@EJoQ0Iq>T9c(hxZb^}T76&YWGd zrsu@mtm#>o5hQ(6t2jf=$3SQ1jm7=5m)Zb zY>T!z*_~--tGYXxic`)_6RCA3o#t>&EK_WDLutAr*#7$GY9*r$!M6qr&q zR%s>1m=m91&UIyo(x!!w0uYJ?q}UTtBGUB=rN|mEn?=;hrDp7XTN?_o#C-rb*gQFz7b1tBCCDln7^04?{m3oQ=$l&~pS>(s0KmhQtTRc6=`ShgkmGz~>0d5^ryUbJRN3?adHr zVol%dPHpWO>&Z!7zZnu0qMwm0p={s9^D->%PGr9Dad&-MeQMAR|;0D>mp;0`1^6n))liM43H%a(+X?j*7lfvsa(Tsjt2}!x`f%OLk_ZJfW9=LCO7sUjA5cAWdyi zoUL>vU7C~2fwpyu&z+k-*_5OByi$);NP6(zo?<IQUu^cTdqHJo zM`BGp$xU|r1sC2N@GbdBjK!hpT}=MJJMChO)tHfaD^@rdIPUrCRk95awua=h|G(F9 z#lksaED^)_P#`)KBYs(o#bKy5+=wys(MylC={B7bd0K>#ekIcTGa$HkJtcqV*|79u z%_hy3BF;?i2(Ebq>QP*1ky z^A_MJd8={Lz}k>yHN?s(rI^xdLN-P$k!2o~BPR%$HHcVSkfppNXb@uwSb8n@N<%LL zN6O$LA1;I)D083VlvQsa>?4&KT2$OX9p!q*v0Ualj`6so=Vu>h1l(~+#T~hvdc5Os zee@+if%@Zu*rpHK(&*-$dW2-xs^hVb(9e6o&0o-;;&|Vu=$UwzcB5+-d9dl{9tL^d zUn_j=>RrM@5j&cVZO?ye+h+KXSTrp-$66?n=hKXxiB%* zZrrC1yy2yiH*Z^Sn$u(gZk3s`+N~=L<-yWqd2nH5O?Wc>&40vvnia_a`zsQv{jA#0 ztNh;lcQt+pkD~v9`QK_ktM(7o{;A6Elm2Ut1$ZylCJy1-?Zwuc`AKst8#5jNO!*Oj zwb>e7zF=qh)x%*xQ)$(fZxUan`J1J_&l3lTF_GdjmD>RNRgS^>{vMoovL7C}+v5lB z?+We^Wm%u19MP$M2=j643J~cy!ohr80LL|s zffWk?`X#3vQA(9Cv25}sz-l9Pcx9D1P+gX+&*mH>imehRmYqf-cqznY`Ol?H$No#la;)Cs8A`gnM z`#?w~OOvH`LXp#FDtxdrxdZCRvu6w96)32kcMJ2KR>?m+f|?w?p)o-Hz-L)%ov&_-{bI zq{L!K=5~^&q{DrQ*RTu{tZz`_aDU=UsaVVb5!op|WgYH0UPIsqF7QG!kbI-bh}WMk z0WZeIDYb@FdS$uuWkWlf?jACj5#?55?PPUN*v{BK0QC?g@or~DRv8qqxX!y=Ps00g zOmoR6PP=HS73NxyM=iI@qV7vpKDe3!UX(5~X(e6y`7QEQWzT)MH@PAMMH9#S} zL3k)n4MSctoy)w`sv-&s&8r2C;!44YiJ)Lbrmf&mvZdhhbN3mYuu|B2u1*4g3V?zl zw4|W%y-_f--7Q$gq!t{078X2B_Wez|#QcC=r!GT!v})F(55mYGK?+1Z8!v=gd#0+B zQ>(V;Q^c(GQnm4;vG$L(A%9B`FjFC!&6ixtC-`3t5&!j4dpM)_PtA6M#ZLX&G#Z3h zo=zQ#K>?lk+ZqQEZ)b;BwndCK4NiLc)ER}XLg14o9A7wh2_XO@9g_^{v9p!y{U8simn<)8(p8v%~|dGIC;Q@f5o3dZS=ObUBc7lb7mBx!HYlEEF+`A ziyJjCvtb5i&e~TT5eXRu6%8E&6AK$>#wj^+`m;(TideK52ni_}IR&LyDsj}}X=v%_ z86+?=Nt7g6id1RRWyq8zo0)}`jh#adr(AjRxwv_F74Y#32r5*hScy_)%2lXTrCN=&~i&{w%4v;VTt?ZTj^)Nc*$DhPJ8SpTkP|jU;S=}gDyJnka{66 zYj9bk3og0timR^qR+Ae(^pV4w{b<5%H{H_Wd(SKu)@r(TZ8~hzsauyGy=LgsZ@_m3 z4I47kh*{pT-E8l$Fqfx1=NNZ5!cje=e;#qqz_e_~^_uZIZ}B!~c!M`N%Oduh`Wd{( z359K$koSW+!`DMWg;P~i*U;3`*3s3|H!w6ZHZe6bx3ILbwz0LdcW`uac5!uc_we)* zQfb!*S1w^jN2}pZZ>>y#?}Lq*d>w28%w%S>n2*Vohb0>~QHi8(GCnyRZoCOjif3VH zS67{`?(Zurk&$gWLOq>zeWVNe!Q6fY#LkXJFRO2WR>&8Og^-bEk`;A#Yd`y--qt~w zH<#YSWpL@eyQ8&OYKhDxNC0sH0Dxuy;2r=T0o+l5M*)ujxTCe^6tqC7mpNR3RN9?( zLu=!&&Ed4D3(e?jq(Xm#SlLFp+WwE5wMOo1ZEI-!sa$DnfI=3aPw)ijnek1z9sfuG ikc@O0Vz^VOlL3-?W>+IL1ze$s!Kn}}9eM@E1ONaaB~tVN literal 0 HcmV?d00001 diff --git a/assets/IBMPlexMono-Italic-SlashedZero.woff2 b/assets/IBMPlexMono-Italic-SlashedZero.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..48be3cb8ec26ae76762670b0cc78c9e4d445bde9 GIT binary patch literal 11948 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 SX+}qgPoMPJ<8Uwf!UX`{PgQ^b literal 0 HcmV?d00001 diff --git a/assets/IBMPlexSans-BoldItalic-SlashedZero.woff2 b/assets/IBMPlexSans-BoldItalic-SlashedZero.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..1b6ab9c19cdecce9fbc7f162b12328be2b7b0259 GIT binary patch literal 16228 zcmV-qKbydJPew8T0RR9106$~^4gdfE0HLq|06z%;0RR9100000000000000000000 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ූs8@E%ev&dR4g2I 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 literal 0 HcmV?d00001 diff --git a/assets/IBMPlexSerif-BoldItalic-SlashedZero.woff2 b/assets/IBMPlexSerif-BoldItalic-SlashedZero.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..2ae743342a7f8a4513b936cb4c1dca092e9eeb36 GIT binary patch literal 17188 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 literal 0 HcmV?d00001 diff --git a/assets/IBMPlexSerif-Italic-SlashedZero.woff2 b/assets/IBMPlexSerif-Italic-SlashedZero.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..37eedb96686aa1fe624f126687152a56c16b760c GIT binary patch literal 16808 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 Gl>q?8VJZp$ literal 0 HcmV?d00001 diff --git a/assets/ecmarkup.css b/assets/ecmarkup.css new file mode 100644 index 0000000..630a302 --- /dev/null +++ b/assets/ecmarkup.css @@ -0,0 +1,1369 @@ +/* IBM Plex fonts (Latin subset) have been downloaded from Google Fonts and modified to add support back in for the `zero` substitution (slashed zeroes) */ + +/* https://fonts.googleapis.com/css2?family=IBM%20Plex%20Serif:ital,wght@0,400;0,700;1,400;1,700&display=swap */ +@font-face { + font-family: 'IBM Plex Serif'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: local(IBM Plex Serif Regular), local(IBMPlexSerif-Regular), url(./IBMPlexSerif-Regular-SlashedZero.woff2) format('woff2'); +} +@font-face { + font-family: 'IBM Plex Serif'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: local(IBM Plex Serif Bold), local(IBMPlexSerif-Bold), url(./IBMPlexSerif-Bold-SlashedZero.woff2) format('woff2'); +} +@font-face { + font-family: 'IBM Plex Serif'; + font-style: italic; + font-weight: 400; + font-display: swap; + src: local(IBM Plex Serif Italic), local(IBMPlexSerif-Italic), url(./IBMPlexSerif-Italic-SlashedZero.woff2) format('woff2'); +} +@font-face { + font-family: 'IBM Plex Serif'; + font-style: italic; + font-weight: 700; + font-display: swap; + src: local(IBM Plex Serif Bold Italic), local(IBMPlexSerif-BoldItalic), url(./IBMPlexSerif-BoldItalic-SlashedZero.woff2) format('woff2'); +} + +/* https://fonts.googleapis.com/css2?family=IBM%20Plex%20Sans:ital,wght@0,400;0,700;1,400;1,700&display=swap */ +@font-face { + font-family: 'IBM Plex Sans'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: local(IBM Plex Sans Regular), local(IBMPlexSans-Regular), url(./IBMPlexSans-Regular-SlashedZero.woff2) format('woff2'); +} +@font-face { + font-family: 'IBM Plex Sans'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: local(IBM Plex Sans Bold), local(IBMPlexSans-Bold), url(./IBMPlexSans-Bold-SlashedZero.woff2) format('woff2'); +} +@font-face { + font-family: 'IBM Plex Sans'; + font-style: italic; + font-weight: 400; + font-display: swap; + src: local(IBM Plex Sans Italic), local(IBMPlexSans-Italic), url(./IBMPlexSans-Italic-SlashedZero.woff2) format('woff2'); +} +@font-face { + font-family: 'IBM Plex Sans'; + font-style: italic; + font-weight: 700; + font-display: swap; + src: local(IBM Plex Sans Bold Italic), local(IBMPlexSans-BoldItalic), url(./IBMPlexSans-BoldItalic-SlashedZero.woff2) format('woff2'); +} + +/* https://fonts.googleapis.com/css2?family=IBM%20Plex%20Mono:ital,wght@0,400;0,700;1,400;1,700&display=swap */ +@font-face { + font-family: 'IBM Plex Mono'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: local(IBM Plex Mono Regular), local(IBMPlexMono-Regular), url(./IBMPlexMono-Regular-SlashedZero.woff2) format('woff2'); +} +@font-face { + font-family: 'IBM Plex Mono'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: local(IBM Plex Mono Bold), local(IBMPlexMono-Bold), url(./IBMPlexMono-Bold-SlashedZero.woff2) format('woff2'); +} +@font-face { + font-family: 'IBM Plex Mono'; + font-style: italic; + font-weight: 400; + font-display: swap; + src: local(IBM Plex Mono Italic), local(IBMPlexMono-Italic), url(./IBMPlexMono-Italic-SlashedZero.woff2) format('woff2'); +} +@font-face { + font-family: 'IBM Plex Mono'; + font-style: italic; + font-weight: 700; + font-display: swap; + src: local(IBM Plex Mono Bold Italic), local(IBMPlexMono-BoldItalic), url(./IBMPlexMono-BoldItalic-SlashedZero.woff2) format('woff2'); +} + +html { + background-color: #fff; +} + +body { + display: flex; + word-wrap: break-word; + font-size: 18px; + line-height: 1.5; + font-family: IBM Plex Serif, serif; + font-variant-numeric: slashed-zero; + padding: 0; + margin: 0; + color: #111; +} + +#spec-container { + padding: 0 20px; + flex-grow: 1; + flex-basis: 66%; + box-sizing: border-box; + overflow: hidden; + padding-bottom: 1em; +} + +body.oldtoc { + margin: 0 auto; +} + +span[aria-hidden='true'] { + font-size: 0; +} + +a { + text-decoration: none; + color: #206ca7; +} + +a:visited { + color: #206ca7; +} + +a:hover { + text-decoration: underline; + color: #239dee; +} + +a.e-user-code, +span.e-user-code { + white-space: nowrap; +} + +a.e-user-code::before, +span.e-user-code::before { + display: none; + color: brown; + background-color: white; + border: 2pt solid brown; + padding: 0.3ex; + margin: 0 0.25em 0 0; + line-height: normal; + vertical-align: middle; + text-transform: uppercase; + font-family: IBM Plex Sans, sans-serif; + font-weight: 900; + font-size: x-small; +} + +a.e-user-code:hover::before, +span.e-user-code:hover::before { + background-color: brown; + color: white; +} + +html.show-ao-annotations a.e-user-code::before, +html.show-ao-annotations span.e-user-code::before { + display: inline-block; +} + +a.e-user-code::before, +span.e-user-code::before { + content: 'UC'; +} + +code { + font-weight: bold; + font-family: Comic Code, IBM Plex Mono, monospace; + white-space: pre; +} + +pre code { + font-weight: inherit; +} + +pre code.hljs { + background-color: #fff; + margin: 0; + padding: 0; +} + +ol.toc { + list-style: none; + padding-left: 0; +} + +ol.toc ol.toc { + padding-left: 2ex; + list-style: none; +} + +var { + border-radius: 5px; + color: #218379; + transition: all 0.25s ease-out; + cursor: pointer; + padding: 0 4px; + margin: 0 -4px; + mix-blend-mode: multiply; +} +var.field { + font: inherit; + color: inherit; +} + +var.referenced { + color: inherit; +} + +var.referenced0 { + background-color: #ffff6c; +} +var.referenced1 { + background-color: #ffa4a8; +} +var.referenced2 { + background-color: #96e885; +} +var.referenced3 { + background-color: #3eeed2; +} +var.referenced4 { + background-color: #eacfb6; +} +var.referenced5 { + background-color: #82ddff; +} +var.referenced6 { + background-color: #ffbcf2; +} + +emu-const { + font-family: IBM Plex Sans, sans-serif; + font-variant: small-caps; + text-transform: uppercase; +} + +emu-val { + font-weight: bold; +} + +/* depth 1 */ +emu-alg ol, +/* depth 4 */ +emu-alg ol ol ol ol, +emu-alg ol.nested-thrice, +emu-alg ol.nested-twice ol, +emu-alg ol.nested-once ol ol { + list-style-type: decimal; +} + +/* depth 2 */ +emu-alg ol ol, +emu-alg ol.nested-once, +/* depth 5 */ +emu-alg ol ol ol ol ol, +emu-alg ol.nested-four-times, +emu-alg ol.nested-thrice ol, +emu-alg ol.nested-twice ol ol, +emu-alg ol.nested-once ol ol ol { + list-style-type: lower-alpha; +} + +/* depth 3 */ +emu-alg ol ol ol, +emu-alg ol.nested-twice, +emu-alg ol.nested-once ol, +/* depth 6 */ +emu-alg ol ol ol ol ol ol, +emu-alg ol.nested-lots, +emu-alg ol.nested-four-times ol, +emu-alg ol.nested-thrice ol ol, +emu-alg ol.nested-twice ol ol ol, +emu-alg ol.nested-once ol ol ol ol, +/* depth 7+ */ +emu-alg ol.nested-lots ol { + list-style-type: lower-roman; +} + +emu-eqn { + display: block; + margin-left: 4em; +} + +emu-eqn.inline { + display: inline; + margin: 0; +} + +emu-eqn div:first-child { + margin-left: -2em; +} + +emu-note { + margin: 1em 0; + display: flex; + flex-direction: row; + color: inherit; + border-left: 5px solid #52e052; + background: #e9fbe9; + padding: 10px 10px 10px 0; +} + +emu-note > span.note { + flex-basis: 100px; + min-width: 100px; + flex-grow: 0; + flex-shrink: 1; + text-transform: uppercase; + padding-left: 5px; +} + +emu-note[type='editor'] { + border-left-color: #faa; +} + +emu-note > div.note-contents { + flex-grow: 1; + flex-shrink: 1; + overflow: auto; +} + +emu-note > div.note-contents > p:first-of-type { + margin-top: 0; +} + +emu-note > div.note-contents > p:last-of-type { + margin-bottom: 0; +} + +emu-table:not(.code) td code { + white-space: normal; +} + +emu-figure { + display: block; +} + +emu-example { + display: block; + margin: 1em 3em; +} + +emu-example figure figcaption { + margin-top: 0.5em; + text-align: left; +} + +emu-figure figure, +emu-example figure, +emu-table figure { + display: flex; + flex-direction: column; + align-items: center; +} + +emu-production { + display: block; +} + +emu-grammar[type='example'] emu-production, +emu-grammar[type='definition'] emu-production { + margin-top: 1em; + margin-bottom: 1em; + margin-left: 5ex; +} + +emu-grammar.inline, +emu-production.inline, +emu-grammar.inline emu-production emu-rhs, +emu-production.inline emu-rhs, +emu-grammar[collapsed] emu-production emu-rhs { + display: inline; + padding-left: 1ex; + margin-left: 0; +} + +emu-production[collapsed] emu-rhs { + display: inline; + padding-left: 0.5ex; + margin-left: 0; +} + +emu-grammar[collapsed] emu-production, +emu-production[collapsed] { + margin: 0; +} + +emu-constraints { + font-size: 0.75em; + margin-right: 0.5ex; +} + +emu-gann { + margin-right: 0.5ex; +} + +emu-gann emu-t:last-child, +emu-gann emu-gprose:last-child, +emu-gann emu-nt:last-child { + margin-right: 0; +} + +emu-geq { + margin-left: 0.5ex; + font-weight: bold; +} + +emu-oneof { + font-weight: bold; + margin-left: 0.5ex; +} + +emu-nt { + display: inline-block; + font-style: italic; + white-space: nowrap; + text-indent: 0; +} + +emu-nt a, +emu-nt a:visited { + color: #333; +} + +emu-rhs emu-nt { + margin-right: 0.5ex; +} + +emu-t { + display: inline-block; + font-family: IBM Plex Mono, monospace; + font-weight: bold; + white-space: nowrap; + text-indent: 0; +} + +emu-production emu-t { + margin-right: 0.5ex; +} + +emu-rhs { + display: block; + padding-left: 75px; + text-indent: -25px; +} + +emu-production:not([collapsed]) emu-rhs { + border: 0.2ex dashed transparent; +} + +emu-production:not([collapsed]) emu-rhs:hover { + border-color: #888; + background-color: #f0f0f0; +} + +emu-mods { + font-size: 0.85em; + vertical-align: sub; + font-style: normal; + font-weight: normal; +} + +emu-params, +emu-opt { + margin-right: 1ex; + font-family: IBM Plex Mono, monospace; +} + +emu-params, +emu-constraints { + color: #2aa198; +} + +emu-opt { + color: #b58900; +} + +emu-gprose { + font-size: 0.9em; + font-family: IBM Plex Sans, sans-serif; +} + +emu-production emu-gprose { + margin-right: 1ex; +} + +h1.shortname { + color: #f60; + font-size: 1.5em; + margin: 0; +} + +h1.version { + color: #f60; + font-size: 1.5em; +} + +h1.title { + color: #f60; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + position: relative; +} + +h1 .secnum { + text-decoration: none; + margin-right: 5px; +} + +h1 span.title { + order: 2; +} + +h1 { + font-size: 2.67em; + margin-bottom: 0; + line-height: 1em; +} +h2 { + font-size: 2em; +} +h3 { + font-size: 1.56em; +} +h4 { + font-size: 1.25em; +} +h5 { + font-size: 1.11em; +} +h6 { + font-size: 1em; +} + +pre code.hljs { + background: transparent; +} + +emu-clause[id], +emu-annex[id], +emu-intro[id] { + scroll-margin-top: 2ex; +} + +emu-intro h1, +emu-clause h1, +emu-annex h1 { + font-size: 2em; +} +emu-intro h2, +emu-clause h2, +emu-annex h2 { + font-size: 1.56em; +} +emu-intro h3, +emu-clause h3, +emu-annex h3 { + font-size: 1.25em; +} +emu-intro h4, +emu-clause h4, +emu-annex h4 { + font-size: 1.11em; +} +emu-intro h5, +emu-clause h5, +emu-annex h5 { + font-size: 1em; +} +emu-intro h6, +emu-clause h6, +emu-annex h6 { + font-size: 0.9em; +} +emu-intro emu-intro h1, +emu-clause emu-clause h1, +emu-annex emu-annex h1 { + font-size: 1.56em; +} +emu-intro emu-intro h2, +emu-clause emu-clause h2, +emu-annex emu-annex h2 { + font-size: 1.25em; +} +emu-intro emu-intro h3, +emu-clause emu-clause h3, +emu-annex emu-annex h3 { + font-size: 1.11em; +} +emu-intro emu-intro h4, +emu-clause emu-clause h4, +emu-annex emu-annex h4 { + font-size: 1em; +} +emu-intro emu-intro h5, +emu-clause emu-clause h5, +emu-annex emu-annex h5 { + font-size: 0.9em; +} +emu-intro emu-intro emu-intro h1, +emu-clause emu-clause emu-clause h1, +emu-annex emu-annex emu-annex h1 { + font-size: 1.25em; +} +emu-intro emu-intro emu-intro h2, +emu-clause emu-clause emu-clause h2, +emu-annex emu-annex emu-annex h2 { + font-size: 1.11em; +} +emu-intro emu-intro emu-intro h3, +emu-clause emu-clause emu-clause h3, +emu-annex emu-annex emu-annex h3 { + font-size: 1em; +} +emu-intro emu-intro emu-intro h4, +emu-clause emu-clause emu-clause h4, +emu-annex emu-annex emu-annex h4 { + font-size: 0.9em; +} +emu-intro emu-intro emu-intro emu-intro h1, +emu-clause emu-clause emu-clause emu-clause h1, +emu-annex emu-annex emu-annex emu-annex h1 { + font-size: 1.11em; +} +emu-intro emu-intro emu-intro emu-intro h2, +emu-clause emu-clause emu-clause emu-clause h2, +emu-annex emu-annex emu-annex emu-annex h2 { + font-size: 1em; +} +emu-intro emu-intro emu-intro emu-intro h3, +emu-clause emu-clause emu-clause emu-clause h3, +emu-annex emu-annex emu-annex emu-annex h3 { + font-size: 0.9em; +} +emu-intro emu-intro emu-intro emu-intro emu-intro h1, +emu-clause emu-clause emu-clause emu-clause emu-clause h1, +emu-annex emu-annex emu-annex emu-annex emu-annex h1 { + font-size: 1em; +} +emu-intro emu-intro emu-intro emu-intro emu-intro h2, +emu-clause emu-clause emu-clause emu-clause emu-clause h2, +emu-annex emu-annex emu-annex emu-annex emu-annex h2 { + font-size: 0.9em; +} +emu-intro emu-intro emu-intro emu-intro emu-intro emu-intro h1, +emu-clause emu-clause emu-clause emu-clause emu-clause emu-clause h1, +emu-annex emu-annex emu-annex emu-annex emu-annex emu-annex h1 { + font-size: 0.9em; +} + +emu-clause, +emu-intro, +emu-annex { + display: block; +} + +/* these values are twice the font-size for the

titles for clauses */ +emu-intro, +emu-clause, +emu-annex { + margin-top: 4em; +} +emu-intro emu-intro, +emu-clause emu-clause, +emu-annex emu-annex { + margin-top: 3.12em; +} +emu-intro emu-intro emu-intro, +emu-clause emu-clause emu-clause, +emu-annex emu-annex emu-annex { + margin-top: 2.5em; +} +emu-intro emu-intro emu-intro emu-intro, +emu-clause emu-clause emu-clause emu-clause, +emu-annex emu-annex emu-annex emu-annex { + margin-top: 2.22em; +} +emu-intro emu-intro emu-intro emu-intro emu-intro, +emu-clause emu-clause emu-clause emu-clause emu-clause, +emu-annex emu-annex emu-annex emu-annex emu-annex { + margin-top: 2em; +} +emu-intro emu-intro emu-intro emu-intro emu-intro emu-intro, +emu-clause emu-clause emu-clause emu-clause emu-clause emu-clause, +emu-annex emu-annex emu-annex emu-annex emu-annex emu-annex { + margin-top: 1.8em; +} + +#spec-container > emu-intro:first-of-type, +#spec-container > emu-clause:first-of-type, +#spec-container > emu-annex:first-of-type { + margin-top: 0; +} + +/* Figures and tables */ +figure { + display: block; + margin: 1em 0 3em 0; +} +figure object { + display: block; + margin: 0 auto; +} +figure table.real-table { + margin: 0 auto; +} +figure figcaption { + display: block; + color: #555555; + font-weight: bold; + text-align: center; +} + +emu-table table { + margin: 0 auto; +} + +emu-table table, +table.real-table { + border-collapse: collapse; +} + +emu-table td, +emu-table th, +table.real-table td, +table.real-table th { + border: 1px solid black; + padding: 0.4em; + vertical-align: baseline; +} +emu-table th, +emu-table thead td, +table.real-table th { + background-color: #eeeeee; +} + +emu-table td { + background: #fff; +} + +/* Note: the left content edges of table.lightweight-table >tbody >tr >td + and div.display line up. */ +table.lightweight-table { + border-collapse: collapse; + margin: 0 0 0 1.5em; +} +table.lightweight-table td, +table.lightweight-table th { + border: none; + padding: 0 0.5em; + vertical-align: baseline; +} + +/* for non-clause-like link targets, apply a fading highlight + and a persistent focus-associated highlight */ +@keyframes highlight-target-bg { + 0% { + background-color: rgba(249, 241, 172, 1); + } + 100% { + background-color: rgba(249, 241, 172, 0) + } +} +#spec-container :target:not(emu-annex, emu-clause, emu-intro, emu-note, body) { + animation: highlight-target-bg 2.5s ease-out; +} +#spec-container :target:focus-within:not(:has(:not(a))) { + animation: none; + background-color: rgba(249, 241, 172, 1); +} + +/* diff styles */ +ins { + background-color: #e0f8e0; + text-decoration: none; + border-bottom: 1px solid #396; +} + +del { + background-color: #fee; +} + +ins.block, +del.block, +emu-production > ins, +emu-production > del, +emu-grammar > ins, +emu-grammar > del { + display: block; +} +emu-rhs > ins, +emu-rhs > del { + display: inline; +} + +tr.ins > td > ins { + border-bottom: none; +} + +tr.ins > td { + background-color: #e0f8e0; +} + +tr.del > td { + background-color: #fee; +} + +/* Menu Styles */ +#menu-toggle { + font-size: 2em; + + position: fixed; + top: 0; + left: 0; + width: 1.5em; + height: 1.5em; + z-index: 3; + visibility: hidden; + color: #1567a2; + background-color: #fff; + + line-height: 1.5em; + text-align: center; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + + cursor: pointer; +} + +#menu { + display: flex; + flex-direction: column; + width: 33%; + height: 100vh; + max-width: 500px; + box-sizing: border-box; + background-color: #ddd; + overflow: hidden; + transition: opacity 0.1s linear; + padding: 0 5px; + position: fixed; + left: 0; + top: 0; + border-right: 2px solid #bbb; + + z-index: 2; +} + +.menu-spacer { + flex-basis: 33%; + max-width: 500px; + flex-grow: 0; + flex-shrink: 0; +} + +#menu a { + color: #1567a2; +} + +#menu.active { + display: flex; + opacity: 1; + z-index: 2; +} + +#menu-pins { + flex-grow: 1; + display: none; +} + +#menu-pins.active { + display: block; +} + +#menu-pins-list { + margin: 0; + padding: 0; + counter-reset: pins-counter; +} + +#menu-pins-list > li:before { + content: counter(pins-counter); + counter-increment: pins-counter; + display: inline-block; + width: 25px; + text-align: center; + border: 1px solid #bbb; + padding: 2px; + margin: 4px; + box-sizing: border-box; + line-height: 1em; + background-color: #ccc; + border-radius: 4px; +} +#menu-toc > ol { + padding: 0; + flex-grow: 1; +} + +#menu-toc > ol li { + padding: 0; +} + +#menu-toc > ol, +#menu-toc > ol ol { + list-style-type: none; + margin: 0; + padding: 0; +} + +#menu-toc > ol ol { + padding-left: 0.75em; +} + +#menu-toc li { + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; +} + +#menu-toc .item-toggle { + display: inline-block; + transform: rotate(0deg); + transition: transform 0.1s ease; + background: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMC42MDUiIGhlaWdodD0iMTUuNTU1Ij48cGF0aCBmaWxsPSIjODg5IiBkPSJtMi44MjggMTUuNTU1IDcuNzc3LTcuNzc5TDIuODI4IDAgMCAyLjgyOGw0Ljk0OSA0Ljk0OEwwIDEyLjcyN2wyLjgyOCAyLjgyOHoiLz48L3N2Zz4); + background-repeat: no-repeat; + background-position: center; + background-size: auto 50%; + text-align: center; + width: 1em; + + color: transparent; + + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + + cursor: pointer; +} + +#menu-toc .item-toggle-none { + display: inline-block; + width: 1em; +} + +#menu-toc li.active > .item-toggle, +#menu-toc li.revealed > .item-toggle { + transform: rotate(90deg); +} + +#menu-toc li > ol { + display: none; +} + +#menu-toc li.active > ol { + display: block; +} + +#menu-toc li.revealed > a { + background-color: #ccc; + font-weight: bold; +} + +#menu-toc li.revealed-leaf > a { + color: #206ca7; +} + +#menu-toc li.revealed > ol { + display: block; +} + +#menu-toc li > a { + padding: 2px 5px; +} + +#menu > * { + margin-bottom: 5px; +} + +.menu-pane-header { + padding: 2px 8px; + background-color: #bbb; + font-weight: bold; + letter-spacing: 1px; + flex-grow: 0; + flex-shrink: 0; + font-size: 80%; + cursor: row-resize; + user-select: none; +} + +.menu-pane-header emu-opt, +.menu-pane-header emu-t, +.menu-pane-header emu-nt { + margin-right: 0px; + display: inline; + color: inherit; +} + +.menu-pane-header emu-rhs { + display: inline; + padding-left: 0px; + text-indent: 0px; +} + +.menu-pane-header emu-geq { + margin-left: 0px; +} + +a.menu-pane-header-production { + color: inherit; +} + +.menu-pane-header-production { + text-transform: none; + letter-spacing: 1.5px; + padding-left: 0.5em; +} + +#menu-toc { + display: flex; + flex-direction: column; + width: 100%; + overflow: hidden; + flex-grow: 1; +} + +#menu-toc ol.toc { + overflow-x: hidden; + overflow-y: auto; +} + +#menu-search { + position: relative; + flex-grow: 0; + flex-shrink: 0; + width: 100%; + + display: flex; + flex-direction: column; + + max-height: 300px; +} + +#menu-trace-list { + display: none; +} + +#menu-search-box { + box-sizing: border-box; + display: block; + width: 100%; + margin: 5px 0 0 0; + font-size: 1em; + padding: 2px; + background-color: #bbb; + border: 1px solid #999; +} + +#menu-search-results { + overflow-x: hidden; + overflow-y: auto; +} + +li.menu-search-result-clause:before { + content: 'clause'; + width: 40px; + display: inline-block; + text-align: right; + padding-right: 1ex; + color: #666; + font-size: 75%; +} +li.menu-search-result-op:before { + content: 'op'; + width: 40px; + display: inline-block; + text-align: right; + padding-right: 1ex; + color: #666; + font-size: 75%; +} + +li.menu-search-result-prod:before { + content: 'prod'; + width: 40px; + display: inline-block; + text-align: right; + padding-right: 1ex; + color: #666; + font-size: 75%; +} + +li.menu-search-result-term:before { + content: 'term'; + width: 40px; + display: inline-block; + text-align: right; + padding-right: 1ex; + color: #666; + font-size: 75%; +} + +#menu-search-results ul { + padding: 0 5px; + margin: 0; +} + +#menu-search-results li { + white-space: nowrap; + text-overflow: ellipsis; +} + +#menu-trace-list { + counter-reset: item; + margin: 0 0 0 20px; + padding: 0; +} +#menu-trace-list li { + display: block; + white-space: nowrap; +} + +#menu-trace-list li .secnum:after { + content: ' '; +} +#menu-trace-list li:before { + content: counter(item) ' '; + background-color: #222; + counter-increment: item; + color: #999; + width: 20px; + height: 20px; + line-height: 20px; + display: inline-block; + text-align: center; + margin: 2px 4px 2px 0; +} + +@media (max-width: 1000px) { + body { + margin: 0; + display: block; + } + + #menu { + display: none; + padding-top: 3em; + width: 450px; + } + + #menu.active { + position: fixed; + height: 100%; + left: 0; + top: 0; + right: 300px; + } + + #menu-toggle { + visibility: visible; + } + + #spec-container { + padding: 0 5px; + } + + #references-pane-spacer { + display: none; + } +} + +@media only screen and (max-width: 800px) { + #menu { + width: 100%; + } + + h1 .secnum:empty { + margin: 0; + padding: 0; + } +} + +/* Toolbox */ +.toolbox-container { + position: absolute; + display: none; + padding-bottom: 7px; +} + +.toolbox-container.active { + display: inline-block; +} + +.toolbox { + position: relative; + background: #ddd; + border: 1px solid #aaa; + color: #eee; + padding: 5px 7px; + border-radius: 3px; +} + +.toolbox a { + text-decoration: none; + padding: 0 3px; + white-space: nowrap; +} + +.toolbox a:hover { + text-decoration: underline; +} + +.toolbox:after, +.toolbox:before { + top: 100%; + left: 15px; + border: solid transparent; + content: ' '; + height: 0; + width: 0; + position: absolute; + pointer-events: none; +} + +.toolbox:after { + border-color: rgba(0, 0, 0, 0); + border-top-color: #ddd; + border-width: 10px; + margin-left: -10px; +} +.toolbox:before { + border-color: rgba(204, 204, 204, 0); + border-top-color: #aaa; + border-width: 12px; + margin-left: -12px; +} + +#references-pane-container { + position: fixed; + bottom: 0; + left: 0; + right: 0; + display: none; + background-color: #ddd; + z-index: 1; +} + +#references-pane-table-container { + overflow-x: hidden; + overflow-y: auto; + min-height: 35px; + max-height: 85vh; +} + +#references-pane { + flex-grow: 1; + overflow: hidden; + display: flex; + flex-direction: column; +} + +#references-pane-container.active { + display: flex; +} + +#references-pane-close:after { + content: '✖'; + float: right; + cursor: pointer; +} + +#references-pane table tbody { + vertical-align: baseline; +} + +#references-pane table tr td:first-child { + text-align: right; + padding-right: 5px; +} + +@media print { + #menu-toggle { + display: none; + } +} + +[normative-optional], +[deprecated], +[legacy] { + border-left: 5px solid #ff6600; + padding: 0.5em; + background: #ffeedd; +} + +.attributes-tag { + text-transform: uppercase; + color: #884400; +} + +.attributes-tag a { + color: #884400; +} + +/* Shortcuts help dialog */ + +#shortcuts-help { + position: fixed; + left: 5%; + margin: 0 auto; + right: 5%; + z-index: 10; + top: 10%; + top: calc(5vw + 5vh); + padding: 30px 90px; + max-width: 500px; + outline: solid 10000px rgba(255, 255, 255, 0.6); + border-radius: 5px; + border-width: 1px 1px 0 1px; + background-color: #ddd; + display: none; +} + +#shortcuts-help.active { + display: block; +} + +#shortcuts-help ul { + padding: 0; +} + +#shortcuts-help li { + display: flex; + justify-content: space-between; +} + +#shortcuts-help code { + padding: 3px 10px; + border-radius: 3px; + border-width: 1px 1px 0 1px; + border-color: #bbb; + background-color: #eee; + box-shadow: inset 0 -1px 0 #ccc; +} diff --git a/assets/ecmarkup.js b/assets/ecmarkup.js new file mode 100644 index 0000000..8186c48 --- /dev/null +++ b/assets/ecmarkup.js @@ -0,0 +1,1529 @@ +'use strict'; +let sdoBox = { + init() { + this.$alternativeId = null; + this.$outer = document.createElement('div'); + this.$outer.classList.add('toolbox-container'); + this.$container = document.createElement('div'); + this.$container.classList.add('toolbox'); + this.$displayLink = document.createElement('a'); + this.$displayLink.setAttribute('href', '#'); + this.$displayLink.textContent = 'Syntax-Directed Operations'; + this.$displayLink.addEventListener('click', e => { + e.preventDefault(); + e.stopPropagation(); + referencePane.showSDOs(sdoMap[this.$alternativeId] || {}, this.$alternativeId); + }); + this.$container.appendChild(this.$displayLink); + this.$outer.appendChild(this.$container); + document.body.appendChild(this.$outer); + }, + + activate(el) { + clearTimeout(this.deactiveTimeout); + Toolbox.deactivate(); + this.$alternativeId = el.id; + let numSdos = Object.keys(sdoMap[this.$alternativeId] || {}).length; + this.$displayLink.textContent = 'Syntax-Directed Operations (' + numSdos + ')'; + this.$outer.classList.add('active'); + let top = el.offsetTop - this.$outer.offsetHeight; + let left = el.offsetLeft + 50 - 10; // 50px = padding-left(=75px) + text-indent(=-25px) + this.$outer.setAttribute('style', 'left: ' + left + 'px; top: ' + top + 'px'); + if (top < document.body.scrollTop) { + this.$container.scrollIntoView(); + } + }, + + deactivate() { + clearTimeout(this.deactiveTimeout); + this.$outer.classList.remove('active'); + }, +}; + +document.addEventListener('DOMContentLoaded', () => { + if (typeof sdoMap == 'undefined') { + console.error('could not find sdo map'); + return; + } + sdoBox.init(); + + let insideTooltip = false; + sdoBox.$outer.addEventListener('pointerenter', () => { + insideTooltip = true; + }); + sdoBox.$outer.addEventListener('pointerleave', () => { + insideTooltip = false; + sdoBox.deactivate(); + }); + + sdoBox.deactiveTimeout = null; + [].forEach.call(document.querySelectorAll('emu-grammar[type=definition] emu-rhs'), node => { + node.addEventListener('pointerenter', function () { + sdoBox.activate(this); + }); + + node.addEventListener('pointerleave', () => { + sdoBox.deactiveTimeout = setTimeout(() => { + if (!insideTooltip) { + sdoBox.deactivate(); + } + }, 500); + }); + }); + + document.addEventListener( + 'keydown', + debounce(e => { + if (e.code === 'Escape') { + sdoBox.deactivate(); + } + }) + ); +}); + +'use strict'; +function Search(menu) { + this.menu = menu; + this.$search = document.getElementById('menu-search'); + this.$searchBox = document.getElementById('menu-search-box'); + this.$searchResults = document.getElementById('menu-search-results'); + + this.loadBiblio(); + + document.addEventListener('keydown', this.documentKeydown.bind(this)); + + this.$searchBox.addEventListener( + 'keydown', + debounce(this.searchBoxKeydown.bind(this), { stopPropagation: true }) + ); + this.$searchBox.addEventListener( + 'keyup', + debounce(this.searchBoxKeyup.bind(this), { stopPropagation: true }) + ); + + // Perform an initial search if the box is not empty. + if (this.$searchBox.value) { + this.search(this.$searchBox.value); + } +} + +Search.prototype.loadBiblio = function () { + if (typeof biblio === 'undefined') { + console.error('could not find biblio'); + this.biblio = { refToClause: {}, entries: [] }; + } else { + this.biblio = biblio; + this.biblio.clauses = this.biblio.entries.filter(e => e.type === 'clause'); + this.biblio.byId = this.biblio.entries.reduce((map, entry) => { + map[entry.id] = entry; + return map; + }, {}); + let refParentClause = Object.create(null); + this.biblio.refParentClause = refParentClause; + let refsByClause = this.biblio.refsByClause; + Object.keys(refsByClause).forEach(clause => { + refsByClause[clause].forEach(ref => { + refParentClause[ref] = clause; + }); + }); + } +}; + +Search.prototype.documentKeydown = function (e) { + if (e.key === '/') { + e.preventDefault(); + e.stopPropagation(); + this.triggerSearch(); + } +}; + +Search.prototype.searchBoxKeydown = function (e) { + e.stopPropagation(); + e.preventDefault(); + if (e.keyCode === 191 && e.target.value.length === 0) { + e.preventDefault(); + } else if (e.keyCode === 13) { + e.preventDefault(); + this.selectResult(); + } +}; + +Search.prototype.searchBoxKeyup = function (e) { + if (e.keyCode === 13 || e.keyCode === 9) { + return; + } + + this.search(e.target.value); +}; + +Search.prototype.triggerSearch = function () { + if (this.menu.isVisible()) { + this._closeAfterSearch = false; + } else { + this._closeAfterSearch = true; + this.menu.show(); + } + + this.$searchBox.focus(); + this.$searchBox.select(); +}; +// bit 12 - Set if the result starts with searchString +// bits 8-11: 8 - number of chunks multiplied by 2 if cases match, otherwise 1. +// bits 1-7: 127 - length of the entry +// General scheme: prefer case sensitive matches with fewer chunks, and otherwise +// prefer shorter matches. +function relevance(result) { + let relevance = 0; + + relevance = Math.max(0, 8 - result.match.chunks) << 7; + + if (result.match.caseMatch) { + relevance *= 2; + } + + if (result.match.prefix) { + relevance += 2048; + } + + relevance += Math.max(0, 255 - result.key.length); + + return relevance; +} + +Search.prototype.search = function (searchString) { + if (searchString === '') { + this.displayResults([]); + this.hideSearch(); + return; + } else { + this.showSearch(); + } + + if (searchString.length === 1) { + this.displayResults([]); + return; + } + + let results; + + if (/^[\d.]*$/.test(searchString)) { + results = this.biblio.clauses + .filter(clause => clause.number.substring(0, searchString.length) === searchString) + .map(clause => ({ key: getKey(clause), entry: clause })); + } else { + results = []; + + for (let i = 0; i < this.biblio.entries.length; i++) { + let entry = this.biblio.entries[i]; + let key = getKey(entry); + if (!key) { + // biblio entries without a key aren't searchable + continue; + } + + let match = fuzzysearch(searchString, key); + if (match) { + results.push({ key, entry, match }); + } + } + + results.forEach(result => { + result.relevance = relevance(result, searchString); + }); + + results = results.sort((a, b) => b.relevance - a.relevance); + } + + if (results.length > 50) { + results = results.slice(0, 50); + } + + this.displayResults(results); +}; +Search.prototype.hideSearch = function () { + this.$search.classList.remove('active'); +}; + +Search.prototype.showSearch = function () { + this.$search.classList.add('active'); +}; + +Search.prototype.selectResult = function () { + let $first = this.$searchResults.querySelector('li:first-child a'); + + if ($first) { + document.location = $first.getAttribute('href'); + } + + this.$searchBox.value = ''; + this.$searchBox.blur(); + this.displayResults([]); + this.hideSearch(); + + if (this._closeAfterSearch) { + this.menu.hide(); + } +}; + +Search.prototype.displayResults = function (results) { + if (results.length > 0) { + this.$searchResults.classList.remove('no-results'); + + let html = ''; + + this.$searchResults.innerHTML = html; + } else { + this.$searchResults.innerHTML = ''; + this.$searchResults.classList.add('no-results'); + } +}; + +function getKey(item) { + if (item.key) { + return item.key; + } + switch (item.type) { + case 'clause': + return item.title || item.titleHTML; + case 'production': + return item.name; + case 'op': + return item.aoid; + case 'term': + return item.term; + case 'table': + case 'figure': + case 'example': + case 'note': + return item.caption; + case 'step': + return item.id; + default: + throw new Error("Can't get key for " + item.type); + } +} + +function Menu() { + this.$toggle = document.getElementById('menu-toggle'); + this.$menu = document.getElementById('menu'); + this.$toc = document.querySelector('menu-toc > ol'); + this.$pins = document.querySelector('#menu-pins'); + this.$pinList = document.getElementById('menu-pins-list'); + this.$toc = document.querySelector('#menu-toc > ol'); + this.$specContainer = document.getElementById('spec-container'); + this.search = new Search(this); + + this._pinnedIds = {}; + this.loadPinEntries(); + + // toggle menu + this.$toggle.addEventListener('click', this.toggle.bind(this)); + + // keydown events for pinned clauses + document.addEventListener('keydown', this.documentKeydown.bind(this)); + + // toc expansion + let tocItems = this.$menu.querySelectorAll('#menu-toc li'); + for (let i = 0; i < tocItems.length; i++) { + let $item = tocItems[i]; + $item.addEventListener('click', event => { + $item.classList.toggle('active'); + event.stopPropagation(); + }); + } + + // close toc on toc item selection + let tocLinks = this.$menu.querySelectorAll('#menu-toc li > a'); + for (let i = 0; i < tocLinks.length; i++) { + let $link = tocLinks[i]; + $link.addEventListener('click', event => { + this.toggle(); + event.stopPropagation(); + }); + } + + // update active clause on scroll + window.addEventListener('scroll', debounce(this.updateActiveClause.bind(this))); + this.updateActiveClause(); + + // prevent menu scrolling from scrolling the body + this.$toc.addEventListener('wheel', e => { + let target = e.currentTarget; + let offTop = e.deltaY < 0 && target.scrollTop === 0; + if (offTop) { + e.preventDefault(); + } + let offBottom = e.deltaY > 0 && target.offsetHeight + target.scrollTop >= target.scrollHeight; + + if (offBottom) { + e.preventDefault(); + } + }); +} + +Menu.prototype.documentKeydown = function (e) { + e.stopPropagation(); + if (e.keyCode === 80) { + this.togglePinEntry(); + } else if (e.keyCode > 48 && e.keyCode < 58) { + this.selectPin(e.keyCode - 49); + } +}; + +Menu.prototype.updateActiveClause = function () { + this.setActiveClause(findActiveClause(this.$specContainer)); +}; + +Menu.prototype.setActiveClause = function (clause) { + this.$activeClause = clause; + this.revealInToc(this.$activeClause); +}; + +Menu.prototype.revealInToc = function (path) { + let current = this.$toc.querySelectorAll('li.revealed'); + for (let i = 0; i < current.length; i++) { + current[i].classList.remove('revealed'); + current[i].classList.remove('revealed-leaf'); + } + + current = this.$toc; + let index = 0; + outer: while (index < path.length) { + let children = current.children; + for (let i = 0; i < children.length; i++) { + if ('#' + path[index].id === children[i].children[1].hash) { + children[i].classList.add('revealed'); + if (index === path.length - 1) { + children[i].classList.add('revealed-leaf'); + let rect = children[i].getBoundingClientRect(); + // this.$toc.getBoundingClientRect().top; + let tocRect = this.$toc.getBoundingClientRect(); + if (rect.top + 10 > tocRect.bottom) { + this.$toc.scrollTop = + this.$toc.scrollTop + (rect.top - tocRect.bottom) + (rect.bottom - rect.top); + } else if (rect.top < tocRect.top) { + this.$toc.scrollTop = this.$toc.scrollTop - (tocRect.top - rect.top); + } + } + current = children[i].querySelector('ol'); + index++; + continue outer; + } + } + console.log('could not find location in table of contents', path); + break; + } +}; + +function findActiveClause(root, path) { + path = path || []; + + let visibleClauses = getVisibleClauses(root, path); + let midpoint = Math.floor(window.innerHeight / 2); + + for (let [$clause, path] of visibleClauses) { + let { top: clauseTop, bottom: clauseBottom } = $clause.getBoundingClientRect(); + let isFullyVisibleAboveTheFold = + clauseTop > 0 && clauseTop < midpoint && clauseBottom < window.innerHeight; + if (isFullyVisibleAboveTheFold) { + return path; + } + } + + visibleClauses.sort(([, pathA], [, pathB]) => pathB.length - pathA.length); + for (let [$clause, path] of visibleClauses) { + let { top: clauseTop, bottom: clauseBottom } = $clause.getBoundingClientRect(); + let $header = $clause.querySelector('h1'); + let clauseStyles = getComputedStyle($clause); + let marginTop = Math.max( + 0, + parseInt(clauseStyles['margin-top']), + parseInt(getComputedStyle($header)['margin-top']) + ); + let marginBottom = Math.max(0, parseInt(clauseStyles['margin-bottom'])); + let crossesMidpoint = + clauseTop - marginTop <= midpoint && clauseBottom + marginBottom >= midpoint; + if (crossesMidpoint) { + return path; + } + } + + return path; +} + +function getVisibleClauses(root, path) { + let childClauses = getChildClauses(root); + path = path || []; + + let result = []; + + let seenVisibleClause = false; + for (let $clause of childClauses) { + let { top: clauseTop, bottom: clauseBottom } = $clause.getBoundingClientRect(); + let isPartiallyVisible = + (clauseTop > 0 && clauseTop < window.innerHeight) || + (clauseBottom > 0 && clauseBottom < window.innerHeight) || + (clauseTop < 0 && clauseBottom > window.innerHeight); + + if (isPartiallyVisible) { + seenVisibleClause = true; + let innerPath = path.concat($clause); + result.push([$clause, innerPath]); + result.push(...getVisibleClauses($clause, innerPath)); + } else if (seenVisibleClause) { + break; + } + } + + return result; +} + +function* getChildClauses(root) { + for (let el of root.children) { + switch (el.nodeName) { + // descend into + case 'EMU-IMPORT': + yield* getChildClauses(el); + break; + + // accept , , and + case 'EMU-CLAUSE': + case 'EMU-INTRO': + case 'EMU-ANNEX': + yield el; + } + } +} + +Menu.prototype.toggle = function () { + this.$menu.classList.toggle('active'); +}; + +Menu.prototype.show = function () { + this.$menu.classList.add('active'); +}; + +Menu.prototype.hide = function () { + this.$menu.classList.remove('active'); +}; + +Menu.prototype.isVisible = function () { + return this.$menu.classList.contains('active'); +}; + +Menu.prototype.showPins = function () { + this.$pins.classList.add('active'); +}; + +Menu.prototype.hidePins = function () { + this.$pins.classList.remove('active'); +}; + +Menu.prototype.addPinEntry = function (id) { + let entry = this.search.biblio.byId[id]; + if (!entry) { + // id was deleted after pin (or something) so remove it + delete this._pinnedIds[id]; + this.persistPinEntries(); + return; + } + + if (entry.type === 'clause') { + let prefix; + if (entry.number) { + prefix = entry.number + ' '; + } else { + prefix = ''; + } + // prettier-ignore + this.$pinList.innerHTML += `
  • ${prefix}${entry.titleHTML}
  • `; + } else { + this.$pinList.innerHTML += `
  • ${getKey(entry)}
  • `; + } + + if (Object.keys(this._pinnedIds).length === 0) { + this.showPins(); + } + this._pinnedIds[id] = true; + this.persistPinEntries(); +}; + +Menu.prototype.removePinEntry = function (id) { + let item = this.$pinList.querySelector(`a[href="${makeLinkToId(id)}"]`).parentNode; + this.$pinList.removeChild(item); + delete this._pinnedIds[id]; + if (Object.keys(this._pinnedIds).length === 0) { + this.hidePins(); + } + + this.persistPinEntries(); +}; + +Menu.prototype.persistPinEntries = function () { + try { + if (!window.localStorage) return; + } catch (e) { + return; + } + + localStorage.pinEntries = JSON.stringify(Object.keys(this._pinnedIds)); +}; + +Menu.prototype.loadPinEntries = function () { + try { + if (!window.localStorage) return; + } catch (e) { + return; + } + + let pinsString = window.localStorage.pinEntries; + if (!pinsString) return; + let pins = JSON.parse(pinsString); + for (let i = 0; i < pins.length; i++) { + this.addPinEntry(pins[i]); + } +}; + +Menu.prototype.togglePinEntry = function (id) { + if (!id) { + id = this.$activeClause[this.$activeClause.length - 1].id; + } + + if (this._pinnedIds[id]) { + this.removePinEntry(id); + } else { + this.addPinEntry(id); + } +}; + +Menu.prototype.selectPin = function (num) { + document.location = this.$pinList.children[num].children[0].href; +}; + +let menu; + +document.addEventListener('DOMContentLoaded', init); + +function debounce(fn, opts) { + opts = opts || {}; + let timeout; + return function (e) { + if (opts.stopPropagation) { + e.stopPropagation(); + } + let args = arguments; + if (timeout) { + clearTimeout(timeout); + } + timeout = setTimeout(() => { + timeout = null; + fn.apply(this, args); + }, 150); + }; +} + +let CLAUSE_NODES = ['EMU-CLAUSE', 'EMU-INTRO', 'EMU-ANNEX']; +function findContainer($elem) { + let parentClause = $elem.parentNode; + while (parentClause && CLAUSE_NODES.indexOf(parentClause.nodeName) === -1) { + parentClause = parentClause.parentNode; + } + return parentClause; +} + +function findLocalReferences(parentClause, name) { + let vars = parentClause.querySelectorAll('var'); + let references = []; + + for (let i = 0; i < vars.length; i++) { + let $var = vars[i]; + + if ($var.innerHTML === name) { + references.push($var); + } + } + + return references; +} + +let REFERENCED_CLASSES = Array.from({ length: 7 }, (x, i) => `referenced${i}`); +function chooseHighlightIndex(parentClause) { + let counts = REFERENCED_CLASSES.map($class => parentClause.getElementsByClassName($class).length); + // Find the earliest index with the lowest count. + let minCount = Infinity; + let index = null; + for (let i = 0; i < counts.length; i++) { + if (counts[i] < minCount) { + minCount = counts[i]; + index = i; + } + } + return index; +} + +function toggleFindLocalReferences($elem) { + let parentClause = findContainer($elem); + let references = findLocalReferences(parentClause, $elem.innerHTML); + if ($elem.classList.contains('referenced')) { + references.forEach($reference => { + $reference.classList.remove('referenced', ...REFERENCED_CLASSES); + }); + } else { + let index = chooseHighlightIndex(parentClause); + references.forEach($reference => { + $reference.classList.add('referenced', `referenced${index}`); + }); + } +} + +function installFindLocalReferences() { + document.addEventListener('click', e => { + if (e.target.nodeName === 'VAR') { + toggleFindLocalReferences(e.target); + } + }); +} + +document.addEventListener('DOMContentLoaded', installFindLocalReferences); + +// The following license applies to the fuzzysearch function +// The MIT License (MIT) +// Copyright © 2015 Nicolas Bevacqua +// Copyright © 2016 Brian Terlson +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: + +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. + +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +function fuzzysearch(searchString, haystack, caseInsensitive) { + let tlen = haystack.length; + let qlen = searchString.length; + let chunks = 1; + let finding = false; + + if (qlen > tlen) { + return false; + } + + if (qlen === tlen) { + if (searchString === haystack) { + return { caseMatch: true, chunks: 1, prefix: true }; + } else if (searchString.toLowerCase() === haystack.toLowerCase()) { + return { caseMatch: false, chunks: 1, prefix: true }; + } else { + return false; + } + } + + let j = 0; + outer: for (let i = 0; i < qlen; i++) { + let nch = searchString[i]; + while (j < tlen) { + let targetChar = haystack[j++]; + if (targetChar === nch) { + finding = true; + continue outer; + } + if (finding) { + chunks++; + finding = false; + } + } + + if (caseInsensitive) { + return false; + } + + return fuzzysearch(searchString.toLowerCase(), haystack.toLowerCase(), true); + } + + return { caseMatch: !caseInsensitive, chunks, prefix: j <= qlen }; +} + +let referencePane = { + init() { + this.$container = document.createElement('div'); + this.$container.setAttribute('id', 'references-pane-container'); + + let $spacer = document.createElement('div'); + $spacer.setAttribute('id', 'references-pane-spacer'); + $spacer.classList.add('menu-spacer'); + + this.$pane = document.createElement('div'); + this.$pane.setAttribute('id', 'references-pane'); + + this.$container.appendChild($spacer); + this.$container.appendChild(this.$pane); + + this.$header = document.createElement('div'); + this.$header.classList.add('menu-pane-header'); + this.$headerText = document.createElement('span'); + this.$header.appendChild(this.$headerText); + this.$headerRefId = document.createElement('a'); + this.$header.appendChild(this.$headerRefId); + this.$header.addEventListener('pointerdown', e => { + this.dragStart(e); + }); + + this.$closeButton = document.createElement('span'); + this.$closeButton.setAttribute('id', 'references-pane-close'); + this.$closeButton.addEventListener('click', () => { + this.deactivate(); + }); + this.$header.appendChild(this.$closeButton); + + this.$pane.appendChild(this.$header); + this.$tableContainer = document.createElement('div'); + this.$tableContainer.setAttribute('id', 'references-pane-table-container'); + + this.$table = document.createElement('table'); + this.$table.setAttribute('id', 'references-pane-table'); + + this.$tableBody = this.$table.createTBody(); + + this.$tableContainer.appendChild(this.$table); + this.$pane.appendChild(this.$tableContainer); + + menu.$specContainer.appendChild(this.$container); + }, + + activate() { + this.$container.classList.add('active'); + }, + + deactivate() { + this.$container.classList.remove('active'); + this.state = null; + }, + + showReferencesFor(entry) { + this.activate(); + this.state = { type: 'ref', id: entry.id }; + this.$headerText.textContent = 'References to '; + let newBody = document.createElement('tbody'); + let previousId; + let previousCell; + let dupCount = 0; + this.$headerRefId.innerHTML = getKey(entry); + this.$headerRefId.setAttribute('href', makeLinkToId(entry.id)); + this.$headerRefId.style.display = 'inline'; + (entry.referencingIds || []) + .map(id => { + let cid = menu.search.biblio.refParentClause[id]; + let clause = menu.search.biblio.byId[cid]; + if (clause == null) { + throw new Error('could not find clause for id ' + cid); + } + return { id, clause }; + }) + .sort((a, b) => sortByClauseNumber(a.clause, b.clause)) + .forEach(record => { + if (previousId === record.clause.id) { + previousCell.innerHTML += ` (${dupCount + 2})`; + dupCount++; + } else { + let row = newBody.insertRow(); + let cell = row.insertCell(); + cell.innerHTML = record.clause.number; + cell = row.insertCell(); + cell.innerHTML = `${record.clause.titleHTML}`; + previousCell = cell; + previousId = record.clause.id; + dupCount = 0; + } + }, this); + this.$table.removeChild(this.$tableBody); + this.$tableBody = newBody; + this.$table.appendChild(this.$tableBody); + this.autoSize(); + }, + + showSDOs(sdos, alternativeId) { + let rhs = document.getElementById(alternativeId); + let parentName = rhs.parentNode.getAttribute('name'); + let colons = rhs.parentNode.querySelector('emu-geq'); + rhs = rhs.cloneNode(true); + rhs.querySelectorAll('emu-params,emu-constraints').forEach(e => { + e.remove(); + }); + rhs.querySelectorAll('[id]').forEach(e => { + e.removeAttribute('id'); + }); + rhs.querySelectorAll('a').forEach(e => { + e.parentNode.replaceChild(document.createTextNode(e.textContent), e); + }); + + // prettier-ignore + this.$headerText.innerHTML = `Syntax-Directed Operations for
    ${parentName} ${colons.outerHTML} `; + this.$headerText.querySelector('a').append(rhs); + this.showSDOsBody(sdos, alternativeId); + }, + + showSDOsBody(sdos, alternativeId) { + this.activate(); + this.state = { type: 'sdo', id: alternativeId, html: this.$headerText.innerHTML }; + this.$headerRefId.style.display = 'none'; + let newBody = document.createElement('tbody'); + Object.keys(sdos).forEach(sdoName => { + let pair = sdos[sdoName]; + let clause = pair.clause; + let ids = pair.ids; + let first = ids[0]; + let row = newBody.insertRow(); + let cell = row.insertCell(); + cell.innerHTML = clause; + cell = row.insertCell(); + let html = '' + sdoName + ''; + for (let i = 1; i < ids.length; ++i) { + html += ' (' + (i + 1) + ')'; + } + cell.innerHTML = html; + }); + this.$table.removeChild(this.$tableBody); + this.$tableBody = newBody; + this.$table.appendChild(this.$tableBody); + this.autoSize(); + }, + + autoSize() { + this.$tableContainer.style.height = + Math.min(250, this.$table.getBoundingClientRect().height) + 'px'; + }, + + dragStart(pointerDownEvent) { + let startingMousePos = pointerDownEvent.clientY; + let startingHeight = this.$tableContainer.getBoundingClientRect().height; + let moveListener = pointerMoveEvent => { + if (pointerMoveEvent.buttons === 0) { + removeListeners(); + return; + } + let desiredHeight = startingHeight - (pointerMoveEvent.clientY - startingMousePos); + this.$tableContainer.style.height = Math.max(0, desiredHeight) + 'px'; + }; + let listenerOptions = { capture: true, passive: true }; + let removeListeners = () => { + document.removeEventListener('pointermove', moveListener, listenerOptions); + this.$header.removeEventListener('pointerup', removeListeners, listenerOptions); + this.$header.removeEventListener('pointercancel', removeListeners, listenerOptions); + }; + document.addEventListener('pointermove', moveListener, listenerOptions); + this.$header.addEventListener('pointerup', removeListeners, listenerOptions); + this.$header.addEventListener('pointercancel', removeListeners, listenerOptions); + }, +}; + +let Toolbox = { + init() { + this.$outer = document.createElement('div'); + this.$outer.classList.add('toolbox-container'); + this.$container = document.createElement('div'); + this.$container.classList.add('toolbox'); + this.$outer.appendChild(this.$container); + this.$permalink = document.createElement('a'); + this.$permalink.textContent = 'Permalink'; + this.$pinLink = document.createElement('a'); + this.$pinLink.textContent = 'Pin'; + this.$pinLink.setAttribute('href', '#'); + this.$pinLink.addEventListener('click', e => { + e.preventDefault(); + e.stopPropagation(); + menu.togglePinEntry(this.entry.id); + this.$pinLink.textContent = menu._pinnedIds[this.entry.id] ? 'Unpin' : 'Pin'; + }); + + this.$refsLink = document.createElement('a'); + this.$refsLink.setAttribute('href', '#'); + this.$refsLink.addEventListener('click', e => { + e.preventDefault(); + e.stopPropagation(); + referencePane.showReferencesFor(this.entry); + }); + this.$container.appendChild(this.$permalink); + this.$container.appendChild(document.createTextNode(' ')); + this.$container.appendChild(this.$pinLink); + this.$container.appendChild(document.createTextNode(' ')); + this.$container.appendChild(this.$refsLink); + document.body.appendChild(this.$outer); + }, + + activate(el, entry, target) { + if (el === this._activeEl) return; + sdoBox.deactivate(); + this.active = true; + this.entry = entry; + this.$pinLink.textContent = menu._pinnedIds[entry.id] ? 'Unpin' : 'Pin'; + this.$outer.classList.add('active'); + this.top = el.offsetTop - this.$outer.offsetHeight; + this.left = el.offsetLeft - 10; + this.$outer.setAttribute('style', 'left: ' + this.left + 'px; top: ' + this.top + 'px'); + this.updatePermalink(); + this.updateReferences(); + this._activeEl = el; + if (this.top < document.body.scrollTop && el === target) { + // don't scroll unless it's a small thing (< 200px) + this.$outer.scrollIntoView(); + } + }, + + updatePermalink() { + this.$permalink.setAttribute('href', makeLinkToId(this.entry.id)); + }, + + updateReferences() { + this.$refsLink.textContent = `References (${(this.entry.referencingIds || []).length})`; + }, + + activateIfMouseOver(e) { + let ref = this.findReferenceUnder(e.target); + if (ref && (!this.active || e.pageY > this._activeEl.offsetTop)) { + let entry = menu.search.biblio.byId[ref.id]; + this.activate(ref.element, entry, e.target); + } else if ( + this.active && + (e.pageY < this.top || e.pageY > this._activeEl.offsetTop + this._activeEl.offsetHeight) + ) { + this.deactivate(); + } + }, + + findReferenceUnder(el) { + while (el) { + let parent = el.parentNode; + if (el.nodeName === 'EMU-RHS' || el.nodeName === 'EMU-PRODUCTION') { + return null; + } + if ( + el.nodeName === 'H1' && + parent.nodeName.match(/EMU-CLAUSE|EMU-ANNEX|EMU-INTRO/) && + parent.id + ) { + return { element: el, id: parent.id }; + } else if (el.nodeName === 'EMU-NT') { + if ( + parent.nodeName === 'EMU-PRODUCTION' && + parent.id && + parent.id[0] !== '_' && + parent.firstElementChild === el + ) { + // return the LHS non-terminal element + return { element: el, id: parent.id }; + } + return null; + } else if ( + el.nodeName.match(/EMU-(?!CLAUSE|XREF|ANNEX|INTRO)|DFN/) && + el.id && + el.id[0] !== '_' + ) { + if ( + el.nodeName === 'EMU-FIGURE' || + el.nodeName === 'EMU-TABLE' || + el.nodeName === 'EMU-EXAMPLE' + ) { + // return the figcaption element + return { element: el.children[0].children[0], id: el.id }; + } else { + return { element: el, id: el.id }; + } + } + el = parent; + } + }, + + deactivate() { + this.$outer.classList.remove('active'); + this._activeEl = null; + this.active = false; + }, +}; + +function sortByClauseNumber(clause1, clause2) { + let c1c = clause1.number.split('.'); + let c2c = clause2.number.split('.'); + + for (let i = 0; i < c1c.length; i++) { + if (i >= c2c.length) { + return 1; + } + + let c1 = c1c[i]; + let c2 = c2c[i]; + let c1cn = Number(c1); + let c2cn = Number(c2); + + if (Number.isNaN(c1cn) && Number.isNaN(c2cn)) { + if (c1 > c2) { + return 1; + } else if (c1 < c2) { + return -1; + } + } else if (!Number.isNaN(c1cn) && Number.isNaN(c2cn)) { + return -1; + } else if (Number.isNaN(c1cn) && !Number.isNaN(c2cn)) { + return 1; + } else if (c1cn > c2cn) { + return 1; + } else if (c1cn < c2cn) { + return -1; + } + } + + if (c1c.length === c2c.length) { + return 0; + } + return -1; +} + +function makeLinkToId(id) { + let hash = '#' + id; + if (typeof idToSection === 'undefined' || !idToSection[id]) { + return hash; + } + let targetSec = idToSection[id]; + return (targetSec === 'index' ? './' : targetSec + '.html') + hash; +} + +function doShortcut(e) { + if (!(e.target instanceof HTMLElement)) { + return; + } + let target = e.target; + let name = target.nodeName.toLowerCase(); + if (name === 'textarea' || name === 'input' || name === 'select' || target.isContentEditable) { + return; + } + if (e.altKey || e.ctrlKey || e.metaKey) { + return; + } + if (e.key === 'm' && usesMultipage) { + let pathParts = location.pathname.split('/'); + let hash = location.hash; + if (pathParts[pathParts.length - 2] === 'multipage') { + if (hash === '') { + let sectionName = pathParts[pathParts.length - 1]; + if (sectionName.endsWith('.html')) { + sectionName = sectionName.slice(0, -5); + } + if (idToSection['sec-' + sectionName] !== undefined) { + hash = '#sec-' + sectionName; + } + } + location = pathParts.slice(0, -2).join('/') + '/' + hash; + } else { + location = 'multipage/' + hash; + } + } else if (e.key === 'u') { + document.documentElement.classList.toggle('show-ao-annotations'); + } else if (e.key === '?') { + document.getElementById('shortcuts-help').classList.toggle('active'); + } +} + +function init() { + menu = new Menu(); + let $container = document.getElementById('spec-container'); + $container.addEventListener( + 'mouseover', + debounce(e => { + Toolbox.activateIfMouseOver(e); + }) + ); + document.addEventListener( + 'keydown', + debounce(e => { + if (e.code === 'Escape') { + if (Toolbox.active) { + Toolbox.deactivate(); + } + document.getElementById('shortcuts-help').classList.remove('active'); + } + }) + ); +} + +document.addEventListener('keypress', doShortcut); + +document.addEventListener('DOMContentLoaded', () => { + Toolbox.init(); + referencePane.init(); +}); + +// preserve state during navigation + +function getTocPath(li) { + let path = []; + let pointer = li; + while (true) { + let parent = pointer.parentElement; + if (parent == null) { + return null; + } + let index = [].indexOf.call(parent.children, pointer); + if (index == -1) { + return null; + } + path.unshift(index); + pointer = parent.parentElement; + if (pointer == null) { + return null; + } + if (pointer.id === 'menu-toc') { + break; + } + if (pointer.tagName !== 'LI') { + return null; + } + } + return path; +} + +function activateTocPath(path) { + try { + let pointer = document.getElementById('menu-toc'); + for (let index of path) { + pointer = pointer.querySelector('ol').children[index]; + } + pointer.classList.add('active'); + } catch (e) { + // pass + } +} + +function getActiveTocPaths() { + return [...menu.$menu.querySelectorAll('.active')].map(getTocPath).filter(p => p != null); +} + +function initTOCExpansion(visibleItemLimit) { + // Initialize to a reasonable amount of TOC expansion: + // * Expand any full-breadth nesting level up to visibleItemLimit. + // * Expand any *single-item* level while under visibleItemLimit (even if that pushes over it). + + // Limit to initialization by bailing out if any parent item is already expanded. + const tocItems = Array.from(document.querySelectorAll('#menu-toc li')); + if (tocItems.some(li => li.classList.contains('active') && li.querySelector('li'))) { + return; + } + + const selfAndSiblings = maybe => Array.from(maybe?.parentNode.children ?? []); + let currentLevelItems = selfAndSiblings(tocItems[0]); + let availableCount = visibleItemLimit - currentLevelItems.length; + while (availableCount > 0 && currentLevelItems.length) { + const nextLevelItems = currentLevelItems.flatMap(li => selfAndSiblings(li.querySelector('li'))); + availableCount -= nextLevelItems.length; + if (availableCount > 0 || currentLevelItems.length === 1) { + // Expand parent items of the next level down (i.e., current-level items with children). + for (const ol of new Set(nextLevelItems.map(li => li.parentNode))) { + ol.closest('li').classList.add('active'); + } + } + currentLevelItems = nextLevelItems; + } +} + +function initState() { + if (typeof menu === 'undefined' || window.navigating) { + return; + } + const storage = typeof sessionStorage !== 'undefined' ? sessionStorage : Object.create(null); + if (storage.referencePaneState != null) { + let state = JSON.parse(storage.referencePaneState); + if (state != null) { + if (state.type === 'ref') { + let entry = menu.search.biblio.byId[state.id]; + if (entry != null) { + referencePane.showReferencesFor(entry); + } + } else if (state.type === 'sdo') { + let sdos = sdoMap[state.id]; + if (sdos != null) { + referencePane.$headerText.innerHTML = state.html; + referencePane.showSDOsBody(sdos, state.id); + } + } + delete storage.referencePaneState; + } + } + + if (storage.activeTocPaths != null) { + document.querySelectorAll('#menu-toc li.active').forEach(li => li.classList.remove('active')); + let active = JSON.parse(storage.activeTocPaths); + active.forEach(activateTocPath); + delete storage.activeTocPaths; + } else { + initTOCExpansion(20); + } + + if (storage.searchValue != null) { + let value = JSON.parse(storage.searchValue); + menu.search.$searchBox.value = value; + menu.search.search(value); + delete storage.searchValue; + } + + if (storage.tocScroll != null) { + let tocScroll = JSON.parse(storage.tocScroll); + menu.$toc.scrollTop = tocScroll; + delete storage.tocScroll; + } +} + +document.addEventListener('DOMContentLoaded', initState); + +window.addEventListener('pageshow', initState); + +window.addEventListener('beforeunload', () => { + if (!window.sessionStorage || typeof menu === 'undefined') { + return; + } + sessionStorage.referencePaneState = JSON.stringify(referencePane.state || null); + sessionStorage.activeTocPaths = JSON.stringify(getActiveTocPaths()); + sessionStorage.searchValue = JSON.stringify(menu.search.$searchBox.value); + sessionStorage.tocScroll = JSON.stringify(menu.$toc.scrollTop); +}); + +'use strict'; + +// Manually prefix algorithm step list items with hidden counter representations +// corresponding with their markers so they get selected and copied with content. +// We read list-style-type to avoid divergence with the style sheet, but +// for efficiency assume that all lists at the same nesting depth use the same +// style (except for those associated with replacement steps). +// We also precompute some initial items for each supported style type. +// https://w3c.github.io/csswg-drafts/css-counter-styles/ + +const lowerLetters = Array.from({ length: 26 }, (_, i) => + String.fromCharCode('a'.charCodeAt(0) + i) +); +// Implement the lower-alpha 'alphabetic' algorithm, +// adjusting for indexing from 0 rather than 1. +// https://w3c.github.io/csswg-drafts/css-counter-styles/#simple-alphabetic +// https://w3c.github.io/csswg-drafts/css-counter-styles/#alphabetic-system +const lowerAlphaTextForIndex = i => { + let S = ''; + for (const N = lowerLetters.length; i >= 0; i--) { + S = lowerLetters[i % N] + S; + i = Math.floor(i / N); + } + return S; +}; + +const weightedLowerRomanSymbols = Object.entries({ + m: 1000, + cm: 900, + d: 500, + cd: 400, + c: 100, + xc: 90, + l: 50, + xl: 40, + x: 10, + ix: 9, + v: 5, + iv: 4, + i: 1, +}); +// Implement the lower-roman 'additive' algorithm, +// adjusting for indexing from 0 rather than 1. +// https://w3c.github.io/csswg-drafts/css-counter-styles/#simple-numeric +// https://w3c.github.io/csswg-drafts/css-counter-styles/#additive-system +const lowerRomanTextForIndex = i => { + let value = i + 1; + let S = ''; + for (const [symbol, weight] of weightedLowerRomanSymbols) { + if (!value) break; + if (weight > value) continue; + const reps = Math.floor(value / weight); + S += symbol.repeat(reps); + value -= weight * reps; + } + return S; +}; + +// Memoize pure index-to-text functions with an exposed cache for fast retrieval. +const makeCounter = (pureGetTextForIndex, precomputeCount = 30) => { + const cache = Array.from({ length: precomputeCount }, (_, i) => pureGetTextForIndex(i)); + const getTextForIndex = i => { + if (i >= cache.length) cache[i] = pureGetTextForIndex(i); + return cache[i]; + }; + return { getTextForIndex, cache }; +}; + +const counterByStyle = { + __proto__: null, + decimal: makeCounter(i => String(i + 1)), + 'lower-alpha': makeCounter(lowerAlphaTextForIndex), + 'upper-alpha': makeCounter(i => lowerAlphaTextForIndex(i).toUpperCase()), + 'lower-roman': makeCounter(lowerRomanTextForIndex), + 'upper-roman': makeCounter(i => lowerRomanTextForIndex(i).toUpperCase()), +}; +const fallbackCounter = makeCounter(() => '?'); +const counterByDepth = []; + +function addStepNumberText( + ol, + depth = 0, + special = [...ol.classList].some(c => c.startsWith('nested-')) +) { + let counter = !special && counterByDepth[depth]; + if (!counter) { + const counterStyle = getComputedStyle(ol)['list-style-type']; + counter = counterByStyle[counterStyle]; + if (!counter) { + console.warn('unsupported list-style-type', { + ol, + counterStyle, + id: ol.closest('[id]')?.getAttribute('id'), + }); + counterByStyle[counterStyle] = fallbackCounter; + counter = fallbackCounter; + } + if (!special) { + counterByDepth[depth] = counter; + } + } + const { cache, getTextForIndex } = counter; + let i = (Number(ol.getAttribute('start')) || 1) - 1; + for (const li of ol.children) { + const marker = document.createElement('span'); + marker.textContent = `${i < cache.length ? cache[i] : getTextForIndex(i)}. `; + marker.setAttribute('aria-hidden', 'true'); + const attributesContainer = li.querySelector('.attributes-tag'); + if (attributesContainer == null) { + li.prepend(marker); + } else { + attributesContainer.insertAdjacentElement('afterend', marker); + } + for (const sublist of li.querySelectorAll(':scope > ol')) { + addStepNumberText(sublist, depth + 1, special); + } + i++; + } +} + +document.addEventListener('DOMContentLoaded', () => { + document.querySelectorAll('emu-alg > ol').forEach(ol => { + addStepNumberText(ol); + }); +}); + +'use strict'; + +// Update superscripts to not suffer misinterpretation when copied and pasted as plain text. +// For example, +// * Replace `103` with +// `103` +// so it gets pasted as `10**3` rather than `103`. +// * Replace `10-x` with +// `10-x` +// so it gets pasted as `10**-x` rather than `10-x`. +// * Replace `2a + 1` with +// `2**(a + 1)` +// so it gets pasted as `2**(a + 1)` rather than `2a + 1`. + +function makeExponentPlainTextSafe(sup) { + // Change a only if it appears to be an exponent: + // * text-only and contains only mathematical content (not e.g. `1st`) + // * contains only s and internal links (e.g. + // `2(_y_)`) + const isText = [...sup.childNodes].every(node => node.nodeType === 3); + const text = sup.textContent; + if (isText) { + if (!/^[0-9. 𝔽ℝℤ()=*×/÷±+\u2212-]+$/u.test(text)) { + return; + } + } else { + if (sup.querySelector('*:not(var, emu-xref, :scope emu-xref a)')) { + return; + } + } + + let prefix = '**'; + let suffix = ''; + + // Add wrapping parentheses unless they are already present + // or this is a simple (possibly signed) integer or single-variable exponent. + const skipParens = + /^[±+\u2212-]?(?:[0-9]+|\p{ID_Start}\p{ID_Continue}*)$/u.test(text) || + // Split on parentheses and remember them; the resulting parts must + // start and end empty (i.e., with open/close parentheses) + // and increase depth to 1 only at the first parenthesis + // to e.g. wrap `(a+1)*(b+1)` but not `((a+1)*(b+1))`. + text + .trim() + .split(/([()])/g) + .reduce((depth, s, i, parts) => { + if (s === '(') { + return depth > 0 || i === 1 ? depth + 1 : NaN; + } else if (s === ')') { + return depth > 0 ? depth - 1 : NaN; + } else if (s === '' || (i > 0 && i < parts.length - 1)) { + return depth; + } + return NaN; + }, 0) === 0; + if (!skipParens) { + prefix += '('; + suffix += ')'; + } + + sup.insertAdjacentHTML('beforebegin', ``); + if (suffix) { + sup.insertAdjacentHTML('afterend', ``); + } +} + +document.addEventListener('DOMContentLoaded', () => { + document.querySelectorAll('sup:not(.text)').forEach(sup => { + makeExponentPlainTextSafe(sup); + }); +}); + +let sdoMap = JSON.parse(`{}`); +let biblio = JSON.parse(`{"refsByClause":{"sec-intro":["_ref_0"]},"entries":[{"type":"clause","id":"sec-notes-layering","titleHTML":"Layering","number":"1.1"},{"type":"clause","id":"sec-notes-code-example","titleHTML":"Code example","number":"1.2"},{"type":"clause","id":"sec-notes","titleHTML":"Editor's notes","number":"1","referencingIds":["_ref_0"]},{"type":"clause","id":"sec-copyright-and-software-license","title":"Copyright & Software License","titleHTML":"Copyright & Software License","number":"A"}]}`); +;let usesMultipage = false \ No newline at end of file diff --git a/index.html b/index.html index b919669..2108da3 100644 --- a/index.html +++ b/index.html @@ -1,2906 +1,9 @@ - + -Pattern Matching
    +Pattern Matching
    • Toggle shortcuts help?
    • Toggle "can call user code" annotationsu
    • @@ -2909,7 +12,7 @@

    Stage 1 Draft / September 19, 2023

    Pattern Matching

    +

    Stage 1 Draft / October 29, 2023

    Pattern Matching

    Work in progress. Before continuing, please read the Editor's notes.

    + +

    30 Pattern Matching

    + + +

    30.1 Match Patterns

    +

    Syntax

    + + MatchPattern : + PrimitivePattern + + + + + + PrimitivePattern : + Literal + + + NoSubstitutionTemplate + + + + Note
    +
    value is null;
    +value is true;
    +value is 1_000_000;
    +value is "string";
    +value is `line 1
    +line 2`;
    +
    + Editor's Note
    + Preserve the interpolation syntax for (1) concerns about arbitrary expression interpolation and (2) intuitive string matching. + For example, match "com.example:method()" by +
    when `${isPackageName and let pkg}:${isIdentifier and let method}()`: ...,
    +
    +
    + +

    30.2 Match Pattern Semantics

    + + +

    30.2.1 Runtime Semantics: MatchPatternMatches

    +

    The syntax-directed operation MatchPatternMatches takes argument subject (an ECMAScript language value) and returns either a normal completion containing a Boolean or an abrupt completion. It is defined piecewise over the following productions:

    + + MatchPattern : PrimitivePattern + + +
    1. Return PrimitivePatternMatches of PrimitivePattern with arguments subject.
    +
    + + +

    30.2.2 Runtime Semantics: PrimitivePatternMatches

    +

    The syntax-directed operation PrimitivePatternMatches takes argument subject (an ECMAScript language value) and returns a Boolean. It is defined piecewise over the following productions:

    + + PrimitivePattern : Literal + + +
    1. Return SameValue(subject, ! Evaluation of Literal).
    + + PrimitivePattern : NoSubstitutionTemplate + + +
    1. Return SameValue(subject, ! Evaluation of NoSubstitutionTemplate).
    +
    +
    + +

    30.3 Abstract Operations for Pattern Matching

    +
    +
    -

    1 Editor's notes

    +

    31 Editor's notes

    -

    1.1 Layering

    +

    31.1 Layering

    The pattern-matching champion group designed this proposal with a layering approach. It does not mean the proposal is an MVP. The champion group wishes to ship the proposal as a whole when possible, but we can drop some features if there is strong pushback from the committee.

    This approach allows the champion group to consider how all features combine and also how the proposal should behave if any of the features are missing.

    A feature will have a note if

    @@ -41,7 +109,7 @@

    1.1 Layering

    -

    1.2 Code example

    +

    31.2 Code example

    The code example in the patterns section will be in one of the forms:

    value is <pattern>;
     when <pattern>: ...,
    diff --git a/spec.emu b/spec.emu index a64e0c2..9430af8 100644 --- a/spec.emu +++ b/spec.emu @@ -28,6 +28,85 @@ contributors:

    Work in progress. Before continuing, please read the .

    + +

    Pattern Matching

    + + +

    Match Patterns

    +

    Syntax

    + + MatchPattern : + PrimitivePattern + + + + PrimitivePattern : + Literal + NoSubstitutionTemplate + + +
    
    +        value is null;
    +        value is true;
    +        value is 1_000_000;
    +        value is "string";
    +        value is `line 1
    +        line 2`;
    +      
    +
    + + Preserve the interpolation syntax for (1) concerns about arbitrary expression interpolation and (2) intuitive string matching. + For example, match `"com.example:method()"` by +
    
    +        when `${isPackageName and let pkg}:${isIdentifier and let method}()`: ...,
    +      
    +
    +
    + +

    Match Pattern Semantics

    + + +

    + Runtime Semantics: MatchPatternMatches ( + _subject_: an ECMAScript language value, + ): either a normal completion containing a Boolean or an abrupt completion +

    +
    +
    + + MatchPattern : PrimitivePattern + + + 1. Return PrimitivePatternMatches of |PrimitivePattern| with arguments _subject_. + +
    + + +

    + Runtime Semantics: PrimitivePatternMatches ( + _subject_: an ECMAScript language value, + ): a Boolean +

    +
    +
    + + PrimitivePattern : Literal + + + 1. Return SameValue(_subject_, ! Evaluation of |Literal|). + + + PrimitivePattern : NoSubstitutionTemplate + + + 1. Return SameValue(_subject_, ! Evaluation of |NoSubstitutionTemplate|). + +
    +
    + +

    Abstract Operations for Pattern Matching

    +
    +

    Editor's notes

    From a53e2258524d380494c67693c8724a795bb1dd72 Mon Sep 17 00:00:00 2001 From: Jack Works Date: Sun, 29 Oct 2023 13:12:02 +0800 Subject: [PATCH 11/71] Add MemberExpressionPattern --- assets/ecmarkup.js | 4 +-- index.html | 69 ++++++++++++++++++++++++++++++++++++++++------ spec.emu | 59 ++++++++++++++++++++++++++++++++++++++- 3 files changed, 121 insertions(+), 11 deletions(-) diff --git a/assets/ecmarkup.js b/assets/ecmarkup.js index fe7aa13..3a49be1 100644 --- a/assets/ecmarkup.js +++ b/assets/ecmarkup.js @@ -1524,6 +1524,6 @@ document.addEventListener('DOMContentLoaded', () => { }); }); -let sdoMap = JSON.parse(`{"prod-NnfvhTBM":{"MatchPatternMatches":{"clause":"30.2.1","ids":["prod-6fPS70C2"]}},"prod-lZG2aTTb":{"PrimitivePatternMatches":{"clause":"30.2.2","ids":["prod-mlLTmHeP"]}},"prod-rqU7_eLx":{"PrimitivePatternMatches":{"clause":"30.2.2","ids":["prod-eFLzsKUd"]}}}`); -let biblio = JSON.parse(`{"refsByClause":{"sec-intro":["_ref_0"],"sec-match-pattern-matches":["_ref_1","_ref_3","_ref_4"],"sec-match-patterns":["_ref_2"]},"entries":[{"type":"production","id":"prod-MatchPattern","name":"MatchPattern"},{"type":"production","id":"prod-PrimitivePattern","name":"PrimitivePattern","referencingIds":["_ref_2","_ref_3","_ref_4"]},{"type":"clause","id":"sec-match-patterns","titleHTML":"Match Patterns","number":"30.1"},{"type":"op","aoid":"MatchPatternMatches","refId":"sec-match-pattern-matches"},{"type":"clause","id":"sec-match-pattern-matches","titleHTML":"Runtime Semantics: MatchPatternMatches","number":"30.2.1"},{"type":"op","aoid":"PrimitivePatternMatches","refId":"sec-primitive-pattern-matches"},{"type":"clause","id":"sec-primitive-pattern-matches","titleHTML":"Runtime Semantics: PrimitivePatternMatches","number":"30.2.2","referencingIds":["_ref_1"]},{"type":"clause","id":"sec-match-pattern-semantics","titleHTML":"Match Pattern Semantics","number":"30.2"},{"type":"clause","id":"sec-abstract-operations-for-pattern-matching","titleHTML":"Abstract Operations for Pattern Matching","number":"30.3"},{"type":"clause","id":"sec-pattern-matching","title":"Pattern Matching","titleHTML":"Pattern Matching","number":"30"},{"type":"clause","id":"sec-notes-layering","titleHTML":"Layering","number":"31.1"},{"type":"clause","id":"sec-notes-code-example","titleHTML":"Code example","number":"31.2"},{"type":"clause","id":"sec-notes","titleHTML":"Editor's notes","number":"31","referencingIds":["_ref_0"]},{"type":"clause","id":"sec-copyright-and-software-license","title":"Copyright & Software License","titleHTML":"Copyright & Software License","number":"A"}]}`); +let sdoMap = JSON.parse(`{"prod-NnfvhTBM":{"MatchPatternMatches":{"clause":"30.2.1","ids":["prod-6fPS70C2"]}},"prod-dtu4srcz":{"MatchPatternMatches":{"clause":"30.2.1","ids":["prod-vBMoWeeV"]}},"prod-lZG2aTTb":{"PrimitivePatternMatches":{"clause":"30.2.2","ids":["prod-mlLTmHeP"]}},"prod-rqU7_eLx":{"PrimitivePatternMatches":{"clause":"30.2.2","ids":["prod-eFLzsKUd"]}},"prod-G4gXeSPg":{"MemberExpressionPatternMatches":{"clause":"30.2.3","ids":["prod--tiCo4Kg"]}}}`); +let biblio = JSON.parse(`{"refsByClause":{"sec-intro":["_ref_0"],"sec-match-pattern-matches":["_ref_1","_ref_2","_ref_8","_ref_9","_ref_10","_ref_11"],"sec-match-patterns":["_ref_3","_ref_4","_ref_5","_ref_6","_ref_7"],"sec-member-expression-pattern-matches":["_ref_12","_ref_13"]},"entries":[{"type":"production","id":"prod-MatchPattern","name":"MatchPattern"},{"type":"production","id":"prod-PrimitivePattern","name":"PrimitivePattern","referencingIds":["_ref_3","_ref_8","_ref_9"]},{"type":"production","id":"prod-MemberExpressionPattern","name":"MemberExpressionPattern","referencingIds":["_ref_4","_ref_6","_ref_7","_ref_10","_ref_11"]},{"type":"production","id":"prod-PatternMatchingMemberExpression","name":"PatternMatchingMemberExpression","referencingIds":["_ref_5","_ref_12","_ref_13"]},{"type":"clause","id":"sec-match-patterns","titleHTML":"Match Patterns","number":"30.1"},{"type":"op","aoid":"MatchPatternMatches","refId":"sec-match-pattern-matches"},{"type":"clause","id":"sec-match-pattern-matches","titleHTML":"Runtime Semantics: MatchPatternMatches","number":"30.2.1"},{"type":"op","aoid":"PrimitivePatternMatches","refId":"sec-primitive-pattern-matches"},{"type":"clause","id":"sec-primitive-pattern-matches","titleHTML":"Runtime Semantics: PrimitivePatternMatches","number":"30.2.2","referencingIds":["_ref_1"]},{"type":"op","aoid":"MemberExpressionPatternMatches","refId":"sec-member-expression-pattern-matches"},{"type":"clause","id":"sec-member-expression-pattern-matches","titleHTML":"Runtime Semantics: MemberExpressionPatternMatches","number":"30.2.3","referencingIds":["_ref_2"]},{"type":"clause","id":"sec-match-pattern-semantics","titleHTML":"Match Pattern Semantics","number":"30.2"},{"type":"clause","id":"sec-abstract-operations-for-pattern-matching","titleHTML":"Abstract Operations for Pattern Matching","number":"30.3"},{"type":"clause","id":"sec-pattern-matching","title":"Pattern Matching","titleHTML":"Pattern Matching","number":"30"},{"type":"clause","id":"sec-notes-layering","titleHTML":"Layering","number":"31.1"},{"type":"clause","id":"sec-notes-code-example","titleHTML":"Code example","number":"31.2"},{"type":"clause","id":"sec-notes","titleHTML":"Editor's notes","number":"31","referencingIds":["_ref_0"]},{"type":"clause","id":"sec-copyright-and-software-license","title":"Copyright & Software License","titleHTML":"Copyright & Software License","number":"A"}]}`); ;let usesMultipage = false \ No newline at end of file diff --git a/index.html b/index.html index 33ef558..10e4242 100644 --- a/index.html +++ b/index.html @@ -3,7 +3,7 @@ -Pattern Matching
    +Pattern Matching
    • Toggle shortcuts help?
    • Toggle "can call user code" annotationsu
    • @@ -12,7 +12,7 @@

    Stage 1 Draft / October 29, 2023

    Pattern Matching

    +

    Stage 1 Draft / October 29, 2023

    Pattern Matching

    Work in progress. Before continuing, please read the Editor's notes.

    @@ -34,14 +42,22 @@

    30 Pattern Matching

    30.1 Match Patterns

    Syntax

    - MatchPattern[Yield, Await] : - PrimitivePattern + MatchPattern[Yield, Await] : + ( + MatchPattern[?Yield, ?Await] + ) + + + PrimitivePattern - MemberExpressionPattern[?Yield, ?Await] + MemberExpressionPattern[?Yield, ?Await] - UnaryAlgebraicPattern[?Yield, ?Await] + UnaryAlgebraicPattern[?Yield, ?Await] + + + CombinedMatchPattern[?Yield, ?Await] @@ -74,7 +90,7 @@

    Syntax

    MemberExpressionPattern[Yield, Await] : - PatternMatchingMemberExpression[?Yield, ?Await] + PatternMatchingMemberExpression[?Yield, ?Await] @@ -82,7 +98,7 @@

    Syntax

    IdentifierReference[?Yield, ?Await] - MemberExpressionPattern[?Yield, ?Await] + MemberExpressionPattern[?Yield, ?Await] . IdentifierName @@ -93,7 +109,7 @@

    Syntax

    value is Math.PI;
    Editor's Note
    - The MemberExpressionPattern . IdentifierName production is removable. + The MemberExpressionPattern . IdentifierName production is removable.
    value is Math.PI;
     // can be written as:
     const { PI } = Math;
    @@ -108,11 +124,11 @@ 

    Syntax

    UnaryAlgebraicPattern[Yield, Await] : + - PatternMatchingMemberExpression[?Yield, ?Await] + PatternMatchingMemberExpression[?Yield, ?Await] - - PatternMatchingMemberExpression[?Yield, ?Await] + PatternMatchingMemberExpression[?Yield, ?Await] + @@ -137,6 +153,78 @@

    Syntax

    value is negInf;
    + + + + CombinedMatchPattern[Yield, Await] : + MatchPattern[?Yield, ?Await] + and + MatchPattern[?Yield, ?Await] + + + MatchPattern[?Yield, ?Await] + or + MatchPattern[?Yield, ?Await] + + + not + MatchPattern[?Yield, ?Await] + + + + Note 4
    +
    value is not 0;
    +value is "true" or "yes";
    +
    + + + +

    30.1.1 Static Semantics: Early Errors

    + + CombinedMatchPattern : + MatchPattern + and + MatchPattern + + + + + + CombinedMatchPattern : + MatchPattern + or + MatchPattern + + + + + + CombinedMatchPattern : + not + MatchPattern + + + + + Note
    value is a and b and c; // no Syntax Error
    +value is a or b or c; // no Syntax Error
    +
    +value is a and b or c; // Syntax Error
    +value is (a and b) or c; // no Syntax Error
    +value is a and (b or c); // no Syntax Error
    +
    +value is not not a; // Syntax Error
    +value is not (not a); // no Syntax Error
    +
    +value is not a or b; // Syntax Error
    +value is not (a or b); // no Syntax Error
    +

    30.2 Match Pattern Semantics

    @@ -145,20 +233,34 @@

    30.2 Match Pattern Semantics

    30.2.1 Runtime Semantics: MatchPatternMatches

    The syntax-directed operation MatchPatternMatches takes argument subject (an ECMAScript language value) and returns either a normal completion containing a Boolean or an abrupt completion. It is defined piecewise over the following productions:

    - MatchPattern : PrimitivePattern + MatchPattern : + ( + MatchPattern + ) + + + +
    1. Return ? MatchPatternMatches of MatchPattern with arguments subject.
    + + MatchPattern : PrimitivePattern + + +
    1. Return PrimitivePatternMatches of PrimitivePattern with arguments subject.
    + + MatchPattern : MemberExpressionPattern -
    1. Return PrimitivePatternMatches of PrimitivePattern with arguments subject.
    +
    1. Return ? MemberExpressionPatternMatches of MemberExpressionPattern with arguments subject.
    - MatchPattern : MemberExpressionPattern + MatchPattern : UnaryAlgebraicPattern -
    1. Return ? MemberExpressionPatternMatches of MemberExpressionPattern with arguments subject.
    +
    1. Return ? UnaryAlgebraicPatternMatches of UnaryAlgebraicPattern with arguments subject.
    - MatchPattern : UnaryAlgebraicPattern + MatchPattern : CombinedMatchPattern -
    1. Return ? UnaryAlgebraicPatternMatches of UnaryAlgebraicPattern with arguments subject.
    +
    1. Return ? CombinedMatchPatternMatches of CombinedMatchPattern with arguments subject.
    @@ -180,10 +282,10 @@

    30.2.2 Runtime Semantics: PrimitivePatternMatche

    30.2.3 Runtime Semantics: MemberExpressionPatternMatches

    The syntax-directed operation MemberExpressionPatternMatches takes argument subject (an ECMAScript language value) and returns either a normal completion containing a Boolean or an abrupt completion. It is defined piecewise over the following productions:

    - MemberExpressionPattern : PatternMatchingMemberExpression + MemberExpressionPattern : PatternMatchingMemberExpression -
    1. Let expr be the MemberExpression that is covered by PatternMatchingMemberExpression.
    2. Let ref be ? Evaluation of expr.
    3. Let value be ? GetValue(ref).
    4. Return SameValueZero(subject, value).
    +
    1. Let expr be the MemberExpression that is covered by PatternMatchingMemberExpression.
    2. Let ref be ? Evaluation of expr.
    3. Let value be ? GetValue(ref).
    4. Return SameValueZero(subject, value).
    @@ -192,7 +294,38 @@

    30.2.4 Runtime Semantics: UnaryAlgebraicPatternM UnaryAlgebraicPattern : -
    1. Let expr be the MemberExpression that is covered by UnaryAlgebraicPattern.
    2. Let ref be ? Evaluation of expr.
    3. Let value be ? GetValue(ref).
    4. Return SameValue(subject, value).
    +
    1. Let expr be the MemberExpression that is covered by UnaryAlgebraicPattern.
    2. Let ref be ? Evaluation of expr.
    3. Let value be ? GetValue(ref).
    4. Return SameValue(subject, value).
    + + + +

    30.2.5 Runtime Semantics: CombinedMatchPatternMatches

    +

    The syntax-directed operation CombinedMatchPatternMatches takes argument subject (an ECMAScript language value) and returns either a normal completion containing a Boolean or an abrupt completion. It is defined piecewise over the following productions:

    + + CombinedMatchPattern : + MatchPattern + and + MatchPattern + + + +
    1. Let leftMatches be ? MatchPatternMatches of the first MatchPattern with arguments subject.
    2. If leftMatches is false, return false.
    3. Return ? MatchPatternMatches of the second MatchPattern with arguments subject.
    + + CombinedMatchPattern : + MatchPattern + or + MatchPattern + + + +
    1. Let leftMatches be ? MatchPatternMatches of the first MatchPattern with arguments subject.
    2. If leftMatches is true, return true.
    3. Return ? MatchPatternMatches of the second MatchPattern with arguments subject.
    + + CombinedMatchPattern : + not + MatchPattern + + + +
    1. Let matches be ? MatchPatternMatches of MatchPattern with arguments subject.
    2. If matches is true, return false.
    3. Return true.
    diff --git a/spec.emu b/spec.emu index 735789d..ec1eb63 100644 --- a/spec.emu +++ b/spec.emu @@ -25,6 +25,14 @@ contributors: emu-note[code] pre { margin: 0; } + pre.inline { + display: inline; + } + pre.inline code { + display: inline; + font-style: italic; + text-decoration: underline; + }

    Work in progress. Before continuing, please read the .

    @@ -36,9 +44,11 @@ contributors:

    Syntax

    MatchPattern[Yield, Await] : + `(` MatchPattern[?Yield, ?Await] `)` PrimitivePattern MemberExpressionPattern[?Yield, ?Await] UnaryAlgebraicPattern[?Yield, ?Await] + CombinedMatchPattern[?Yield, ?Await] @@ -120,6 +130,60 @@ contributors: + + + + CombinedMatchPattern[Yield, Await] : + MatchPattern[?Yield, ?Await] `and` MatchPattern[?Yield, ?Await] + MatchPattern[?Yield, ?Await] `or` MatchPattern[?Yield, ?Await] + `not` MatchPattern[?Yield, ?Await] + + +
    
    +        value is not 0;
    +        value is "true" or "yes";
    +      
    +
    + + + +

    Static Semantics: Early Errors

    + + CombinedMatchPattern : + MatchPattern `and` MatchPattern + +
      +
    • It is a Syntax Error if either of |MatchPattern| is a |CombinedMatchPattern| and does not match this production.
    • +
    + + CombinedMatchPattern : + MatchPattern `or` MatchPattern + +
      +
    • It is a Syntax Error if either of |MatchPattern| is a |CombinedMatchPattern| and does not match this production.
    • +
    + + CombinedMatchPattern : + `not` MatchPattern + +
      +
    • It is a Syntax Error if the |MatchPattern| is a |CombinedMatchPattern|.
    • +
    +
    
    +        value is a and b and c; // no Syntax Error
    +        value is a or b or c; // no Syntax Error
    +
    +        value is a and b or c; // Syntax Error
    +        value is (a and b) or c; // no Syntax Error
    +        value is a and (b or c); // no Syntax Error
    +
    +        value is not not a; // Syntax Error
    +        value is not (not a); // no Syntax Error
    +
    +        value is not a or b; // Syntax Error
    +        value is not (a or b); // no Syntax Error
    +      
    +

    Match Pattern Semantics

    @@ -132,6 +196,12 @@ contributors:

    + + MatchPattern : `(` MatchPattern `)` + + + 1. Return ? MatchPatternMatches of |MatchPattern| with arguments _subject_. + MatchPattern : PrimitivePattern @@ -150,6 +220,12 @@ contributors: 1. Return ? UnaryAlgebraicPatternMatches of |UnaryAlgebraicPattern| with arguments _subject_. + + MatchPattern : CombinedMatchPattern + + + 1. Return ? CombinedMatchPatternMatches of |CombinedMatchPattern| with arguments _subject_. +
    @@ -211,6 +287,40 @@ contributors: 1. Return SameValue(_subject_, _value_). + + +

    + Runtime Semantics: CombinedMatchPatternMatches ( + _subject_: an ECMAScript language value, + ): either a normal completion containing a Boolean or an abrupt completion +

    +
    +
    + + CombinedMatchPattern : MatchPattern `and` MatchPattern + + + 1. Let _leftMatches_ be ? MatchPatternMatches of the first |MatchPattern| with arguments _subject_. + 1. If _leftMatches_ is *false*, return *false*. + 1. Return ? MatchPatternMatches of the second |MatchPattern| with arguments _subject_. + + + CombinedMatchPattern : MatchPattern `or` MatchPattern + + + 1. Let _leftMatches_ be ? MatchPatternMatches of the first |MatchPattern| with arguments _subject_. + 1. If _leftMatches_ is *true*, return *true*. + 1. Return ? MatchPatternMatches of the second |MatchPattern| with arguments _subject_. + + + CombinedMatchPattern : `not` MatchPattern + + + 1. Let _matches_ be ? MatchPatternMatches of |MatchPattern| with arguments _subject_. + 1. If _matches_ is *true*, return *false*. + 1. Return *true*. + +

    Abstract Operations for Pattern Matching

    From fb4717e76a9ebe28720826bf2034a7dee773e94a Mon Sep 17 00:00:00 2001 From: Jack Works Date: Sun, 29 Oct 2023 15:56:15 +0800 Subject: [PATCH 14/71] Add custom matcher --- assets/ecmarkup.js | 2 +- index.html | 155 ++++++++++++++++++++++++++++++--------------- spec.emu | 82 +++++++++++++++++++++++- 3 files changed, 186 insertions(+), 53 deletions(-) diff --git a/assets/ecmarkup.js b/assets/ecmarkup.js index 17b9da6..3709b79 100644 --- a/assets/ecmarkup.js +++ b/assets/ecmarkup.js @@ -1525,5 +1525,5 @@ document.addEventListener('DOMContentLoaded', () => { }); let sdoMap = JSON.parse(`{"prod-KUcUUgsn":{"MatchPatternMatches":{"clause":"30.2.1","ids":["prod-U80C8biY"]}},"prod-NnfvhTBM":{"MatchPatternMatches":{"clause":"30.2.1","ids":["prod-6fPS70C2"]}},"prod-dtu4srcz":{"MatchPatternMatches":{"clause":"30.2.1","ids":["prod-vBMoWeeV"]}},"prod-en0pW04U":{"MatchPatternMatches":{"clause":"30.2.1","ids":["prod-MW-Egi0C"]}},"prod-LAj8DpMp":{"MatchPatternMatches":{"clause":"30.2.1","ids":["prod-EquXXU0V"]}},"prod-lZG2aTTb":{"PrimitivePatternMatches":{"clause":"30.2.2","ids":["prod-mlLTmHeP"]}},"prod-rqU7_eLx":{"PrimitivePatternMatches":{"clause":"30.2.2","ids":["prod-eFLzsKUd"]}},"prod-G4gXeSPg":{"MemberExpressionPatternMatches":{"clause":"30.2.3","ids":["prod--tiCo4Kg"]}},"prod-a_2cW9fV":{"CombinedMatchPatternMatches":{"clause":"30.2.5","ids":["prod-TGrK8XcZ"]}},"prod-BMX8uZDG":{"CombinedMatchPatternMatches":{"clause":"30.2.5","ids":["prod-hYdo8hkU"]}},"prod-4IhLPseH":{"CombinedMatchPatternMatches":{"clause":"30.2.5","ids":["prod-_QtiVeJ1"]}}}`); -let biblio = JSON.parse(`{"refsByClause":{"sec-intro":["_ref_0"],"sec-match-pattern-matches":["_ref_1","_ref_2","_ref_3","_ref_4","_ref_5","_ref_37","_ref_38","_ref_39","_ref_40","_ref_41","_ref_42","_ref_43","_ref_44","_ref_45","_ref_46"],"sec-combined-match-pattern-matches":["_ref_6","_ref_7","_ref_8","_ref_9","_ref_10","_ref_50","_ref_51","_ref_52","_ref_53","_ref_54","_ref_55","_ref_56","_ref_57","_ref_58","_ref_59"],"sec-match-patterns":["_ref_11","_ref_12","_ref_13","_ref_14","_ref_15","_ref_16","_ref_17","_ref_18","_ref_19","_ref_20","_ref_21","_ref_22","_ref_23","_ref_24","_ref_25"],"sec-match-patterns-early-errors":["_ref_26","_ref_27","_ref_28","_ref_29","_ref_30","_ref_31","_ref_32","_ref_33","_ref_34","_ref_35","_ref_36"],"sec-member-expression-pattern-matches":["_ref_47","_ref_48"],"sec-unary-algebraic-pattern-matches":["_ref_49"]},"entries":[{"type":"production","id":"prod-MatchPattern","name":"MatchPattern","referencingIds":["_ref_11","_ref_21","_ref_22","_ref_23","_ref_24","_ref_25","_ref_26","_ref_27","_ref_28","_ref_30","_ref_31","_ref_32","_ref_34","_ref_35","_ref_37","_ref_38","_ref_50","_ref_51","_ref_52","_ref_53","_ref_54","_ref_55","_ref_56","_ref_57","_ref_58","_ref_59"]},{"type":"production","id":"prod-PrimitivePattern","name":"PrimitivePattern","referencingIds":["_ref_12","_ref_39","_ref_40"]},{"type":"production","id":"prod-MemberExpressionPattern","name":"MemberExpressionPattern","referencingIds":["_ref_13","_ref_17","_ref_18","_ref_41","_ref_42"]},{"type":"production","id":"prod-PatternMatchingMemberExpression","name":"PatternMatchingMemberExpression","referencingIds":["_ref_16","_ref_19","_ref_20","_ref_47","_ref_48"]},{"type":"production","id":"prod-UnaryAlgebraicPattern","name":"UnaryAlgebraicPattern","referencingIds":["_ref_14","_ref_43","_ref_44","_ref_49"]},{"type":"production","id":"prod-CombinedMatchPattern","name":"CombinedMatchPattern","referencingIds":["_ref_15","_ref_29","_ref_33","_ref_36","_ref_45","_ref_46"]},{"type":"clause","id":"sec-match-patterns-early-errors","titleHTML":"Static Semantics: Early Errors","number":"30.1.1"},{"type":"clause","id":"sec-match-patterns","titleHTML":"Match Patterns","number":"30.1"},{"type":"op","aoid":"MatchPatternMatches","refId":"sec-match-pattern-matches"},{"type":"clause","id":"sec-match-pattern-matches","titleHTML":"Runtime Semantics: MatchPatternMatches","number":"30.2.1","referencingIds":["_ref_1","_ref_6","_ref_7","_ref_8","_ref_9","_ref_10"]},{"type":"op","aoid":"PrimitivePatternMatches","refId":"sec-primitive-pattern-matches"},{"type":"clause","id":"sec-primitive-pattern-matches","titleHTML":"Runtime Semantics: PrimitivePatternMatches","number":"30.2.2","referencingIds":["_ref_2"]},{"type":"op","aoid":"MemberExpressionPatternMatches","refId":"sec-member-expression-pattern-matches"},{"type":"clause","id":"sec-member-expression-pattern-matches","titleHTML":"Runtime Semantics: MemberExpressionPatternMatches","number":"30.2.3","referencingIds":["_ref_3"]},{"type":"op","aoid":"UnaryAlgebraicPatternMatches","refId":"sec-unary-algebraic-pattern-matches"},{"type":"clause","id":"sec-unary-algebraic-pattern-matches","titleHTML":"Runtime Semantics: UnaryAlgebraicPatternMatches","number":"30.2.4","referencingIds":["_ref_4"]},{"type":"op","aoid":"CombinedMatchPatternMatches","refId":"sec-combined-match-pattern-matches"},{"type":"clause","id":"sec-combined-match-pattern-matches","titleHTML":"Runtime Semantics: CombinedMatchPatternMatches","number":"30.2.5","referencingIds":["_ref_5"]},{"type":"clause","id":"sec-match-pattern-semantics","titleHTML":"Match Pattern Semantics","number":"30.2"},{"type":"clause","id":"sec-abstract-operations-for-pattern-matching","titleHTML":"Abstract Operations for Pattern Matching","number":"30.3"},{"type":"clause","id":"sec-pattern-matching","title":"Pattern Matching","titleHTML":"Pattern Matching","number":"30"},{"type":"clause","id":"sec-notes-layering","titleHTML":"Layering","number":"31.1"},{"type":"clause","id":"sec-notes-code-example","titleHTML":"Code example","number":"31.2"},{"type":"clause","id":"sec-notes","titleHTML":"Editor's notes","number":"31","referencingIds":["_ref_0"]},{"type":"clause","id":"sec-copyright-and-software-license","title":"Copyright & Software License","titleHTML":"Copyright & Software License","number":"A"}]}`); +let biblio = JSON.parse(`{"refsByClause":{"sec-intro":["_ref_0"],"sec-match-pattern-matches":["_ref_1","_ref_2","_ref_3","_ref_4","_ref_5","_ref_6","_ref_46","_ref_47","_ref_48","_ref_49","_ref_50","_ref_51","_ref_52","_ref_53","_ref_54","_ref_55"],"sec-primitive-pattern-matches":["_ref_7"],"sec-member-expression-pattern-matches":["_ref_8","_ref_9","_ref_56","_ref_57"],"sec-unary-algebraic-pattern-matches":["_ref_10","_ref_58"],"sec-combined-match-pattern-matches":["_ref_11","_ref_12","_ref_13","_ref_14","_ref_15","_ref_16","_ref_59","_ref_60","_ref_61","_ref_62","_ref_63","_ref_64","_ref_65","_ref_66","_ref_67","_ref_68"],"sec-invoke-custom-matcher":["_ref_17","_ref_18","_ref_19"],"sec-match-patterns":["_ref_20","_ref_21","_ref_22","_ref_23","_ref_24","_ref_25","_ref_26","_ref_27","_ref_28","_ref_29","_ref_30","_ref_31","_ref_32","_ref_33","_ref_34"],"sec-match-patterns-early-errors":["_ref_35","_ref_36","_ref_37","_ref_38","_ref_39","_ref_40","_ref_41","_ref_42","_ref_43","_ref_44","_ref_45"]},"entries":[{"type":"table","id":"table-1","number":1,"caption":"Table 1: Well-known Symbols"},{"type":"term","term":"@@customMatcher","refId":"sec-well-known-symbols"},{"type":"clause","id":"sec-well-known-symbols","titleHTML":"Well-Known Symbols","number":"6.1.5.1","referencingIds":["_ref_19"]},{"type":"clause","id":"sec-ecmascript-language-types-symbol-type","titleHTML":"The Symbol Type","number":"6.1.5"},{"type":"clause","id":"sec-ecmascript-language-types","titleHTML":"ECMAScript Language Types","number":"6.1","referencingIds":["_ref_1","_ref_7","_ref_8","_ref_10","_ref_11","_ref_17","_ref_18"]},{"type":"op","aoid":"Type","refId":"sec-ecmascript-data-types-and-values"},{"type":"clause","id":"sec-ecmascript-data-types-and-values","titleHTML":"ECMAScript Data Types and Values","number":"6"},{"type":"production","id":"prod-MatchPattern","name":"MatchPattern","referencingIds":["_ref_20","_ref_30","_ref_31","_ref_32","_ref_33","_ref_34","_ref_35","_ref_36","_ref_37","_ref_39","_ref_40","_ref_41","_ref_43","_ref_44","_ref_46","_ref_47","_ref_59","_ref_60","_ref_61","_ref_62","_ref_63","_ref_64","_ref_65","_ref_66","_ref_67","_ref_68"]},{"type":"production","id":"prod-PrimitivePattern","name":"PrimitivePattern","referencingIds":["_ref_21","_ref_48","_ref_49"]},{"type":"production","id":"prod-MemberExpressionPattern","name":"MemberExpressionPattern","referencingIds":["_ref_22","_ref_26","_ref_27","_ref_50","_ref_51"]},{"type":"production","id":"prod-PatternMatchingMemberExpression","name":"PatternMatchingMemberExpression","referencingIds":["_ref_25","_ref_28","_ref_29","_ref_56","_ref_57"]},{"type":"production","id":"prod-UnaryAlgebraicPattern","name":"UnaryAlgebraicPattern","referencingIds":["_ref_23","_ref_52","_ref_53","_ref_58"]},{"type":"production","id":"prod-CombinedMatchPattern","name":"CombinedMatchPattern","referencingIds":["_ref_24","_ref_38","_ref_42","_ref_45","_ref_54","_ref_55"]},{"type":"clause","id":"sec-match-patterns-early-errors","titleHTML":"Static Semantics: Early Errors","number":"30.1.1"},{"type":"clause","id":"sec-match-patterns","titleHTML":"Match Patterns","number":"30.1"},{"type":"op","aoid":"MatchPatternMatches","refId":"sec-match-pattern-matches"},{"type":"clause","id":"sec-match-pattern-matches","titleHTML":"Runtime Semantics: MatchPatternMatches","number":"30.2.1","referencingIds":["_ref_2","_ref_12","_ref_13","_ref_14","_ref_15","_ref_16"]},{"type":"op","aoid":"PrimitivePatternMatches","refId":"sec-primitive-pattern-matches"},{"type":"clause","id":"sec-primitive-pattern-matches","titleHTML":"Runtime Semantics: PrimitivePatternMatches","number":"30.2.2","referencingIds":["_ref_3"]},{"type":"op","aoid":"MemberExpressionPatternMatches","refId":"sec-member-expression-pattern-matches"},{"type":"clause","id":"sec-member-expression-pattern-matches","titleHTML":"Runtime Semantics: MemberExpressionPatternMatches","number":"30.2.3","referencingIds":["_ref_4"]},{"type":"op","aoid":"UnaryAlgebraicPatternMatches","refId":"sec-unary-algebraic-pattern-matches"},{"type":"clause","id":"sec-unary-algebraic-pattern-matches","titleHTML":"Runtime Semantics: UnaryAlgebraicPatternMatches","number":"30.2.4","referencingIds":["_ref_5"]},{"type":"op","aoid":"CombinedMatchPatternMatches","refId":"sec-combined-match-pattern-matches"},{"type":"clause","id":"sec-combined-match-pattern-matches","titleHTML":"Runtime Semantics: CombinedMatchPatternMatches","number":"30.2.5","referencingIds":["_ref_6"]},{"type":"clause","id":"sec-match-pattern-semantics","titleHTML":"Match Pattern Semantics","number":"30.2"},{"type":"op","aoid":"InvokeCustomMatcher","refId":"sec-invoke-custom-matcher"},{"type":"clause","id":"sec-invoke-custom-matcher","title":"InvokeCustomMatcher ( matcher, subject, kind )","titleHTML":"InvokeCustomMatcher ( matcher, subject, kind )","number":"30.3.1","referencingIds":["_ref_9"]},{"type":"clause","id":"sec-abstract-operations-for-pattern-matching","titleHTML":"Abstract Operations for Pattern Matching","number":"30.3"},{"type":"clause","id":"sec-pattern-matching","title":"Pattern Matching","titleHTML":"Pattern Matching","number":"30"},{"type":"clause","id":"sec-notes-layering","titleHTML":"Layering","number":"31.1"},{"type":"clause","id":"sec-notes-code-example","titleHTML":"Code example","number":"31.2"},{"type":"clause","id":"sec-notes","titleHTML":"Editor's notes","number":"31","referencingIds":["_ref_0"]},{"type":"clause","id":"sec-copyright-and-software-license","title":"Copyright & Software License","titleHTML":"Copyright & Software License","number":"A"}]}`); ;let usesMultipage = false \ No newline at end of file diff --git a/index.html b/index.html index 7ab1376..20b78fa 100644 --- a/index.html +++ b/index.html @@ -3,7 +3,7 @@ -Pattern Matching
    +Pattern Matching
    • Toggle shortcuts help?
    • Toggle "can call user code" annotationsu
    • @@ -12,7 +12,7 @@

    Stage 1 Draft / October 29, 2023

    Pattern Matching

    +

    Stage 1 Draft / October 29, 2023

    Pattern Matching

    Work in progress. Before continuing, please read the Editor's notes.

    + + +

    6 ECMAScript Data Types and Values

    + +

    6.1 ECMAScript Language Types

    + + +

    6.1.5 The Symbol Type

    + +

    6.1.5.1 Well-Known Symbols

    +
    Table 1: Well-known Symbols
    + + + + + + + + + + + + + +
    + Specification Name + + [[Description]] + + Value and Purpose +
    + @@customMatcher + + "Symbol.customMatcher" + + A method that performs custom pattern matching semantics. Called by the semantics of the pattern matching features. +
    +
    +
    +
    +
    +
    +

    30 Pattern Matching

    @@ -44,20 +87,20 @@

    Syntax

    MatchPattern[Yield, Await] : ( - MatchPattern[?Yield, ?Await] + MatchPattern[?Yield, ?Await] ) - PrimitivePattern + PrimitivePattern - MemberExpressionPattern[?Yield, ?Await] + MemberExpressionPattern[?Yield, ?Await] - UnaryAlgebraicPattern[?Yield, ?Await] + UnaryAlgebraicPattern[?Yield, ?Await] - CombinedMatchPattern[?Yield, ?Await] + CombinedMatchPattern[?Yield, ?Await] @@ -90,7 +133,7 @@

    Syntax

    MemberExpressionPattern[Yield, Await] : - PatternMatchingMemberExpression[?Yield, ?Await] + PatternMatchingMemberExpression[?Yield, ?Await] @@ -98,7 +141,7 @@

    Syntax

    IdentifierReference[?Yield, ?Await] - MemberExpressionPattern[?Yield, ?Await] + MemberExpressionPattern[?Yield, ?Await] . IdentifierName @@ -109,7 +152,7 @@

    Syntax

    value is Math.PI;
    Editor's Note
    - The MemberExpressionPattern . IdentifierName production is removable. + The MemberExpressionPattern . IdentifierName production is removable.
    value is Math.PI;
     // can be written as:
     const { PI } = Math;
    @@ -124,11 +167,11 @@ 

    Syntax

    UnaryAlgebraicPattern[Yield, Await] : + - PatternMatchingMemberExpression[?Yield, ?Await] + PatternMatchingMemberExpression[?Yield, ?Await] - - PatternMatchingMemberExpression[?Yield, ?Await] + PatternMatchingMemberExpression[?Yield, ?Await] + @@ -157,18 +200,18 @@

    Syntax

    CombinedMatchPattern[Yield, Await] : - MatchPattern[?Yield, ?Await] + MatchPattern[?Yield, ?Await] and - MatchPattern[?Yield, ?Await] + MatchPattern[?Yield, ?Await] - MatchPattern[?Yield, ?Await] + MatchPattern[?Yield, ?Await] or - MatchPattern[?Yield, ?Await] + MatchPattern[?Yield, ?Await] not - MatchPattern[?Yield, ?Await] + MatchPattern[?Yield, ?Await] @@ -182,35 +225,35 @@

    Syntax

    30.1.1 Static Semantics: Early Errors

    CombinedMatchPattern : - MatchPattern + MatchPattern and - MatchPattern + MatchPattern CombinedMatchPattern : - MatchPattern + MatchPattern or - MatchPattern + MatchPattern CombinedMatchPattern : not - MatchPattern + MatchPattern Note
    value is a and b and c; // no Syntax Error
     value is a or b or c; // no Syntax Error
    @@ -231,41 +274,41 @@ 

    30.2 Match Pattern Semantics

    30.2.1 Runtime Semantics: MatchPatternMatches

    -

    The syntax-directed operation MatchPatternMatches takes argument subject (an ECMAScript language value) and returns either a normal completion containing a Boolean or an abrupt completion. It is defined piecewise over the following productions:

    +

    The syntax-directed operation MatchPatternMatches takes argument subject (an ECMAScript language value) and returns either a normal completion containing a Boolean or an abrupt completion. It is defined piecewise over the following productions:

    MatchPattern : ( - MatchPattern + MatchPattern ) -
    1. Return ? MatchPatternMatches of MatchPattern with arguments subject.
    +
    1. Return ? MatchPatternMatches of MatchPattern with arguments subject.
    - MatchPattern : PrimitivePattern + MatchPattern : PrimitivePattern -
    1. Return PrimitivePatternMatches of PrimitivePattern with arguments subject.
    +
    1. Return PrimitivePatternMatches of PrimitivePattern with arguments subject.
    - MatchPattern : MemberExpressionPattern + MatchPattern : MemberExpressionPattern -
    1. Return ? MemberExpressionPatternMatches of MemberExpressionPattern with arguments subject.
    +
    1. Return ? MemberExpressionPatternMatches of MemberExpressionPattern with arguments subject.
    - MatchPattern : UnaryAlgebraicPattern + MatchPattern : UnaryAlgebraicPattern -
    1. Return ? UnaryAlgebraicPatternMatches of UnaryAlgebraicPattern with arguments subject.
    +
    1. Return ? UnaryAlgebraicPatternMatches of UnaryAlgebraicPattern with arguments subject.
    - MatchPattern : CombinedMatchPattern + MatchPattern : CombinedMatchPattern -
    1. Return ? CombinedMatchPatternMatches of CombinedMatchPattern with arguments subject.
    +
    1. Return ? CombinedMatchPatternMatches of CombinedMatchPattern with arguments subject.

    30.2.2 Runtime Semantics: PrimitivePatternMatches

    -

    The syntax-directed operation PrimitivePatternMatches takes argument subject (an ECMAScript language value) and returns a Boolean. It is defined piecewise over the following productions:

    +

    The syntax-directed operation PrimitivePatternMatches takes argument subject (an ECMAScript language value) and returns a Boolean. It is defined piecewise over the following productions:

    PrimitivePattern : Literal @@ -280,56 +323,66 @@

    30.2.2 Runtime Semantics: PrimitivePatternMatche

    30.2.3 Runtime Semantics: MemberExpressionPatternMatches

    -

    The syntax-directed operation MemberExpressionPatternMatches takes argument subject (an ECMAScript language value) and returns either a normal completion containing a Boolean or an abrupt completion. It is defined piecewise over the following productions:

    +

    The syntax-directed operation MemberExpressionPatternMatches takes argument subject (an ECMAScript language value) and returns either a normal completion containing a Boolean or an abrupt completion. It is defined piecewise over the following productions:

    - MemberExpressionPattern : PatternMatchingMemberExpression + MemberExpressionPattern : PatternMatchingMemberExpression -
    1. Let expr be the MemberExpression that is covered by PatternMatchingMemberExpression.
    2. Let ref be ? Evaluation of expr.
    3. Let value be ? GetValue(ref).
    4. Return SameValueZero(subject, value).
    +
    1. Let expr be the MemberExpression that is covered by PatternMatchingMemberExpression.
    2. Let ref be ? Evaluation of expr.
    3. Let value be ? GetValue(ref).
    4. Let result be ? InvokeCustomMatcher(value, subject, boolean).
    5. Assert: result is a Boolean.
    6. Return result.

    30.2.4 Runtime Semantics: UnaryAlgebraicPatternMatches

    -

    The syntax-directed operation UnaryAlgebraicPatternMatches takes argument subject (an ECMAScript language value) and returns either a normal completion containing a Boolean or an abrupt completion. It is defined piecewise over the following productions:

    +

    The syntax-directed operation UnaryAlgebraicPatternMatches takes argument subject (an ECMAScript language value) and returns either a normal completion containing a Boolean or an abrupt completion. It is defined piecewise over the following productions:

    UnaryAlgebraicPattern : -
    1. Let expr be the MemberExpression that is covered by UnaryAlgebraicPattern.
    2. Let ref be ? Evaluation of expr.
    3. Let value be ? GetValue(ref).
    4. Return SameValue(subject, value).
    +
    1. Let expr be the MemberExpression that is covered by UnaryAlgebraicPattern.
    2. Let ref be ? Evaluation of expr.
    3. Let value be ? GetValue(ref).
    4. Return SameValue(subject, value).

    30.2.5 Runtime Semantics: CombinedMatchPatternMatches

    -

    The syntax-directed operation CombinedMatchPatternMatches takes argument subject (an ECMAScript language value) and returns either a normal completion containing a Boolean or an abrupt completion. It is defined piecewise over the following productions:

    +

    The syntax-directed operation CombinedMatchPatternMatches takes argument subject (an ECMAScript language value) and returns either a normal completion containing a Boolean or an abrupt completion. It is defined piecewise over the following productions:

    CombinedMatchPattern : - MatchPattern + MatchPattern and - MatchPattern + MatchPattern -
    1. Let leftMatches be ? MatchPatternMatches of the first MatchPattern with arguments subject.
    2. If leftMatches is false, return false.
    3. Return ? MatchPatternMatches of the second MatchPattern with arguments subject.
    +
    1. Let leftMatches be ? MatchPatternMatches of the first MatchPattern with arguments subject.
    2. If leftMatches is false, return false.
    3. Return ? MatchPatternMatches of the second MatchPattern with arguments subject.
    CombinedMatchPattern : - MatchPattern + MatchPattern or - MatchPattern + MatchPattern -
    1. Let leftMatches be ? MatchPatternMatches of the first MatchPattern with arguments subject.
    2. If leftMatches is true, return true.
    3. Return ? MatchPatternMatches of the second MatchPattern with arguments subject.
    +
    1. Let leftMatches be ? MatchPatternMatches of the first MatchPattern with arguments subject.
    2. If leftMatches is true, return true.
    3. Return ? MatchPatternMatches of the second MatchPattern with arguments subject.
    CombinedMatchPattern : not - MatchPattern + MatchPattern -
    1. Let matches be ? MatchPatternMatches of MatchPattern with arguments subject.
    2. If matches is true, return false.
    3. Return true.
    +
    1. Let matches be ? MatchPatternMatches of MatchPattern with arguments subject.
    2. If matches is true, return false.
    3. Return true.

    30.3 Abstract Operations for Pattern Matching

    + + +

    30.3.1 InvokeCustomMatcher ( matcher, subject, kind )

    +

    The abstract operation InvokeCustomMatcher takes arguments matcher (an ECMAScript language value), subject (an ECMAScript language value), and kind (boolean or list) and returns either a normal completion containing either a Boolean or an Iterator Record, or an abrupt completion. It performs the following steps when called:

    +
    1. If matcher is not an Object, then
      1. Return SameValueZero(matcher, subject).
    2. Let f be ? Get(matcher, @@customMatcher).
    3. If IsCallable(matcher) is false, throw a TypeError exception.
    4. If kind is boolean, let hint be "boolean".
    5. Else, let hint be "list".
    6. Let result be ? Call(f, matcher, « subject, hint »).
    7. If result is false, return false.
    8. Else if result is true and kind is boolean, return true.
    9. Else if result is not an Object, throw a TypeError exception.
    10. Let iterator be ? GetIterator(result, sync).
    11. If kind is boolean, then
      1. Perform ? IteratorClose(iterator, a normal completion with a value of unused).
      2. Return true.
    12. Return iterator.
    + Editor's Note
    + The hint parameter is not a consensus in the champion group yet. This design is to solve runtime performance concerns about custom matchers. The extractor proposal may add a new hint object for the following syntax. +
    const Point{ x, y } = expr;
    +
    +
    diff --git a/spec.emu b/spec.emu index ec1eb63..9865371 100644 --- a/spec.emu +++ b/spec.emu @@ -36,6 +36,49 @@ contributors:

    Work in progress. Before continuing, please read the .

    + + +

    ECMAScript Data Types and Values

    + +

    ECMAScript Language Types

    + + +

    The Symbol Type

    + +

    Well-Known Symbols

    + + + + + + + + + + + + + + +
    + Specification Name + + [[Description]] + + Value and Purpose +
    + @@customMatcher + + `"Symbol.customMatcher"` + + A method that performs custom pattern matching semantics. Called by the semantics of the pattern matching features. +
    +
    +
    +
    +
    +
    +

    Pattern Matching

    @@ -265,7 +308,9 @@ contributors: 1. Let _expr_ be the |MemberExpression| that is covered by |PatternMatchingMemberExpression|. 1. Let _ref_ be ? Evaluation of _expr_. 1. Let _value_ be ? GetValue(_ref_). - 1. Return SameValueZero(_subject_, _value_). + 1. Let _result_ be ? InvokeCustomMatcher(_value_, _subject_, ~boolean~). + 1. Assert: _result_ is a Boolean. + 1. Return _result_.
    @@ -324,6 +369,41 @@ contributors:

    Abstract Operations for Pattern Matching

    + + +

    + InvokeCustomMatcher ( + _matcher_: an ECMAScript language value, + _subject_: an ECMAScript language value, + _kind_: ~boolean~ or ~list~, + ): either a normal completion containing either a Boolean or an Iterator Record, or an abrupt completion +

    +
    +
    + + 1. If _matcher_ is not an Object, then + 1. Return SameValueZero(_matcher_, _subject_). + 1. Let _f_ be ? Get(_matcher_, @@customMatcher). + 1. If IsCallable(_matcher_) is *false*, throw a *TypeError* exception. + 1. If _kind_ is ~boolean~, let _hint_ be *"boolean"*. + 1. Else, let _hint_ be *"list"*. + 1. Let _result_ be ? Call(_f_, _matcher_, « _subject_, _hint_ »). + 1. If _result_ is *false*, return *false*. + 1. Else if _result_ is *true* and _kind_ is ~boolean~, return *true*. + 1. Else if _result_ is not an Object, throw a *TypeError* exception. + 1. Let _iterator_ be ? GetIterator(_result_, ~sync~). + 1. If _kind_ is ~boolean~, then + 1. Perform ? IteratorClose(_iterator_, a normal completion with a value of unused). + 1. Return *true*. + 1. Return _iterator_. + + + The hint parameter is not a consensus in the champion group yet. This design is to solve runtime performance concerns about custom matchers. The extractor proposal may add a new hint ~object~ for the following syntax. +
    
    +          const Point{ x, y } = expr;
    +        
    +
    +
    From fc186d7ee293c6f6c1382ed8ebf1bc6b736705e7 Mon Sep 17 00:00:00 2001 From: Jack Works Date: Mon, 30 Oct 2023 03:00:03 +0800 Subject: [PATCH 15/71] Add built-in matchers and class default matcher --- assets/ecmarkup.js | 2 +- assets/expand.js | 43 +++ index.html | 569 +++++++++++++++++++++++++++++++++++---- spec.emu | 643 ++++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 1199 insertions(+), 58 deletions(-) create mode 100644 assets/expand.js diff --git a/assets/ecmarkup.js b/assets/ecmarkup.js index 3709b79..5caa506 100644 --- a/assets/ecmarkup.js +++ b/assets/ecmarkup.js @@ -1525,5 +1525,5 @@ document.addEventListener('DOMContentLoaded', () => { }); let sdoMap = JSON.parse(`{"prod-KUcUUgsn":{"MatchPatternMatches":{"clause":"30.2.1","ids":["prod-U80C8biY"]}},"prod-NnfvhTBM":{"MatchPatternMatches":{"clause":"30.2.1","ids":["prod-6fPS70C2"]}},"prod-dtu4srcz":{"MatchPatternMatches":{"clause":"30.2.1","ids":["prod-vBMoWeeV"]}},"prod-en0pW04U":{"MatchPatternMatches":{"clause":"30.2.1","ids":["prod-MW-Egi0C"]}},"prod-LAj8DpMp":{"MatchPatternMatches":{"clause":"30.2.1","ids":["prod-EquXXU0V"]}},"prod-lZG2aTTb":{"PrimitivePatternMatches":{"clause":"30.2.2","ids":["prod-mlLTmHeP"]}},"prod-rqU7_eLx":{"PrimitivePatternMatches":{"clause":"30.2.2","ids":["prod-eFLzsKUd"]}},"prod-G4gXeSPg":{"MemberExpressionPatternMatches":{"clause":"30.2.3","ids":["prod--tiCo4Kg"]}},"prod-a_2cW9fV":{"CombinedMatchPatternMatches":{"clause":"30.2.5","ids":["prod-TGrK8XcZ"]}},"prod-BMX8uZDG":{"CombinedMatchPatternMatches":{"clause":"30.2.5","ids":["prod-hYdo8hkU"]}},"prod-4IhLPseH":{"CombinedMatchPatternMatches":{"clause":"30.2.5","ids":["prod-_QtiVeJ1"]}}}`); -let biblio = JSON.parse(`{"refsByClause":{"sec-intro":["_ref_0"],"sec-match-pattern-matches":["_ref_1","_ref_2","_ref_3","_ref_4","_ref_5","_ref_6","_ref_46","_ref_47","_ref_48","_ref_49","_ref_50","_ref_51","_ref_52","_ref_53","_ref_54","_ref_55"],"sec-primitive-pattern-matches":["_ref_7"],"sec-member-expression-pattern-matches":["_ref_8","_ref_9","_ref_56","_ref_57"],"sec-unary-algebraic-pattern-matches":["_ref_10","_ref_58"],"sec-combined-match-pattern-matches":["_ref_11","_ref_12","_ref_13","_ref_14","_ref_15","_ref_16","_ref_59","_ref_60","_ref_61","_ref_62","_ref_63","_ref_64","_ref_65","_ref_66","_ref_67","_ref_68"],"sec-invoke-custom-matcher":["_ref_17","_ref_18","_ref_19"],"sec-match-patterns":["_ref_20","_ref_21","_ref_22","_ref_23","_ref_24","_ref_25","_ref_26","_ref_27","_ref_28","_ref_29","_ref_30","_ref_31","_ref_32","_ref_33","_ref_34"],"sec-match-patterns-early-errors":["_ref_35","_ref_36","_ref_37","_ref_38","_ref_39","_ref_40","_ref_41","_ref_42","_ref_43","_ref_44","_ref_45"]},"entries":[{"type":"table","id":"table-1","number":1,"caption":"Table 1: Well-known Symbols"},{"type":"term","term":"@@customMatcher","refId":"sec-well-known-symbols"},{"type":"clause","id":"sec-well-known-symbols","titleHTML":"Well-Known Symbols","number":"6.1.5.1","referencingIds":["_ref_19"]},{"type":"clause","id":"sec-ecmascript-language-types-symbol-type","titleHTML":"The Symbol Type","number":"6.1.5"},{"type":"clause","id":"sec-ecmascript-language-types","titleHTML":"ECMAScript Language Types","number":"6.1","referencingIds":["_ref_1","_ref_7","_ref_8","_ref_10","_ref_11","_ref_17","_ref_18"]},{"type":"op","aoid":"Type","refId":"sec-ecmascript-data-types-and-values"},{"type":"clause","id":"sec-ecmascript-data-types-and-values","titleHTML":"ECMAScript Data Types and Values","number":"6"},{"type":"production","id":"prod-MatchPattern","name":"MatchPattern","referencingIds":["_ref_20","_ref_30","_ref_31","_ref_32","_ref_33","_ref_34","_ref_35","_ref_36","_ref_37","_ref_39","_ref_40","_ref_41","_ref_43","_ref_44","_ref_46","_ref_47","_ref_59","_ref_60","_ref_61","_ref_62","_ref_63","_ref_64","_ref_65","_ref_66","_ref_67","_ref_68"]},{"type":"production","id":"prod-PrimitivePattern","name":"PrimitivePattern","referencingIds":["_ref_21","_ref_48","_ref_49"]},{"type":"production","id":"prod-MemberExpressionPattern","name":"MemberExpressionPattern","referencingIds":["_ref_22","_ref_26","_ref_27","_ref_50","_ref_51"]},{"type":"production","id":"prod-PatternMatchingMemberExpression","name":"PatternMatchingMemberExpression","referencingIds":["_ref_25","_ref_28","_ref_29","_ref_56","_ref_57"]},{"type":"production","id":"prod-UnaryAlgebraicPattern","name":"UnaryAlgebraicPattern","referencingIds":["_ref_23","_ref_52","_ref_53","_ref_58"]},{"type":"production","id":"prod-CombinedMatchPattern","name":"CombinedMatchPattern","referencingIds":["_ref_24","_ref_38","_ref_42","_ref_45","_ref_54","_ref_55"]},{"type":"clause","id":"sec-match-patterns-early-errors","titleHTML":"Static Semantics: Early Errors","number":"30.1.1"},{"type":"clause","id":"sec-match-patterns","titleHTML":"Match Patterns","number":"30.1"},{"type":"op","aoid":"MatchPatternMatches","refId":"sec-match-pattern-matches"},{"type":"clause","id":"sec-match-pattern-matches","titleHTML":"Runtime Semantics: MatchPatternMatches","number":"30.2.1","referencingIds":["_ref_2","_ref_12","_ref_13","_ref_14","_ref_15","_ref_16"]},{"type":"op","aoid":"PrimitivePatternMatches","refId":"sec-primitive-pattern-matches"},{"type":"clause","id":"sec-primitive-pattern-matches","titleHTML":"Runtime Semantics: PrimitivePatternMatches","number":"30.2.2","referencingIds":["_ref_3"]},{"type":"op","aoid":"MemberExpressionPatternMatches","refId":"sec-member-expression-pattern-matches"},{"type":"clause","id":"sec-member-expression-pattern-matches","titleHTML":"Runtime Semantics: MemberExpressionPatternMatches","number":"30.2.3","referencingIds":["_ref_4"]},{"type":"op","aoid":"UnaryAlgebraicPatternMatches","refId":"sec-unary-algebraic-pattern-matches"},{"type":"clause","id":"sec-unary-algebraic-pattern-matches","titleHTML":"Runtime Semantics: UnaryAlgebraicPatternMatches","number":"30.2.4","referencingIds":["_ref_5"]},{"type":"op","aoid":"CombinedMatchPatternMatches","refId":"sec-combined-match-pattern-matches"},{"type":"clause","id":"sec-combined-match-pattern-matches","titleHTML":"Runtime Semantics: CombinedMatchPatternMatches","number":"30.2.5","referencingIds":["_ref_6"]},{"type":"clause","id":"sec-match-pattern-semantics","titleHTML":"Match Pattern Semantics","number":"30.2"},{"type":"op","aoid":"InvokeCustomMatcher","refId":"sec-invoke-custom-matcher"},{"type":"clause","id":"sec-invoke-custom-matcher","title":"InvokeCustomMatcher ( matcher, subject, kind )","titleHTML":"InvokeCustomMatcher ( matcher, subject, kind )","number":"30.3.1","referencingIds":["_ref_9"]},{"type":"clause","id":"sec-abstract-operations-for-pattern-matching","titleHTML":"Abstract Operations for Pattern Matching","number":"30.3"},{"type":"clause","id":"sec-pattern-matching","title":"Pattern Matching","titleHTML":"Pattern Matching","number":"30"},{"type":"clause","id":"sec-notes-layering","titleHTML":"Layering","number":"31.1"},{"type":"clause","id":"sec-notes-code-example","titleHTML":"Code example","number":"31.2"},{"type":"clause","id":"sec-notes","titleHTML":"Editor's notes","number":"31","referencingIds":["_ref_0"]},{"type":"clause","id":"sec-copyright-and-software-license","title":"Copyright & Software License","titleHTML":"Copyright & Software License","number":"A"}]}`); +let biblio = JSON.parse(`{"refsByClause":{"welcome":["_ref_0","_ref_1","_ref_2","_ref_3","_ref_4"],"sec-object-internal-methods-and-internal-slots":["_ref_5"],"sec-object-@@custommatcher":["_ref_6"],"sec-function-@@custommatcher":["_ref_7"],"sec-function.prototype-@@custommatcher":["_ref_8"],"sec-boolean-@@custommatcher":["_ref_9"],"sec-symbol.custommatcher":["_ref_10"],"sec-symbol-@@custommatcher":["_ref_11","_ref_12","_ref_13"],"sec-error-@@custommatcher":["_ref_14"],"sec-properties-of-the-error-constructors":["_ref_15"],"sec-number-@@custommatcher":["_ref_16"],"sec-bigint-@@custommatcher":["_ref_17"],"sec-date-@@custommatcher":["_ref_18"],"sec-string-@@custommatcher":["_ref_19"],"sec-regexp-@@custommatcher":["_ref_20","_ref_21"],"sec-regexp.prototype-@@custommatcher":["_ref_22"],"sec-array-@@custommatcher":["_ref_23"],"sec-_typedarray_-@@custommatcher":["_ref_24"],"sec-map-@@custommatcher":["_ref_25"],"sec-set-@@custommatcher":["_ref_26"],"sec-weakmap-@@custommatcher":["_ref_27"],"sec-weakset-@@custommatcher":["_ref_28"],"sec-arraybuffer-@@custommatcher":["_ref_29"],"sec-sharedarraybuffer-@@custommatcher":["_ref_30"],"sec-dataview-@@custommatcher":["_ref_31"],"sec-json-@@custommatcher":["_ref_32"],"sec-weakref-@@custommatcher":["_ref_33"],"sec-finalizationregistry-@@custommatcher":["_ref_34"],"sec-promise-@@custommatcher":["_ref_35"],"sec-match-pattern-matches":["_ref_36","_ref_37","_ref_38","_ref_39","_ref_40","_ref_41","_ref_82","_ref_83","_ref_84","_ref_85","_ref_86","_ref_87","_ref_88","_ref_89","_ref_90","_ref_91"],"sec-primitive-pattern-matches":["_ref_42"],"sec-member-expression-pattern-matches":["_ref_43","_ref_44","_ref_92","_ref_93"],"sec-unary-algebraic-pattern-matches":["_ref_45","_ref_94"],"sec-combined-match-pattern-matches":["_ref_46","_ref_47","_ref_48","_ref_49","_ref_50","_ref_51","_ref_95","_ref_96","_ref_97","_ref_98","_ref_99","_ref_100","_ref_101","_ref_102","_ref_103","_ref_104"],"sec-invoke-custom-matcher":["_ref_52","_ref_53","_ref_54"],"sec-validatecustommatcherhint":["_ref_55"],"sec-match-patterns":["_ref_56","_ref_57","_ref_58","_ref_59","_ref_60","_ref_61","_ref_62","_ref_63","_ref_64","_ref_65","_ref_66","_ref_67","_ref_68","_ref_69","_ref_70"],"sec-match-patterns-early-errors":["_ref_71","_ref_72","_ref_73","_ref_74","_ref_75","_ref_76","_ref_77","_ref_78","_ref_79","_ref_80","_ref_81"]},"entries":[{"type":"clause","id":"welcome","titleHTML":"Welcome","number":"1"},{"type":"table","id":"table-1","number":1,"caption":"Table 1: Well-known Symbols"},{"type":"term","term":"@@customMatcher","refId":"sec-well-known-symbols"},{"type":"clause","id":"sec-well-known-symbols","titleHTML":"Well-Known Symbols","number":"6.1.5.1","referencingIds":["_ref_10","_ref_15","_ref_21","_ref_54"]},{"type":"clause","id":"sec-ecmascript-language-types-symbol-type","titleHTML":"The Symbol Type","number":"6.1.5","referencingIds":["_ref_12","_ref_13"]},{"type":"clause","id":"sec-object-internal-methods-and-internal-slots","titleHTML":"Object Internal Methods and Internal Slots","number":"6.1.7"},{"type":"clause","id":"sec-ecmascript-language-types","titleHTML":"ECMAScript Language Types","number":"6.1","referencingIds":["_ref_5","_ref_36","_ref_42","_ref_43","_ref_45","_ref_46","_ref_52","_ref_53","_ref_55"]},{"type":"op","aoid":"Type","refId":"sec-ecmascript-data-types-and-values"},{"type":"clause","id":"sec-ecmascript-data-types-and-values","titleHTML":"ECMAScript Data Types and Values","number":"6"},{"type":"term","term":"InitializeInstance","refId":"sec-initializeinstance"},{"type":"op","aoid":"InitializeInstanceElements","refId":"sec-initializeinstance"},{"type":"clause","id":"sec-initializeinstance","title":"InitializeInstanceElements ( O, constructor )","titleHTML":"InitializeInstanceElements ( O, constructor )","number":"7.3.34","referencingIds":["_ref_3"]},{"type":"clause","id":"sec-operations-on-objects","titleHTML":"Operations on Objects","number":"7.3"},{"type":"clause","id":"sec-abstract-operations","titleHTML":"Abstract Operations","number":"7"},{"type":"op","aoid":"ClassDefinitionEvaluation","refId":"sec-runtime-semantics-classdefinitionevaluation"},{"type":"clause","id":"sec-runtime-semantics-classdefinitionevaluation","titleHTML":"Runtime Semantics: ClassDefinitionEvaluation","number":"15.7.14","referencingIds":["_ref_4"]},{"type":"clause","id":"sec-class-definitions","titleHTML":"Class Definitions","number":"15.7"},{"type":"clause","id":"sec-ecmascript-language-functions-and-classes","titleHTML":"ECMAScript Language: Functions and Classes","number":"15"},{"type":"clause","id":"sec-object-@@custommatcher","title":"Object [ @@customMatcher ] ( subject, hint )","titleHTML":"Object [ @@customMatcher ] ( subject, hint )","number":"20.1.2.24"},{"type":"clause","id":"sec-properties-of-the-object-constructor","titleHTML":"Properties of the Object Constructor","number":"20.1.2"},{"type":"clause","id":"sec-object-objects","titleHTML":"Object Objects","number":"20.1"},{"type":"clause","id":"sec-function-@@custommatcher","title":"Function [ @@customMatcher ] ( subject, hint )","titleHTML":"Function [ @@customMatcher ] ( subject, hint )","number":"20.2.2.2","referencingIds":["_ref_1"]},{"type":"clause","id":"sec-properties-of-the-function-constructor","titleHTML":"Properties of the Function Constructor","number":"20.2.2"},{"type":"clause","id":"sec-function.prototype-@@custommatcher","title":"Function [ @@customMatcher ] ( subject, hint )","titleHTML":"Function [ @@customMatcher ] ( subject, hint )","number":"20.2.3.7"},{"type":"clause","id":"sec-properties-of-the-function-prototype-object","titleHTML":"Properties of the Function Prototype Object","number":"20.2.3"},{"type":"clause","id":"sec-function-objects","titleHTML":"Function Objects","number":"20.2"},{"type":"clause","id":"sec-boolean-@@custommatcher","title":"Boolean [ @@customMatcher ] ( subject, hint )","titleHTML":"Boolean [ @@customMatcher ] ( subject, hint )","number":"20.3.2.2"},{"type":"clause","id":"sec-properties-of-the-boolean-constructor","titleHTML":"Properties of the Boolean Constructor","number":"20.3.2"},{"type":"clause","id":"sec-boolean-objects","titleHTML":"Boolean Objects","number":"20.3"},{"type":"clause","id":"sec-symbol.custommatcher","titleHTML":"Symbol.customMatcher","number":"20.4.2.17"},{"type":"clause","id":"sec-symbol-@@custommatcher","title":"Symbol [ @@customMatcher ] ( subject, hint )","titleHTML":"Symbol [ @@customMatcher ] ( subject, hint )","number":"20.4.2.18"},{"type":"clause","id":"sec-properties-of-the-symbol-constructor","titleHTML":"Properties of the Symbol Constructor","number":"20.4.2"},{"type":"clause","id":"sec-symbol-objects","titleHTML":"Symbol Objects","number":"20.4"},{"type":"clause","id":"sec-error-@@custommatcher","title":"Error [ @@customMatcher ] ( subject, hint )","titleHTML":"Error [ @@customMatcher ] ( subject, hint )","number":"20.5.1.2.1"},{"type":"clause","id":"sec-properties-of-the-error-constructors","titleHTML":"Properties of the Error Constructor","number":"20.5.1.2"},{"type":"clause","id":"sec-error-constructor","titleHTML":"The Error Constructor","number":"20.5.1"},{"type":"clause","id":"sec-error-objects","titleHTML":"Error Objects","number":"20.5"},{"type":"clause","id":"sec-fundamental-objects","titleHTML":"Fundamental Objects","number":"20"},{"type":"clause","id":"sec-number-@@custommatcher","title":"Number [ @@customMatcher ] ( subject, hint )","titleHTML":"Number [ @@customMatcher ] ( subject, hint )","number":"21.1.2.16"},{"type":"clause","id":"sec-properties-of-the-number-constructor","titleHTML":"Properties of the Number Constructor","number":"21.1.2"},{"type":"clause","id":"sec-number-objects","titleHTML":"Number Objects","number":"21.1"},{"type":"clause","id":"sec-bigint-@@custommatcher","title":"BigInt [ @@customMatcher ] ( subject, hint )","titleHTML":"BigInt [ @@customMatcher ] ( subject, hint )","number":"21.2.2.4"},{"type":"clause","id":"sec-properties-of-the-bigint-constructor","titleHTML":"Properties of the BigInt Constructor","number":"21.2.2"},{"type":"clause","id":"sec-bigint-objects","titleHTML":"BigInt Objects","number":"21.2"},{"type":"clause","id":"sec-date-@@custommatcher","title":"Date [ @@customMatcher ] ( subject, hint )","titleHTML":"Date [ @@customMatcher ] ( subject, hint )","number":"21.4.3.5"},{"type":"clause","id":"sec-properties-of-the-date-constructor","titleHTML":"Properties of the Date Constructor","number":"21.4.3"},{"type":"clause","id":"sec-date-objects","titleHTML":"Date Objects","number":"21.4"},{"type":"clause","id":"sec-numbers-and-dates","titleHTML":"Numbers and Dates","number":"21"},{"type":"clause","id":"sec-string-@@custommatcher","title":"String [ @@customMatcher ] ( subject, hint )","titleHTML":"String [ @@customMatcher ] ( subject, hint )","number":"22.1.2.5"},{"type":"clause","id":"sec-properties-of-the-string-constructor","titleHTML":"Properties of the String Constructor","number":"22.1.2"},{"type":"clause","id":"sec-string-objects","titleHTML":"String Objects","number":"22.1"},{"type":"clause","id":"sec-regexp-@@custommatcher","title":"RegExp [ @@customMatcher ] ( subject, hint )","titleHTML":"RegExp [ @@customMatcher ] ( subject, hint )","number":"22.2.5.3"},{"type":"clause","id":"sec-properties-of-the-regexp-constructor","titleHTML":"Properties of the RegExp Constructor","number":"22.2.5"},{"type":"clause","id":"sec-regexp.prototype-@@custommatcher","title":"RegExp.prototype [ @@customMatcher ] ( subject, hint )","titleHTML":"RegExp.prototype [ @@customMatcher ] ( subject, hint )","number":"22.2.6.20"},{"type":"clause","id":"sec-properties-of-the-regexp-prototype-object","titleHTML":"Properties of the RegExp Prototype Object","number":"22.2.6"},{"type":"clause","id":"sec-regexp-regular-expression-objects","titleHTML":"RegExp (Regular Expression) Objects","number":"22.2"},{"type":"clause","id":"sec-text-processing","titleHTML":"Text Processing","number":"22"},{"type":"clause","id":"sec-array-@@custommatcher","title":"Array [ @@customMatcher ] ( subject, hint )","titleHTML":"Array [ @@customMatcher ] ( subject, hint )","number":"23.1.2.6"},{"type":"clause","id":"sec-properties-of-the-array-constructor","titleHTML":"Properties of the Array Constructor","number":"23.1.2"},{"type":"clause","id":"sec-array-objects","titleHTML":"Array Objects","number":"23.1"},{"type":"clause","id":"sec-_typedarray_-@@custommatcher","title":"TypedArray [ @@customMatcher ] ( subject, hint )","titleHTML":"TypedArray [ @@customMatcher ] ( subject, hint )","number":"23.2.6.3"},{"type":"clause","id":"sec-properties-of-the-typedarray-constructors","title":"Properties of the TypedArray Constructors","titleHTML":"Properties of the TypedArray Constructors","number":"23.2.6"},{"type":"clause","id":"sec-typedarray-objects","titleHTML":"TypedArray Objects","number":"23.2"},{"type":"clause","id":"sec-indexed-collections","titleHTML":"Indexed Collections","number":"23"},{"type":"clause","id":"sec-map-@@custommatcher","title":"Map [ @@customMatcher ] ( subject, hint )","titleHTML":"Map [ @@customMatcher ] ( subject, hint )","number":"24.1.2.3"},{"type":"clause","id":"sec-properties-of-the-map-constructor","titleHTML":"Properties of the Map Constructor","number":"24.1.2"},{"type":"clause","id":"sec-map-objects","titleHTML":"Map Objects","number":"24.1"},{"type":"clause","id":"sec-set-@@custommatcher","title":"Set [ @@customMatcher ] ( subject, hint )","titleHTML":"Set [ @@customMatcher ] ( subject, hint )","number":"24.2.2.3"},{"type":"clause","id":"sec-properties-of-the-set-constructor","titleHTML":"Properties of the Set Constructor","number":"24.2.2"},{"type":"clause","id":"sec-set-objects","titleHTML":"Set Objects","number":"24.2"},{"type":"clause","id":"sec-weakmap-@@custommatcher","title":"WeakMap [ @@customMatcher ] ( subject, hint )","titleHTML":"WeakMap [ @@customMatcher ] ( subject, hint )","number":"24.3.2.2"},{"type":"clause","id":"sec-properties-of-the-weakmap-constructor","titleHTML":"Properties of the WeakMap Constructor","number":"24.3.2"},{"type":"clause","id":"sec-weakmap-objects","titleHTML":"WeakMap Objects","number":"24.3"},{"type":"clause","id":"sec-weakset-@@custommatcher","title":"WeakSet [ @@customMatcher ] ( subject, hint )","titleHTML":"WeakSet [ @@customMatcher ] ( subject, hint )","number":"24.4.2.2"},{"type":"clause","id":"sec-properties-of-the-weakset-constructor","titleHTML":"Properties of the WeakSet Constructor","number":"24.4.2"},{"type":"clause","id":"sec-weakset-objects","titleHTML":"WeakSet Objects","number":"24.4"},{"type":"clause","id":"sec-keyed-collections","titleHTML":"Keyed Collections","number":"24"},{"type":"clause","id":"sec-arraybuffer-@@custommatcher","title":"ArrayBuffer [ @@customMatcher ] ( subject, hint )","titleHTML":"ArrayBuffer [ @@customMatcher ] ( subject, hint )","number":"25.1.5.4"},{"type":"clause","id":"sec-properties-of-the-arraybuffer-constructor","titleHTML":"Properties of the ArrayBuffer Constructor","number":"25.1.5"},{"type":"clause","id":"sec-arraybuffer-objects","titleHTML":"ArrayBuffer Objects","number":"25.1"},{"type":"clause","id":"sec-sharedarraybuffer-@@custommatcher","title":"SharedArrayBuffer [ @@customMatcher ] ( subject, hint )","titleHTML":"SharedArrayBuffer [ @@customMatcher ] ( subject, hint )","number":"25.2.4.3"},{"type":"clause","id":"sec-properties-of-the-sharedarraybuffer-constructor","titleHTML":"Properties of the SharedArrayBuffer Constructor","number":"25.2.4"},{"type":"clause","id":"sec-sharedarraybuffer-objects","titleHTML":"SharedArrayBuffer Objects","number":"25.2"},{"type":"clause","id":"sec-dataview-@@custommatcher","title":"DataView [ @@customMatcher ] ( subject, hint )","titleHTML":"DataView [ @@customMatcher ] ( subject, hint )","number":"25.3.3.2"},{"type":"clause","id":"sec-properties-of-the-dataview-constructor","titleHTML":"Properties of the DataView Constructor","number":"25.3.3"},{"type":"clause","id":"sec-dataview-objects","titleHTML":"DataView Objects","number":"25.3"},{"type":"clause","id":"sec-json-@@custommatcher","title":"JSON [ @@customMatcher ] ( subject, hint )","titleHTML":"JSON [ @@customMatcher ] ( subject, hint )","number":"25.5.4","referencingIds":["_ref_2"]},{"type":"clause","id":"sec-json-object","titleHTML":"The JSON Object","number":"25.5"},{"type":"clause","id":"sec-structured-data","titleHTML":"Structured Data","number":"25"},{"type":"clause","id":"sec-weakref-@@custommatcher","title":"WeakRef [ @@customMatcher ] ( subject, hint )","titleHTML":"WeakRef [ @@customMatcher ] ( subject, hint )","number":"26.1.2.2"},{"type":"clause","id":"sec-properties-of-the-weak-ref-constructor","titleHTML":"Properties of the WeakRef Constructor","number":"26.1.2"},{"type":"clause","id":"sec-weak-ref-objects","titleHTML":"WeakRef Objects","number":"26.1"},{"type":"clause","id":"sec-finalizationregistry-@@custommatcher","title":"FinalizationRegistry [ @@customMatcher ] ( subject, hint )","titleHTML":"FinalizationRegistry [ @@customMatcher ] ( subject, hint )","number":"26.2.2.2"},{"type":"clause","id":"sec-properties-of-the-finalization-registry-constructor","titleHTML":"Properties of the FinalizationRegistry Constructor","number":"26.2.2"},{"type":"clause","id":"sec-finalization-registry-objects","titleHTML":"FinalizationRegistry Objects","number":"26.2"},{"type":"clause","id":"sec-managing-memory","titleHTML":"Managing Memory","number":"26"},{"type":"clause","id":"sec-promise-@@custommatcher","title":"Promise [ @@customMatcher ] ( subject, hint )","titleHTML":"Promise [ @@customMatcher ] ( subject, hint )","number":"27.2.4.9"},{"type":"clause","id":"sec-properties-of-the-promise-constructor","titleHTML":"Properties of the Promise Constructor","number":"27.2.4"},{"type":"clause","id":"sec-promise-objects","titleHTML":"Promise Objects","number":"27.2"},{"type":"clause","id":"sec-control-abstraction-objects","titleHTML":"Control Abstraction Objects","number":"27"},{"type":"clause","id":"sec-proxy-@@custommatcher","title":"Proxy [ @@customMatcher ] ( subject, hint )","titleHTML":"Proxy [ @@customMatcher ] ( subject, hint )","number":"28.2.1.2"},{"type":"clause","id":"sec-proxy-constructor","titleHTML":"The Proxy Constructor","number":"28.2.1"},{"type":"clause","id":"sec-proxy-objects","titleHTML":"Proxy Objects","number":"28.2"},{"type":"clause","id":"sec-reflection","titleHTML":"Reflection","number":"28"},{"type":"production","id":"prod-MatchPattern","name":"MatchPattern","referencingIds":["_ref_56","_ref_66","_ref_67","_ref_68","_ref_69","_ref_70","_ref_71","_ref_72","_ref_73","_ref_75","_ref_76","_ref_77","_ref_79","_ref_80","_ref_82","_ref_83","_ref_95","_ref_96","_ref_97","_ref_98","_ref_99","_ref_100","_ref_101","_ref_102","_ref_103","_ref_104"]},{"type":"production","id":"prod-PrimitivePattern","name":"PrimitivePattern","referencingIds":["_ref_57","_ref_84","_ref_85"]},{"type":"production","id":"prod-MemberExpressionPattern","name":"MemberExpressionPattern","referencingIds":["_ref_58","_ref_62","_ref_63","_ref_86","_ref_87"]},{"type":"production","id":"prod-PatternMatchingMemberExpression","name":"PatternMatchingMemberExpression","referencingIds":["_ref_61","_ref_64","_ref_65","_ref_92","_ref_93"]},{"type":"production","id":"prod-UnaryAlgebraicPattern","name":"UnaryAlgebraicPattern","referencingIds":["_ref_59","_ref_88","_ref_89","_ref_94"]},{"type":"production","id":"prod-CombinedMatchPattern","name":"CombinedMatchPattern","referencingIds":["_ref_60","_ref_74","_ref_78","_ref_81","_ref_90","_ref_91"]},{"type":"clause","id":"sec-match-patterns-early-errors","titleHTML":"Static Semantics: Early Errors","number":"30.1.1"},{"type":"clause","id":"sec-match-patterns","titleHTML":"Match Patterns","number":"30.1"},{"type":"op","aoid":"MatchPatternMatches","refId":"sec-match-pattern-matches"},{"type":"clause","id":"sec-match-pattern-matches","titleHTML":"Runtime Semantics: MatchPatternMatches","number":"30.2.1","referencingIds":["_ref_37","_ref_47","_ref_48","_ref_49","_ref_50","_ref_51"]},{"type":"op","aoid":"PrimitivePatternMatches","refId":"sec-primitive-pattern-matches"},{"type":"clause","id":"sec-primitive-pattern-matches","titleHTML":"Runtime Semantics: PrimitivePatternMatches","number":"30.2.2","referencingIds":["_ref_38"]},{"type":"op","aoid":"MemberExpressionPatternMatches","refId":"sec-member-expression-pattern-matches"},{"type":"clause","id":"sec-member-expression-pattern-matches","titleHTML":"Runtime Semantics: MemberExpressionPatternMatches","number":"30.2.3","referencingIds":["_ref_39"]},{"type":"op","aoid":"UnaryAlgebraicPatternMatches","refId":"sec-unary-algebraic-pattern-matches"},{"type":"clause","id":"sec-unary-algebraic-pattern-matches","titleHTML":"Runtime Semantics: UnaryAlgebraicPatternMatches","number":"30.2.4","referencingIds":["_ref_40"]},{"type":"op","aoid":"CombinedMatchPatternMatches","refId":"sec-combined-match-pattern-matches"},{"type":"clause","id":"sec-combined-match-pattern-matches","titleHTML":"Runtime Semantics: CombinedMatchPatternMatches","number":"30.2.5","referencingIds":["_ref_41"]},{"type":"clause","id":"sec-match-pattern-semantics","titleHTML":"Match Pattern Semantics","number":"30.2"},{"type":"op","aoid":"InvokeCustomMatcher","refId":"sec-invoke-custom-matcher"},{"type":"clause","id":"sec-invoke-custom-matcher","title":"InvokeCustomMatcher ( matcher, subject, kind )","titleHTML":"InvokeCustomMatcher ( matcher, subject, kind )","number":"30.3.1","referencingIds":["_ref_44"]},{"type":"op","aoid":"ValidateCustomMatcherHint","refId":"sec-validatecustommatcherhint"},{"type":"clause","id":"sec-validatecustommatcherhint","title":"ValidateCustomMatcherHint ( hint [ , kind ] )","titleHTML":"ValidateCustomMatcherHint ( hint [ , kind ] )","number":"30.3.2","referencingIds":["_ref_6","_ref_7","_ref_8","_ref_9","_ref_11","_ref_14","_ref_16","_ref_17","_ref_18","_ref_19","_ref_20","_ref_22","_ref_23","_ref_24","_ref_25","_ref_26","_ref_27","_ref_28","_ref_29","_ref_30","_ref_31","_ref_32","_ref_33","_ref_34","_ref_35"]},{"type":"clause","id":"sec-abstract-operations-for-pattern-matching","titleHTML":"Abstract Operations for Pattern Matching","number":"30.3"},{"type":"clause","id":"sec-pattern-matching","title":"Pattern Matching","titleHTML":"Pattern Matching","number":"30"},{"type":"clause","id":"sec-notes-layering","titleHTML":"Layering","number":"31.1"},{"type":"clause","id":"sec-notes-code-example","titleHTML":"Code example","number":"31.2"},{"type":"clause","id":"sec-notes","titleHTML":"Editor's notes","number":"31","referencingIds":["_ref_0"]},{"type":"clause","id":"sec-copyright-and-software-license","title":"Copyright & Software License","titleHTML":"Copyright & Software License","number":"A"}]}`); ;let usesMultipage = false \ No newline at end of file diff --git a/assets/expand.js b/assets/expand.js new file mode 100644 index 0000000..289422c --- /dev/null +++ b/assets/expand.js @@ -0,0 +1,43 @@ +const state = { + __folded: true, + get folded() { + try { + const v = localStorage.getItem("folded"); + return v === "true" || v === null; + } catch { + return this.__folded; + } + }, + set folded(val) { + this.__folded = val; + try { + localStorage.setItem("folded", val); + } catch {} + document.body.classList.toggle("folded", val); + }, +}; +state.folded = state.folded; + +function resetHash() { + location.hash = "#welcome"; +} + +document.querySelector("#expand").addEventListener("click", () => { + state.folded = !state.folded; + resetHash(); +}); + +function onHashChange(event) { + const target = document.getElementById(location.hash.slice(1)); + if (!target) return; + if (!state.folded) return; + for (const el of document.querySelectorAll(".fold")) { + if (el.contains(target)) { + state.folded = false; + target.scrollIntoView(true); + setExpand(false); + } + } +} +window.addEventListener("hashchange", onHashChange); +window.addEventListener("DOMContentLoaded", onHashChange); diff --git a/index.html b/index.html index 20b78fa..0504677 100644 --- a/index.html +++ b/index.html @@ -3,7 +3,7 @@ -Pattern Matching
    +Pattern Matching
    • Toggle shortcuts help?
    • Toggle "can call user code" annotationsu
    • @@ -12,7 +12,7 @@

    Stage 1 Draft / October 29, 2023

    Pattern Matching

    +

    Stage 1 Draft / October 29, 2023

    Pattern Matching

    -

    Work in progress. Before continuing, please read the Editor's notes.

    + +

    1 Welcome

    +

    Work in progress. Before continuing, please read the Editor's notes.

    +

    Most of the trivia (built-in matchers) is folded. Some non-trivia sections you might be interested in:

    + + + +
    - +

    6 ECMAScript Data Types and Values

    6.1 ECMAScript Language Types

    @@ -75,6 +90,444 @@

    6.1.5.1 Well-Known Symbols

    + +

    6.1.7 Object Internal Methods and Internal Slots

    +

    All objects have an internal slot named [[ConstructedBy]], which is a List of ECMAScript language values. This List represents the origin of the object. Initially, it is an empty List.

    +
    +
    + + + +

    7 Abstract Operations

    + +

    7.3 Operations on Objects

    + +

    7.3.34 InitializeInstanceElements ( O, constructor )

    +

    The abstract operation InitializeInstanceElements takes arguments O (an Object) and constructor (an ECMAScript function object) and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:

    +
    1. Let methods be the value of constructor.[[PrivateMethods]].
    2. For each PrivateElement method of methods, do
      1. Perform ? PrivateMethodOrAccessorAdd(O, method).
    3. Let fields be the value of constructor.[[Fields]].
    4. For each element fieldRecord of fields, do
      1. Perform ? DefineField(O, fieldRecord).
    5. Append constructor to O.[[ConstructedBy]].
    6. Return unused.
    + Note
    The [[ConstructedBy]] field also contains normal functions, but it is inaccessible because this field is used with functions that have a truthy [[IsClassConstructor]] field. An implementation may omit the append of normal functions.
    + Editor's Note
    Rename this AO to InitializeInstance.
    +
    +
    +
    + + +

    15 ECMAScript Language: Functions and Classes

    + +

    15.7 Class Definitions

    + +

    15.7.14 Runtime Semantics: ClassDefinitionEvaluation

    +

    The syntax-directed operation ClassDefinitionEvaluation takes arguments classBinding (a String or undefined) and className (a property key or a Private Name) and returns either a normal completion containing a function object or an abrupt completion.

    + Editor's Note +
    +
    +
    + + +

    20 Fundamental Objects

    + +

    20.1 Object Objects

    + +

    20.1.2 Properties of the Object Constructor

    + +

    20.1.2.24 Object [ @@customMatcher ] ( subject, hint )

    +

    This function performs the following steps when called:

    +
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If subject is not an Object, return false.
    3. Return true.
    +
    +
    +
    + +

    20.2 Function Objects

    + +

    20.2.2 Properties of the Function Constructor

    + +

    20.2.2.2 Function [ @@customMatcher ] ( subject, hint )

    +

    This function performs the following steps when called:

    +
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. Return IsCallable(subject).
    +
    +
    + +

    20.2.3 Properties of the Function Prototype Object

    + +

    20.2.3.7 Function [ @@customMatcher ] ( subject, hint )

    +

    This function performs the following steps when called:

    +
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. Let func be the this value.
    3. If IsCallable(func) is false, throw a TypeError exception.
    4. If func does not have a [[IsClassConstructor]] internal slot or func.[[IsClassConstructor]] is false, return ? Call(func, null, « subject, hint »).
    5. Assert: func is a constructor function.
    6. If subject.[[ConstructedBy]] contains func, return true.
    7. Return false.
    + Note
    +
    class C {}
    +c is C; // true, by private-field semantics
    +
    +function f() {}
    +class F extends f {}
    +const i = new F();
    +i is F; // true, by private-field semantics
    +i is f; // TypeError because f(i, "boolean") returns undefined
    +
    +expr is Array.isArray; // true, by Array.isArray(expr)
    +
    + Editor's Note
    + Not every champion group agrees with private-field-like brand check semantics. + There are + performance concerns, + "hackable" concerns, and + interaction with @@hasInstance concerns. + Another approach is to use instanceof semantics. +
    + Editor's Note
    + The this context is lost in this case:
    x is obj.equal;
    . obj.equal is called without a this value. +
    +
    +
    +
    + +

    20.3 Boolean Objects

    + +

    20.3.2 Properties of the Boolean Constructor

    + +

    20.3.2.2 Boolean [ @@customMatcher ] ( subject, hint )

    +

    This function performs the following steps when called:

    +
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. If subject is not a Boolean and does not have a [[BooleanData]] internal slot, return false.
    3. If hint is "boolean", return true.
    4. If subject is a Boolean, return CreateArrayFromListsubject »).
    5. Return CreateArrayFromListsubject.[[BooleanData]] »).
    +
    +
    +
    + +

    20.4 Symbol Objects

    + +

    20.4.2 Properties of the Symbol Constructor

    + +

    20.4.2.17 Symbol.customMatcher

    +

    The initial value of Symbol.customMatcher is the well-known symbol @@customMatcher (Table 1).

    +

    This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.

    +
    + +

    20.4.2.18 Symbol [ @@customMatcher ] ( subject, hint )

    +

    This function performs the following steps when called:

    +
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. If subject is not a Symbol and does not have a [[SymbolData]] internal slot, return false.
    3. If hint is "boolean", return true.
    4. If subject is a Symbol, return CreateArrayFromListsubject »).
    5. Return CreateArrayFromListsubject.[[SymbolData]] »).
    +
    +
    +
    + +

    20.5 Error Objects

    + +

    20.5.1 The Error Constructor

    + +

    20.5.1.2 Properties of the Error Constructor

    + +

    20.5.1.2.1 Error [ @@customMatcher ] ( subject, hint )

    +

    This function performs the following steps when called:

    +
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If subject does not have a [[ErrorData]] internal slot, return false.
    3. Return true.
    +
    + Editor's Note
    + Built-in subclasses of the Error class do not have their own internal slot, + so they inherit the @@customMatcher method, + which means code like
    err is TypeError;
    + matches any kind of Error like RangeError. + This is not a consensus in the champion group. +
    +
    +
    +
    +
    + + +

    21 Numbers and Dates

    + +

    21.1 Number Objects

    + +

    21.1.2 Properties of the Number Constructor

    + +

    21.1.2.16 Number [ @@customMatcher ] ( subject, hint )

    +

    This function performs the following steps when called:

    +
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. If subject is not a Number and does not have a [[NumberData]] internal slot, return false.
    3. If hint is "boolean", return true.
    4. If subject is a Number, return CreateArrayFromListsubject »).
    5. Return CreateArrayFromListsubject.[[NumberData]] »).
    +
    +
    +
    + +

    21.2 BigInt Objects

    + +

    21.2.2 Properties of the BigInt Constructor

    + +

    21.2.2.4 BigInt [ @@customMatcher ] ( subject, hint )

    +

    This function performs the following steps when called:

    +
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. If subject is not a BigInt and does not have a [[BigIntData]] internal slot, return false.
    3. If hint is "boolean", return true.
    4. If subject is a BigInt, return CreateArrayFromListsubject »).
    5. Return CreateArrayFromListsubject.[[BigIntData]] »).
    +
    +
    +
    + +

    21.4 Date Objects

    + +

    21.4.3 Properties of the Date Constructor

    + +

    21.4.3.5 Date [ @@customMatcher ] ( subject, hint )

    +

    This function performs the following steps when called:

    +
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If subject does not have a [[DateValue]] internal slot, return false.
    3. Return true.
    + Editor's Note
    It's possible to provide an extractor semantics to match
    date is Date(year, month, day, hour, minute, second, millisecond);
    +
    +
    +
    +
    + + +

    22 Text Processing

    + +

    22.1 String Objects

    + +

    22.1.2 Properties of the String Constructor

    + +

    22.1.2.5 String [ @@customMatcher ] ( subject, hint )

    +

    This function performs the following steps when called:

    +
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. If subject is not a String and does not have a [[StringData]] internal slot, return false.
    3. If hint is "boolean", return true.
    4. If subject is a String, return CreateArrayFromListsubject »).
    5. Return CreateArrayFromListsubject.[[StringData]] »).
    +
    +
    +
    + +

    22.2 RegExp (Regular Expression) Objects

    + +

    22.2.5 Properties of the RegExp Constructor

    + +

    22.2.5.3 RegExp [ @@customMatcher ] ( subject, hint )

    +

    This function performs the following steps when called:

    +
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If ? IsRegExp(subject) is false, return false.
    3. Return true.
    + Note
    + IsRegExp returns true for objects that have a truthy @@match property. Do we want that? +
    +
    +
    + +

    22.2.6 Properties of the RegExp Prototype Object

    + +

    22.2.6.20 RegExp.prototype [ @@customMatcher ] ( subject, hint )

    +

    This function performs the following steps when called:

    +
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. Let regexp be this value.
    3. If hint is "boolean", return ? Call(%RegExp.prototype.test%, regexp, « subject »).
    4. Let isRegExp be ? IsRegExp(regexp).
    5. If isRegExp is true, then
      1. Let flags be ? Get(regexp, "flags").
      2. Perform ? RequireObjectCoercible(flags).
      3. If ? ToString(flags) contain "g", return ? Call(%String.prototype.matchAll%, subject, « regexp »).
    6. Let result be ? Call(%String.prototype.match%, subject, « regexp »).
    7. Return CreateArrayFromListresult »).
    + Note
    +
    let regex = /(?>id<\d+)-?/g
    +'012-345' is regex(["012-", "012"], { groups: { id: "345" } });
    +// true, match with matchAll
    +
    +let regex2 = /(?\d+)-?/
    +'012-345' is regex({ groups: { id: "012" } });
    +// true, match with match
    +
    +
    +
    +
    +
    + + +

    23 Indexed Collections

    + +

    23.1 Array Objects

    + +

    23.1.2 Properties of the Array Constructor

    + +

    23.1.2.6 Array [ @@customMatcher ] ( subject, hint )

    +

    This function performs the following steps when called:

    +
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. If ? IsArray(subject) is false, return false.
    3. If hint is "boolean", return true.
    4. Return subject.
    + Editor's Note
    + It's possible to provide an extractor semantics to convert subject by Array.from. +
    ({ length: 2, 0: 1, 1: 2 } is Array(1, 2)); // true?
    +
    +
    +
    +
    + +

    23.2 TypedArray Objects

    + +

    23.2.6 Properties of the TypedArray Constructors

    + +

    23.2.6.3 TypedArray [ @@customMatcher ] ( subject, hint )

    +

    This function performs the following steps when called:

    +
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. If subject does not have a [[TypedArrayName]] internal slot or subject.[[TypedArrayName]] is not TypedArray, return false.
    3. If hint is "boolean", return true.
    4. Return subject.
    + Note
    +
    const isPNG = binary is Uint8Array(
    +  0x89, 0x50, 0x4E, 0x47,
    +  0x0D, 0x0A, 0x1A, 0x0A, ...
    +); // the ... is necessary otherwise it will only match a length-8 binary.
    +
    + Editor's Note
    + It's possible to provide an extractor semantics to convert subject into different view. +
    new Uint8Array(256) is Int8Array(0); // true?
    +
    +
    +
    +
    +
    + + +

    24 Keyed Collections

    + +

    24.1 Map Objects

    + +

    24.1.2 Properties of the Map Constructor

    + +

    24.1.2.3 Map [ @@customMatcher ] ( subject, hint )

    +

    This function performs the following steps when called:

    +
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. If subject does not have a [[MapData]] internal slot, return false.
    3. If hint is "boolean", return true.
    4. Return subject.
    + Editor's Note
    + A Map can be iterated, but is it meaningful to do so in pattern matching? + Because
    x is Map([a, b], [c, d])
    is an ordered match. +
    +
    +
    +
    + +

    24.2 Set Objects

    + +

    24.2.2 Properties of the Set Constructor

    + +

    24.2.2.3 Set [ @@customMatcher ] ( subject, hint )

    +

    This function performs the following steps when called:

    +
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. If subject does not have a [[SetData]] internal slot, return false.
    3. If hint is "boolean", return true.
    4. Return subject.
    + Editor's Note
    + A Set can be iterated, but is it meaningful to do so in pattern matching? + Because
    x is Set(a, b, c, d)
    is an ordered match. +
    +
    +
    +
    + +

    24.3 WeakMap Objects

    + +

    24.3.2 Properties of the WeakMap Constructor

    + +

    24.3.2.2 WeakMap [ @@customMatcher ] ( subject, hint )

    +

    This function performs the following steps when called:

    +
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If subject does not have a [[WeakMapData]] internal slot, return false.
    3. Return true.
    +
    +
    +
    + +

    24.4 WeakSet Objects

    + +

    24.4.2 Properties of the WeakSet Constructor

    + +

    24.4.2.2 WeakSet [ @@customMatcher ] ( subject, hint )

    +

    This function performs the following steps when called:

    +
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If subject does not have a [[WeakSetData]] internal slot, return false.
    3. Return true.
    +
    +
    +
    +
    + + +

    25 Structured Data

    + +

    25.1 ArrayBuffer Objects

    + +

    25.1.5 Properties of the ArrayBuffer Constructor

    + +

    25.1.5.4 ArrayBuffer [ @@customMatcher ] ( subject, hint )

    +

    This function performs the following steps when called:

    +
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If subject has a [[ArrayBufferData]] internal slot, return true.
    3. Return false.
    +
    + Editor's Note
    + It is possible to provide an extractor semantics to match the buffer property from a TypedArray. +
    u8 is ArrayBuffer(buf);
    +
    +
    +
    + +

    25.2 SharedArrayBuffer Objects

    + +

    25.2.4 Properties of the SharedArrayBuffer Constructor

    + +

    25.2.4.3 SharedArrayBuffer [ @@customMatcher ] ( subject, hint )

    +

    This function performs the following steps when called:

    +
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If subject does not have a [[ArrayBufferData]] internal slot, return false.
    3. Return IsSharedArrayBuffer(subject).
    +
    +
    +
    + +

    25.3 DataView Objects

    + +

    25.3.3 Properties of the DataView Constructor

    + +

    25.3.3.2 DataView [ @@customMatcher ] ( subject, hint )

    +

    This function performs the following steps when called:

    +
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If subject does not have a [[DataView]] internal slot, return false.
    3. Return true.
    +
    +
    +
    + +

    25.5 The JSON Object

    + +

    25.5.4 JSON [ @@customMatcher ] ( subject, hint )

    +

    This function performs the following steps when called:

    +
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. Let jsonString be ? ToString(subject).
    3. If ! Call(%JSON.canParse%, undefined, « jsonString ») is false, return false.
    4. If hint is "boolean", return true.
    5. Return CreateArrayFromList(« ! Call(%JSON.parse%, undefined, « jsonString ») »).
    +
    + Editor's Note
    + This is not a consensus in the champion group. + See the JSON.canParse proposal. +
    x is JSON({ type: 1 }); // matches string '{ "type": 1 }'
    +
    +
    +
    + + +

    26 Managing Memory

    + +

    26.1 WeakRef Objects

    + +

    26.1.2 Properties of the WeakRef Constructor

    + +

    26.1.2.2 WeakRef [ @@customMatcher ] ( subject, hint )

    +

    This function performs the following steps when called:

    +
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. If subject does not have a [[WeakRefTarget]] internal slot, return false.
    3. If hint is "boolean", return true.
    4. Return CreateArrayFromListWeakRefDeref(subject) »).
    + Note
    +
    expr is WeakRef({ type: 1 });
    +
    +
    +
    +
    + +

    26.2 FinalizationRegistry Objects

    + +

    26.2.2 Properties of the FinalizationRegistry Constructor

    + +

    26.2.2.2 FinalizationRegistry [ @@customMatcher ] ( subject, hint )

    +

    This function performs the following steps when called:

    +
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If subject does not have a [[CleanupCallback]] internal slot, return false.
    3. Return true.
    +
    +
    +
    +
    + + +

    27 Control Abstraction Objects

    + +

    27.2 Promise Objects

    + +

    27.2.4 Properties of the Promise Constructor

    + +

    27.2.4.9 Promise [ @@customMatcher ] ( subject, hint )

    +

    This function performs the following steps when called:

    +
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. Return IsPromise(subject).
    +
    + Editor's Note
    + It is possible to provide an extractor semantics to convert a Promise-like into a real Promise. +
    when Promise(let promise): ..., // converted with Promise.resolve(value)
    +
    +
    +
    +
    + + +

    28 Reflection

    + +

    28.2 Proxy Objects

    + +

    28.2.1 The Proxy Constructor

    + +

    28.2.1.2 Proxy [ @@customMatcher ] ( subject, hint )

    +

    This function performs the following steps when called:

    +
    1. Throw a TypeError exception.
    +
    + Editor's Note
    + If this method does not exist, +
    x is Proxy
    actually does x === Proxy. + To avoid confusion, this method throws. + This is not a consensus in the champion group. +
    +
    @@ -87,20 +540,20 @@

    Syntax

    MatchPattern[Yield, Await] : ( - MatchPattern[?Yield, ?Await] + MatchPattern[?Yield, ?Await] ) - PrimitivePattern + PrimitivePattern - MemberExpressionPattern[?Yield, ?Await] + MemberExpressionPattern[?Yield, ?Await] - UnaryAlgebraicPattern[?Yield, ?Await] + UnaryAlgebraicPattern[?Yield, ?Await] - CombinedMatchPattern[?Yield, ?Await] + CombinedMatchPattern[?Yield, ?Await] @@ -133,7 +586,7 @@

    Syntax

    MemberExpressionPattern[Yield, Await] : - PatternMatchingMemberExpression[?Yield, ?Await] + PatternMatchingMemberExpression[?Yield, ?Await] @@ -141,7 +594,7 @@

    Syntax

    IdentifierReference[?Yield, ?Await] - MemberExpressionPattern[?Yield, ?Await] + MemberExpressionPattern[?Yield, ?Await] . IdentifierName @@ -152,7 +605,7 @@

    Syntax

    value is Math.PI;

    Editor's Note
    - The MemberExpressionPattern . IdentifierName production is removable. + The MemberExpressionPattern . IdentifierName production is removable.
    value is Math.PI;
     // can be written as:
     const { PI } = Math;
    @@ -167,11 +620,11 @@ 

    Syntax

    UnaryAlgebraicPattern[Yield, Await] : + - PatternMatchingMemberExpression[?Yield, ?Await] + PatternMatchingMemberExpression[?Yield, ?Await] - - PatternMatchingMemberExpression[?Yield, ?Await] + PatternMatchingMemberExpression[?Yield, ?Await] + @@ -200,18 +653,18 @@

    Syntax

    CombinedMatchPattern[Yield, Await] : - MatchPattern[?Yield, ?Await] + MatchPattern[?Yield, ?Await] and - MatchPattern[?Yield, ?Await] + MatchPattern[?Yield, ?Await] - MatchPattern[?Yield, ?Await] + MatchPattern[?Yield, ?Await] or - MatchPattern[?Yield, ?Await] + MatchPattern[?Yield, ?Await] not - MatchPattern[?Yield, ?Await] + MatchPattern[?Yield, ?Await] @@ -225,35 +678,35 @@

    Syntax

    30.1.1 Static Semantics: Early Errors

    CombinedMatchPattern : - MatchPattern + MatchPattern and - MatchPattern + MatchPattern CombinedMatchPattern : - MatchPattern + MatchPattern or - MatchPattern + MatchPattern CombinedMatchPattern : not - MatchPattern + MatchPattern Note
    value is a and b and c; // no Syntax Error
     value is a or b or c; // no Syntax Error
    @@ -274,41 +727,41 @@ 

    30.2 Match Pattern Semantics

    30.2.1 Runtime Semantics: MatchPatternMatches

    -

    The syntax-directed operation MatchPatternMatches takes argument subject (an ECMAScript language value) and returns either a normal completion containing a Boolean or an abrupt completion. It is defined piecewise over the following productions:

    +

    The syntax-directed operation MatchPatternMatches takes argument subject (an ECMAScript language value) and returns either a normal completion containing a Boolean or an abrupt completion. It is defined piecewise over the following productions:

    MatchPattern : ( - MatchPattern + MatchPattern ) -
    1. Return ? MatchPatternMatches of MatchPattern with arguments subject.
    +
    1. Return ? MatchPatternMatches of MatchPattern with arguments subject.
    - MatchPattern : PrimitivePattern + MatchPattern : PrimitivePattern -
    1. Return PrimitivePatternMatches of PrimitivePattern with arguments subject.
    +
    1. Return PrimitivePatternMatches of PrimitivePattern with arguments subject.
    - MatchPattern : MemberExpressionPattern + MatchPattern : MemberExpressionPattern -
    1. Return ? MemberExpressionPatternMatches of MemberExpressionPattern with arguments subject.
    +
    1. Return ? MemberExpressionPatternMatches of MemberExpressionPattern with arguments subject.
    - MatchPattern : UnaryAlgebraicPattern + MatchPattern : UnaryAlgebraicPattern -
    1. Return ? UnaryAlgebraicPatternMatches of UnaryAlgebraicPattern with arguments subject.
    +
    1. Return ? UnaryAlgebraicPatternMatches of UnaryAlgebraicPattern with arguments subject.
    - MatchPattern : CombinedMatchPattern + MatchPattern : CombinedMatchPattern -
    1. Return ? CombinedMatchPatternMatches of CombinedMatchPattern with arguments subject.
    +
    1. Return ? CombinedMatchPatternMatches of CombinedMatchPattern with arguments subject.

    30.2.2 Runtime Semantics: PrimitivePatternMatches

    -

    The syntax-directed operation PrimitivePatternMatches takes argument subject (an ECMAScript language value) and returns a Boolean. It is defined piecewise over the following productions:

    +

    The syntax-directed operation PrimitivePatternMatches takes argument subject (an ECMAScript language value) and returns a Boolean. It is defined piecewise over the following productions:

    PrimitivePattern : Literal @@ -323,52 +776,52 @@

    30.2.2 Runtime Semantics: PrimitivePatternMatche

    30.2.3 Runtime Semantics: MemberExpressionPatternMatches

    -

    The syntax-directed operation MemberExpressionPatternMatches takes argument subject (an ECMAScript language value) and returns either a normal completion containing a Boolean or an abrupt completion. It is defined piecewise over the following productions:

    +

    The syntax-directed operation MemberExpressionPatternMatches takes argument subject (an ECMAScript language value) and returns either a normal completion containing a Boolean or an abrupt completion. It is defined piecewise over the following productions:

    - MemberExpressionPattern : PatternMatchingMemberExpression + MemberExpressionPattern : PatternMatchingMemberExpression -
    1. Let expr be the MemberExpression that is covered by PatternMatchingMemberExpression.
    2. Let ref be ? Evaluation of expr.
    3. Let value be ? GetValue(ref).
    4. Let result be ? InvokeCustomMatcher(value, subject, boolean).
    5. Assert: result is a Boolean.
    6. Return result.
    +
    1. Let expr be the MemberExpression that is covered by PatternMatchingMemberExpression.
    2. Let ref be ? Evaluation of expr.
    3. Let value be ? GetValue(ref).
    4. Let result be ? InvokeCustomMatcher(value, subject, boolean).
    5. Assert: result is a Boolean.
    6. Return result.

    30.2.4 Runtime Semantics: UnaryAlgebraicPatternMatches

    -

    The syntax-directed operation UnaryAlgebraicPatternMatches takes argument subject (an ECMAScript language value) and returns either a normal completion containing a Boolean or an abrupt completion. It is defined piecewise over the following productions:

    +

    The syntax-directed operation UnaryAlgebraicPatternMatches takes argument subject (an ECMAScript language value) and returns either a normal completion containing a Boolean or an abrupt completion. It is defined piecewise over the following productions:

    UnaryAlgebraicPattern : -
    1. Let expr be the MemberExpression that is covered by UnaryAlgebraicPattern.
    2. Let ref be ? Evaluation of expr.
    3. Let value be ? GetValue(ref).
    4. Return SameValue(subject, value).
    +
    1. Let expr be the MemberExpression that is covered by UnaryAlgebraicPattern.
    2. Let ref be ? Evaluation of expr.
    3. Let value be ? GetValue(ref).
    4. Return SameValue(subject, value).

    30.2.5 Runtime Semantics: CombinedMatchPatternMatches

    -

    The syntax-directed operation CombinedMatchPatternMatches takes argument subject (an ECMAScript language value) and returns either a normal completion containing a Boolean or an abrupt completion. It is defined piecewise over the following productions:

    +

    The syntax-directed operation CombinedMatchPatternMatches takes argument subject (an ECMAScript language value) and returns either a normal completion containing a Boolean or an abrupt completion. It is defined piecewise over the following productions:

    CombinedMatchPattern : - MatchPattern + MatchPattern and - MatchPattern + MatchPattern -
    1. Let leftMatches be ? MatchPatternMatches of the first MatchPattern with arguments subject.
    2. If leftMatches is false, return false.
    3. Return ? MatchPatternMatches of the second MatchPattern with arguments subject.
    +
    1. Let leftMatches be ? MatchPatternMatches of the first MatchPattern with arguments subject.
    2. If leftMatches is false, return false.
    3. Return ? MatchPatternMatches of the second MatchPattern with arguments subject.
    CombinedMatchPattern : - MatchPattern + MatchPattern or - MatchPattern + MatchPattern -
    1. Let leftMatches be ? MatchPatternMatches of the first MatchPattern with arguments subject.
    2. If leftMatches is true, return true.
    3. Return ? MatchPatternMatches of the second MatchPattern with arguments subject.
    +
    1. Let leftMatches be ? MatchPatternMatches of the first MatchPattern with arguments subject.
    2. If leftMatches is true, return true.
    3. Return ? MatchPatternMatches of the second MatchPattern with arguments subject.
    CombinedMatchPattern : not - MatchPattern + MatchPattern -
    1. Let matches be ? MatchPatternMatches of MatchPattern with arguments subject.
    2. If matches is true, return false.
    3. Return true.
    +
    1. Let matches be ? MatchPatternMatches of MatchPattern with arguments subject.
    2. If matches is true, return false.
    3. Return true.
    @@ -376,13 +829,19 @@

    30.3 Abstract Operations for Pattern Matching

    30.3.1 InvokeCustomMatcher ( matcher, subject, kind )

    -

    The abstract operation InvokeCustomMatcher takes arguments matcher (an ECMAScript language value), subject (an ECMAScript language value), and kind (boolean or list) and returns either a normal completion containing either a Boolean or an Iterator Record, or an abrupt completion. It performs the following steps when called:

    -
    1. If matcher is not an Object, then
      1. Return SameValueZero(matcher, subject).
    2. Let f be ? Get(matcher, @@customMatcher).
    3. If IsCallable(matcher) is false, throw a TypeError exception.
    4. If kind is boolean, let hint be "boolean".
    5. Else, let hint be "list".
    6. Let result be ? Call(f, matcher, « subject, hint »).
    7. If result is false, return false.
    8. Else if result is true and kind is boolean, return true.
    9. Else if result is not an Object, throw a TypeError exception.
    10. Let iterator be ? GetIterator(result, sync).
    11. If kind is boolean, then
      1. Perform ? IteratorClose(iterator, a normal completion with a value of unused).
      2. Return true.
    12. Return iterator.
    +

    The abstract operation InvokeCustomMatcher takes arguments matcher (an ECMAScript language value), subject (an ECMAScript language value), and kind (boolean or list) and returns either a normal completion containing either a Boolean or an Iterator Record, or an abrupt completion. It performs the following steps when called:

    +
    1. If matcher is not an Object, then
      1. Return SameValueZero(matcher, subject).
    2. Let f be ? Get(matcher, @@customMatcher).
    3. If IsCallable(matcher) is false, throw a TypeError exception.
    4. If kind is boolean, let hint be "boolean".
    5. Else, let hint be "list".
    6. Let result be ? Call(f, matcher, « subject, hint »).
    7. If result is false, return false.
    8. Else if result is true and kind is boolean, return true.
    9. Else if result is not an Object, throw a TypeError exception.
    10. Let iterator be ? GetIterator(result, sync).
    11. If kind is boolean, then
      1. Perform ? IteratorClose(iterator, a normal completion with a value of unused).
      2. Return true.
    12. Return iterator.
    Editor's Note
    The hint parameter is not a consensus in the champion group yet. This design is to solve runtime performance concerns about custom matchers. The extractor proposal may add a new hint object for the following syntax.
    const Point{ x, y } = expr;
    + + +

    30.3.2 ValidateCustomMatcherHint ( hint [ , kind ] )

    +

    The abstract operation ValidateCustomMatcherHint takes argument hint (an ECMAScript language value) and optional argument kind (boolean or list) and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:

    +
    1. If hint is not "boolean" or "list", throw a TypeError exception.
    2. If kind is not present, return unused.
    3. If hint is "boolean" and kind is list, throw a TypeError exception.
    4. If hint is "list" and kind is boolean, throw a TypeError exception.
    +
    diff --git a/spec.emu b/spec.emu index 9865371..063b9ce 100644 --- a/spec.emu +++ b/spec.emu @@ -33,11 +33,26 @@ contributors: font-style: italic; text-decoration: underline; } + body.folded .fold { + display: none; + } -

    Work in progress. Before continuing, please read the .

    + +

    Welcome

    +

    Work in progress. Before continuing, please read the .

    +

    Most of the trivia (built-in matchers) is folded. Some non-trivia sections you might be interested in:

    +
      +
    • +
    • +
    • +
    • +
    + + +
    - +

    ECMAScript Data Types and Values

    ECMAScript Language Types

    @@ -76,6 +91,613 @@ contributors:
    + +

    Object Internal Methods and Internal Slots

    +

    All objects have an internal slot named [[ConstructedBy]], which is a List of ECMAScript language values. This List represents the origin of the object. Initially, it is an empty List.

    +
    +
    + + + +

    Abstract Operations

    + +

    Operations on Objects

    + +

    + InitializeInstanceElements ( + _O_: an Object, + _constructor_: an ECMAScript function object, + ): either a normal completion containing ~unused~ or a throw completion +

    +
    +
    + + 1. Let _methods_ be the value of _constructor_.[[PrivateMethods]]. + 1. For each PrivateElement _method_ of _methods_, do + 1. Perform ? PrivateMethodOrAccessorAdd(_O_, _method_). + 1. Let _fields_ be the value of _constructor_.[[Fields]]. + 1. For each element _fieldRecord_ of _fields_, do + 1. Perform ? DefineField(_O_, _fieldRecord_). + 1. Append _constructor_ to _O_.[[ConstructedBy]]. + 1. Return ~unused~. + + The [[ConstructedBy]] field also contains normal functions, but it is inaccessible because this field is used with functions that have a truthy [[IsClassConstructor]] field. An implementation may omit the append of normal functions. + Rename this AO to InitializeInstance. +
    +
    +
    + + +

    ECMAScript Language: Functions and Classes

    + +

    Class Definitions

    + +

    + Runtime Semantics: ClassDefinitionEvaluation ( + _classBinding_: a String or *undefined*, + _className_: a property key or a Private Name, + ): either a normal completion containing a function object or an abrupt completion +

    +
    +
    + See Editorial: call MakeClassConstructor on default class constructor. +
    +
    +
    + + +

    Fundamental Objects

    + +

    Object Objects

    + +

    Properties of the Object Constructor

    + +

    Object [ @@customMatcher ] ( _subject_, _hint_ )

    +

    This function performs the following steps when called:

    + + 1. Perform ? ValidateCustomMatcherHint(_hint_, ~boolean~). + 1. If _subject_ is not an Object, return *false*. + 1. Return *true*. + +
    +
    +
    + +

    Function Objects

    + +

    Properties of the Function Constructor

    + +

    Function [ @@customMatcher ] ( _subject_, _hint_ )

    +

    This function performs the following steps when called:

    + + 1. Perform ? ValidateCustomMatcherHint(_hint_, ~boolean~). + 1. Return IsCallable(_subject_). + +
    +
    + +

    Properties of the Function Prototype Object

    + +

    Function [ @@customMatcher ] ( _subject_, _hint_ )

    +

    This function performs the following steps when called:

    + + 1. Perform ? ValidateCustomMatcherHint(_hint_). + 1. Let _func_ be the *this* value. + 1. If IsCallable(_func_) is false, throw a *TypeError* exception. + 1. If _func_ does not have a [[IsClassConstructor]] internal slot or _func_.[[IsClassConstructor]] is *false*, return ? Call(_func_, *null*, « _subject_, _hint_ »). + 1. Assert: _func_ is a constructor function. + 1. If _subject_.[[ConstructedBy]] contains _func_, return *true*. + 1. Return *false*. + + +
    
    +            class C {}
    +            c is C; // true, by private-field semantics
    +
    +            function f() {}
    +            class F extends f {}
    +            const i = new F();
    +            i is F; // true, by private-field semantics
    +            i is f; // TypeError because f(i, "boolean") returns undefined
    +
    +            expr is Array.isArray; // true, by Array.isArray(expr)
    +          
    +
    + + Not every champion group agrees with private-field-like brand check semantics. + There are + performance concerns, + "hackable" concerns, and + interaction with @@hasInstance concerns. + Another approach is to use `instanceof` semantics. + + + The `this` context is lost in this case:
    x is obj.equal;
    . `obj.equal` is called without a *this* value. +
    +
    +
    +
    + +

    Boolean Objects

    + +

    Properties of the Boolean Constructor

    + +

    Boolean [ @@customMatcher ] ( _subject_, _hint_ )

    +

    This function performs the following steps when called:

    + + 1. Perform ? ValidateCustomMatcherHint(_hint_). + 1. If _subject_ is not a Boolean and does not have a [[BooleanData]] internal slot, return *false*. + 1. If _hint_ is *"boolean"*, return *true*. + 1. If _subject_ is a Boolean, return CreateArrayFromList(« _subject_ »). + 1. Return CreateArrayFromList(« _subject_.[[BooleanData]] »). + +
    +
    +
    + +

    Symbol Objects

    + +

    Properties of the Symbol Constructor

    + +

    Symbol.customMatcher

    +

    The initial value of `Symbol.customMatcher` is the well-known symbol @@customMatcher ().

    +

    This property has the attributes { [[Writable]]: *false*, [[Enumerable]]: *false*, [[Configurable]]: *false* }.

    +
    + +

    Symbol [ @@customMatcher ] ( _subject_, _hint_ )

    +

    This function performs the following steps when called:

    + + 1. Perform ? ValidateCustomMatcherHint(_hint_). + 1. If _subject_ is not a Symbol and does not have a [[SymbolData]] internal slot, return *false*. + 1. If _hint_ is *"boolean"*, return *true*. + 1. If _subject_ is a Symbol, return CreateArrayFromList(« _subject_ »). + 1. Return CreateArrayFromList(« _subject_.[[SymbolData]] »). + +
    +
    +
    + +

    Error Objects

    + +

    The Error Constructor

    + +

    Properties of the Error Constructor

    + +

    Error [ @@customMatcher ] ( _subject_, _hint_ )

    +

    This function performs the following steps when called:

    + + 1. Perform ? ValidateCustomMatcherHint(_hint_, ~boolean~). + 1. If _subject_ does not have a [[ErrorData]] internal slot, return *false*. + 1. Return *true*. + +
    + + Built-in subclasses of the Error class do not have their own internal slot, + so they inherit the @@customMatcher method, + which means code like
    err is TypeError;
    + matches any kind of Error like `RangeError`. + This is not a consensus in the champion group. +
    +
    +
    +
    +
    + + +

    Numbers and Dates

    + +

    Number Objects

    + +

    Properties of the Number Constructor

    + +

    Number [ @@customMatcher ] ( _subject_, _hint_ )

    +

    This function performs the following steps when called:

    + + 1. Perform ? ValidateCustomMatcherHint(_hint_). + 1. If _subject_ is not a Number and does not have a [[NumberData]] internal slot, return *false*. + 1. If _hint_ is *"boolean"*, return *true*. + 1. If _subject_ is a Number, return CreateArrayFromList(« _subject_ »). + 1. Return CreateArrayFromList(« _subject_.[[NumberData]] »). + +
    +
    +
    + +

    BigInt Objects

    + +

    Properties of the BigInt Constructor

    + +

    BigInt [ @@customMatcher ] ( _subject_, _hint_ )

    +

    This function performs the following steps when called:

    + + 1. Perform ? ValidateCustomMatcherHint(_hint_). + 1. If _subject_ is not a BigInt and does not have a [[BigIntData]] internal slot, return *false*. + 1. If _hint_ is *"boolean"*, return *true*. + 1. If _subject_ is a BigInt, return CreateArrayFromList(« _subject_ »). + 1. Return CreateArrayFromList(« _subject_.[[BigIntData]] »). + +
    +
    +
    + +

    Date Objects

    + +

    Properties of the Date Constructor

    + +

    Date [ @@customMatcher ] ( _subject_, _hint_ )

    +

    This function performs the following steps when called:

    + + 1. Perform ? ValidateCustomMatcherHint(_hint_, ~boolean~). + 1. If _subject_ does not have a [[DateValue]] internal slot, return *false*. + 1. Return *true*. + + It's possible to provide an extractor semantics to match
    
    +          date is Date(year, month, day, hour, minute, second, millisecond);
    +        
    +
    +
    +
    +
    + + +

    Text Processing

    + +

    String Objects

    + +

    Properties of the String Constructor

    + +

    String [ @@customMatcher ] ( _subject_, _hint_ )

    +

    This function performs the following steps when called:

    + + 1. Perform ? ValidateCustomMatcherHint(_hint_). + 1. If _subject_ is not a String and does not have a [[StringData]] internal slot, return *false*. + 1. If _hint_ is *"boolean"*, return *true*. + 1. If _subject_ is a String, return CreateArrayFromList(« _subject_ »). + 1. Return CreateArrayFromList(« _subject_.[[StringData]] »). + +
    +
    +
    + +

    RegExp (Regular Expression) Objects

    + +

    Properties of the RegExp Constructor

    + +

    RegExp [ @@customMatcher ] ( _subject_, _hint_ )

    +

    This function performs the following steps when called:

    + + 1. Perform ? ValidateCustomMatcherHint(_hint_, ~boolean~). + 1. If ? IsRegExp(_subject_) is *false*, return *false*. + 1. Return *true*. + + + IsRegExp returns *true* for objects that have a truthy @@match property. Do we want that? + +
    +
    + +

    Properties of the RegExp Prototype Object

    + +

    RegExp.prototype [ @@customMatcher ] ( _subject_, _hint_ )

    +

    This function performs the following steps when called:

    + + 1. Perform ? ValidateCustomMatcherHint(_hint_, ~boolean~). + 1. Let _regexp_ be *this* value. + 1. If _hint_ is *"boolean"*, return ? Call(%RegExp.prototype.test%, _regexp_, « _subject_ »). + 1. Let _isRegExp_ be ? IsRegExp(_regexp_). + 1. If _isRegExp_ is *true*, then + 1. Let _flags_ be ? Get(_regexp_, "flags"). + 1. Perform ? RequireObjectCoercible(_flags_). + 1. If ? ToString(_flags_) contain *"g"*, return ? Call(%String.prototype.matchAll%, _subject_, « _regexp_ »). + 1. Let _result_ be ? Call(%String.prototype.match%, _subject_, « _regexp_ »). + 1. Return CreateArrayFromList(« _result_ »). + + +
    
    +            let regex = /(?>id<\d+)-?/g
    +            '012-345' is regex(["012-", "012"], { groups: { id: "345" } });
    +            // true, match with matchAll
    +
    +            let regex2 = /(?\d+)-?/
    +            '012-345' is regex({ groups: { id: "012" } });
    +            // true, match with match
    +          
    +
    +
    +
    +
    +
    + + +

    Indexed Collections

    + +

    Array Objects

    + +

    Properties of the Array Constructor

    + +

    Array [ @@customMatcher ] ( _subject_, _hint_ )

    +

    This function performs the following steps when called:

    + + 1. Perform ? ValidateCustomMatcherHint(_hint_). + 1. If ? IsArray(_subject_) is *false*, return *false*. + 1. If _hint_ is *"boolean"*, return *true*. + 1. Return _subject_. + + + It's possible to provide an extractor semantics to convert _subject_ by `Array.from`. +
    
    +            ({ length: 2, 0: 1, 1: 2 } is Array(1, 2)); // true?
    +          
    +
    +
    +
    +
    + +

    TypedArray Objects

    + +

    Properties of the _TypedArray_ Constructors

    + +

    _TypedArray_ [ @@customMatcher ] ( _subject_, _hint_ )

    +

    This function performs the following steps when called:

    + + 1. Perform ? ValidateCustomMatcherHint(_hint_). + 1. If _subject_ does not have a [[TypedArrayName]] internal slot or _subject_.[[TypedArrayName]] is not _TypedArray_, return *false*. + 1. If _hint_ is *"boolean"*, return *true*. + 1. Return _subject_. + + +
    
    +            const isPNG = binary is Uint8Array(
    +              0x89, 0x50, 0x4E, 0x47,
    +              0x0D, 0x0A, 0x1A, 0x0A, ...
    +            ); // the ... is necessary otherwise it will only match a length-8 binary.
    +          
    +
    + + It's possible to provide an extractor semantics to convert _subject_ into different view. +
    
    +            new Uint8Array(256) is Int8Array(0); // true?
    +          
    +
    +
    +
    +
    +
    + + +

    Keyed Collections

    + +

    Map Objects

    + +

    Properties of the Map Constructor

    + +

    Map [ @@customMatcher ] ( _subject_, _hint_ )

    +

    This function performs the following steps when called:

    + + 1. Perform ? ValidateCustomMatcherHint(_hint_). + 1. If _subject_ does not have a [[MapData]] internal slot, return *false*. + 1. If _hint_ is *"boolean"*, return *true*. + 1. Return _subject_. + + + A Map can be iterated, but is it meaningful to do so in pattern matching? + Because
    x is Map([a, b], [c, d])
    is an ordered match. +
    +
    +
    +
    + +

    Set Objects

    + +

    Properties of the Set Constructor

    + +

    Set [ @@customMatcher ] ( _subject_, _hint_ )

    +

    This function performs the following steps when called:

    + + 1. Perform ? ValidateCustomMatcherHint(_hint_). + 1. If _subject_ does not have a [[SetData]] internal slot, return *false*. + 1. If _hint_ is *"boolean"*, return *true*. + 1. Return _subject_. + + + A Set can be iterated, but is it meaningful to do so in pattern matching? + Because
    x is Set(a, b, c, d)
    is an ordered match. +
    +
    +
    +
    + +

    WeakMap Objects

    + +

    Properties of the WeakMap Constructor

    + +

    WeakMap [ @@customMatcher ] ( _subject_, _hint_ )

    +

    This function performs the following steps when called:

    + + 1. Perform ? ValidateCustomMatcherHint(_hint_, ~boolean~). + 1. If _subject_ does not have a [[WeakMapData]] internal slot, return *false*. + 1. Return *true*. + +
    +
    +
    + +

    WeakSet Objects

    + +

    Properties of the WeakSet Constructor

    + +

    WeakSet [ @@customMatcher ] ( _subject_, _hint_ )

    +

    This function performs the following steps when called:

    + + 1. Perform ? ValidateCustomMatcherHint(_hint_, ~boolean~). + 1. If _subject_ does not have a [[WeakSetData]] internal slot, return *false*. + 1. Return *true*. + +
    +
    +
    +
    + + +

    Structured Data

    + +

    ArrayBuffer Objects

    + +

    Properties of the ArrayBuffer Constructor

    + +

    ArrayBuffer [ @@customMatcher ] ( _subject_, _hint_ )

    +

    This function performs the following steps when called:

    + + 1. Perform ? ValidateCustomMatcherHint(_hint_, ~boolean~). + 1. If _subject_ has a [[ArrayBufferData]] internal slot, return *true*. + 1. Return *false*. + +
    + + It is possible to provide an extractor semantics to match the buffer property from a TypedArray. +
    
    +          u8 is ArrayBuffer(buf);
    +        
    +
    +
    +
    + +

    SharedArrayBuffer Objects

    + +

    Properties of the SharedArrayBuffer Constructor

    + +

    SharedArrayBuffer [ @@customMatcher ] ( _subject_, _hint_ )

    +

    This function performs the following steps when called:

    + + 1. Perform ? ValidateCustomMatcherHint(_hint_, ~boolean~). + 1. If _subject_ does not have a [[ArrayBufferData]] internal slot, return *false*. + 1. Return IsSharedArrayBuffer(_subject_). + +
    +
    +
    + +

    DataView Objects

    + +

    Properties of the DataView Constructor

    + +

    DataView [ @@customMatcher ] ( _subject_, _hint_ )

    +

    This function performs the following steps when called:

    + + 1. Perform ? ValidateCustomMatcherHint(_hint_, ~boolean~). + 1. If _subject_ does not have a [[DataView]] internal slot, return *false*. + 1. Return *true*. + +
    +
    +
    + +

    The JSON Object

    + +

    JSON [ @@customMatcher ] ( _subject_, _hint_ )

    +

    This function performs the following steps when called:

    + + 1. Perform ? ValidateCustomMatcherHint(_hint_). + 1. Let _jsonString_ be ? ToString(_subject_). + 1. If ! Call(%JSON.canParse%, *undefined*, « _jsonString_ ») is *false*, return *false*. + 1. If _hint_ is *"boolean"*, return *true*. + 1. Return CreateArrayFromList(« ! Call(%JSON.parse%, *undefined*, « _jsonString_ ») »). + +
    + + This is not a consensus in the champion group. + See the `JSON.canParse` proposal. +
    
    +        x is JSON({ type: 1 }); // matches string '{ "type": 1 }'
    +      
    +
    +
    +
    + + +

    Managing Memory

    + +

    WeakRef Objects

    + +

    Properties of the WeakRef Constructor

    + +

    WeakRef [ @@customMatcher ] ( _subject_, _hint_ )

    +

    This function performs the following steps when called:

    + + 1. Perform ? ValidateCustomMatcherHint(_hint_). + 1. If _subject_ does not have a [[WeakRefTarget]] internal slot, return *false*. + 1. If _hint_ is *"boolean"*, return *true*. + 1. Return CreateArrayFromList(« WeakRefDeref(_subject_) »). + + +
    
    +            expr is WeakRef({ type: 1 });
    +          
    +
    +
    +
    +
    + +

    FinalizationRegistry Objects

    + +

    Properties of the FinalizationRegistry Constructor

    + +

    FinalizationRegistry [ @@customMatcher ] ( _subject_, _hint_ )

    +

    This function performs the following steps when called:

    + + 1. Perform ? ValidateCustomMatcherHint(_hint_, ~boolean~). + 1. If _subject_ does not have a [[CleanupCallback]] internal slot, return *false*. + 1. Return *true*. + +
    +
    +
    +
    + + +

    Control Abstraction Objects

    + +

    Promise Objects

    + +

    Properties of the Promise Constructor

    + +

    Promise [ @@customMatcher ] ( _subject_, _hint_ )

    +

    This function performs the following steps when called:

    + + 1. Perform ? ValidateCustomMatcherHint(_hint_, ~boolean~). + 1. Return IsPromise(_subject_). + +
    + + It is possible to provide an extractor semantics to convert a Promise-like into a real Promise. +
    
    +          when Promise(let promise): ..., // converted with Promise.resolve(value)
    +        
    +
    +
    +
    +
    + + +

    Reflection

    + +

    Proxy Objects

    + +

    The Proxy Constructor

    + +

    Proxy [ @@customMatcher ] ( _subject_, _hint_ )

    +

    This function performs the following steps when called:

    + + 1. Throw a *TypeError* exception. + +
    + + If this method does not exist, +
    x is Proxy
    actually does `x === Proxy`. + To avoid confusion, this method throws. + This is not a consensus in the champion group. +
    +
    @@ -404,6 +1026,23 @@ contributors:

    + + +

    + ValidateCustomMatcherHint ( + _hint_: an ECMAScript language value, + optional _kind_: ~boolean~ or ~list~, + ): either a normal completion containing ~unused~ or a throw completion +

    +
    +
    + + 1. If _hint_ is not *"boolean"* or *"list"*, throw a *TypeError* exception. + 1. If _kind_ is not present, return ~unused~. + 1. If _hint_ is *"boolean"* and _kind_ is ~list~, throw a *TypeError* exception. + 1. If _hint_ is *"list"* and _kind_ is ~boolean~, throw a *TypeError* exception. + +
    From b0b7fb50486878bca7ea89b0c7afb952786290bf Mon Sep 17 00:00:00 2001 From: Jack Works Date: Wed, 1 Nov 2023 03:25:46 +0800 Subject: [PATCH 16/71] Add receiver to InvokeCustomMatcher Expand PatternMatchingMemberExpression Remove some editor notes Change built-in Map and Set matcher Let [[ConstructedBy]] match first then the [[IsClassConstructor]] check --- assets/ecmarkup.js | 2 +- index.html | 259 +++++++++++++++++++++++---------------------- spec.emu | 105 +++++++----------- 3 files changed, 170 insertions(+), 196 deletions(-) diff --git a/assets/ecmarkup.js b/assets/ecmarkup.js index 5caa506..8aba49b 100644 --- a/assets/ecmarkup.js +++ b/assets/ecmarkup.js @@ -1525,5 +1525,5 @@ document.addEventListener('DOMContentLoaded', () => { }); let sdoMap = JSON.parse(`{"prod-KUcUUgsn":{"MatchPatternMatches":{"clause":"30.2.1","ids":["prod-U80C8biY"]}},"prod-NnfvhTBM":{"MatchPatternMatches":{"clause":"30.2.1","ids":["prod-6fPS70C2"]}},"prod-dtu4srcz":{"MatchPatternMatches":{"clause":"30.2.1","ids":["prod-vBMoWeeV"]}},"prod-en0pW04U":{"MatchPatternMatches":{"clause":"30.2.1","ids":["prod-MW-Egi0C"]}},"prod-LAj8DpMp":{"MatchPatternMatches":{"clause":"30.2.1","ids":["prod-EquXXU0V"]}},"prod-lZG2aTTb":{"PrimitivePatternMatches":{"clause":"30.2.2","ids":["prod-mlLTmHeP"]}},"prod-rqU7_eLx":{"PrimitivePatternMatches":{"clause":"30.2.2","ids":["prod-eFLzsKUd"]}},"prod-G4gXeSPg":{"MemberExpressionPatternMatches":{"clause":"30.2.3","ids":["prod--tiCo4Kg"]}},"prod-a_2cW9fV":{"CombinedMatchPatternMatches":{"clause":"30.2.5","ids":["prod-TGrK8XcZ"]}},"prod-BMX8uZDG":{"CombinedMatchPatternMatches":{"clause":"30.2.5","ids":["prod-hYdo8hkU"]}},"prod-4IhLPseH":{"CombinedMatchPatternMatches":{"clause":"30.2.5","ids":["prod-_QtiVeJ1"]}}}`); -let biblio = JSON.parse(`{"refsByClause":{"welcome":["_ref_0","_ref_1","_ref_2","_ref_3","_ref_4"],"sec-object-internal-methods-and-internal-slots":["_ref_5"],"sec-object-@@custommatcher":["_ref_6"],"sec-function-@@custommatcher":["_ref_7"],"sec-function.prototype-@@custommatcher":["_ref_8"],"sec-boolean-@@custommatcher":["_ref_9"],"sec-symbol.custommatcher":["_ref_10"],"sec-symbol-@@custommatcher":["_ref_11","_ref_12","_ref_13"],"sec-error-@@custommatcher":["_ref_14"],"sec-properties-of-the-error-constructors":["_ref_15"],"sec-number-@@custommatcher":["_ref_16"],"sec-bigint-@@custommatcher":["_ref_17"],"sec-date-@@custommatcher":["_ref_18"],"sec-string-@@custommatcher":["_ref_19"],"sec-regexp-@@custommatcher":["_ref_20","_ref_21"],"sec-regexp.prototype-@@custommatcher":["_ref_22"],"sec-array-@@custommatcher":["_ref_23"],"sec-_typedarray_-@@custommatcher":["_ref_24"],"sec-map-@@custommatcher":["_ref_25"],"sec-set-@@custommatcher":["_ref_26"],"sec-weakmap-@@custommatcher":["_ref_27"],"sec-weakset-@@custommatcher":["_ref_28"],"sec-arraybuffer-@@custommatcher":["_ref_29"],"sec-sharedarraybuffer-@@custommatcher":["_ref_30"],"sec-dataview-@@custommatcher":["_ref_31"],"sec-json-@@custommatcher":["_ref_32"],"sec-weakref-@@custommatcher":["_ref_33"],"sec-finalizationregistry-@@custommatcher":["_ref_34"],"sec-promise-@@custommatcher":["_ref_35"],"sec-match-pattern-matches":["_ref_36","_ref_37","_ref_38","_ref_39","_ref_40","_ref_41","_ref_82","_ref_83","_ref_84","_ref_85","_ref_86","_ref_87","_ref_88","_ref_89","_ref_90","_ref_91"],"sec-primitive-pattern-matches":["_ref_42"],"sec-member-expression-pattern-matches":["_ref_43","_ref_44","_ref_92","_ref_93"],"sec-unary-algebraic-pattern-matches":["_ref_45","_ref_94"],"sec-combined-match-pattern-matches":["_ref_46","_ref_47","_ref_48","_ref_49","_ref_50","_ref_51","_ref_95","_ref_96","_ref_97","_ref_98","_ref_99","_ref_100","_ref_101","_ref_102","_ref_103","_ref_104"],"sec-invoke-custom-matcher":["_ref_52","_ref_53","_ref_54"],"sec-validatecustommatcherhint":["_ref_55"],"sec-match-patterns":["_ref_56","_ref_57","_ref_58","_ref_59","_ref_60","_ref_61","_ref_62","_ref_63","_ref_64","_ref_65","_ref_66","_ref_67","_ref_68","_ref_69","_ref_70"],"sec-match-patterns-early-errors":["_ref_71","_ref_72","_ref_73","_ref_74","_ref_75","_ref_76","_ref_77","_ref_78","_ref_79","_ref_80","_ref_81"]},"entries":[{"type":"clause","id":"welcome","titleHTML":"Welcome","number":"1"},{"type":"table","id":"table-1","number":1,"caption":"Table 1: Well-known Symbols"},{"type":"term","term":"@@customMatcher","refId":"sec-well-known-symbols"},{"type":"clause","id":"sec-well-known-symbols","titleHTML":"Well-Known Symbols","number":"6.1.5.1","referencingIds":["_ref_10","_ref_15","_ref_21","_ref_54"]},{"type":"clause","id":"sec-ecmascript-language-types-symbol-type","titleHTML":"The Symbol Type","number":"6.1.5","referencingIds":["_ref_12","_ref_13"]},{"type":"clause","id":"sec-object-internal-methods-and-internal-slots","titleHTML":"Object Internal Methods and Internal Slots","number":"6.1.7"},{"type":"clause","id":"sec-ecmascript-language-types","titleHTML":"ECMAScript Language Types","number":"6.1","referencingIds":["_ref_5","_ref_36","_ref_42","_ref_43","_ref_45","_ref_46","_ref_52","_ref_53","_ref_55"]},{"type":"op","aoid":"Type","refId":"sec-ecmascript-data-types-and-values"},{"type":"clause","id":"sec-ecmascript-data-types-and-values","titleHTML":"ECMAScript Data Types and Values","number":"6"},{"type":"term","term":"InitializeInstance","refId":"sec-initializeinstance"},{"type":"op","aoid":"InitializeInstanceElements","refId":"sec-initializeinstance"},{"type":"clause","id":"sec-initializeinstance","title":"InitializeInstanceElements ( O, constructor )","titleHTML":"InitializeInstanceElements ( O, constructor )","number":"7.3.34","referencingIds":["_ref_3"]},{"type":"clause","id":"sec-operations-on-objects","titleHTML":"Operations on Objects","number":"7.3"},{"type":"clause","id":"sec-abstract-operations","titleHTML":"Abstract Operations","number":"7"},{"type":"op","aoid":"ClassDefinitionEvaluation","refId":"sec-runtime-semantics-classdefinitionevaluation"},{"type":"clause","id":"sec-runtime-semantics-classdefinitionevaluation","titleHTML":"Runtime Semantics: ClassDefinitionEvaluation","number":"15.7.14","referencingIds":["_ref_4"]},{"type":"clause","id":"sec-class-definitions","titleHTML":"Class Definitions","number":"15.7"},{"type":"clause","id":"sec-ecmascript-language-functions-and-classes","titleHTML":"ECMAScript Language: Functions and Classes","number":"15"},{"type":"clause","id":"sec-object-@@custommatcher","title":"Object [ @@customMatcher ] ( subject, hint )","titleHTML":"Object [ @@customMatcher ] ( subject, hint )","number":"20.1.2.24"},{"type":"clause","id":"sec-properties-of-the-object-constructor","titleHTML":"Properties of the Object Constructor","number":"20.1.2"},{"type":"clause","id":"sec-object-objects","titleHTML":"Object Objects","number":"20.1"},{"type":"clause","id":"sec-function-@@custommatcher","title":"Function [ @@customMatcher ] ( subject, hint )","titleHTML":"Function [ @@customMatcher ] ( subject, hint )","number":"20.2.2.2","referencingIds":["_ref_1"]},{"type":"clause","id":"sec-properties-of-the-function-constructor","titleHTML":"Properties of the Function Constructor","number":"20.2.2"},{"type":"clause","id":"sec-function.prototype-@@custommatcher","title":"Function [ @@customMatcher ] ( subject, hint )","titleHTML":"Function [ @@customMatcher ] ( subject, hint )","number":"20.2.3.7"},{"type":"clause","id":"sec-properties-of-the-function-prototype-object","titleHTML":"Properties of the Function Prototype Object","number":"20.2.3"},{"type":"clause","id":"sec-function-objects","titleHTML":"Function Objects","number":"20.2"},{"type":"clause","id":"sec-boolean-@@custommatcher","title":"Boolean [ @@customMatcher ] ( subject, hint )","titleHTML":"Boolean [ @@customMatcher ] ( subject, hint )","number":"20.3.2.2"},{"type":"clause","id":"sec-properties-of-the-boolean-constructor","titleHTML":"Properties of the Boolean Constructor","number":"20.3.2"},{"type":"clause","id":"sec-boolean-objects","titleHTML":"Boolean Objects","number":"20.3"},{"type":"clause","id":"sec-symbol.custommatcher","titleHTML":"Symbol.customMatcher","number":"20.4.2.17"},{"type":"clause","id":"sec-symbol-@@custommatcher","title":"Symbol [ @@customMatcher ] ( subject, hint )","titleHTML":"Symbol [ @@customMatcher ] ( subject, hint )","number":"20.4.2.18"},{"type":"clause","id":"sec-properties-of-the-symbol-constructor","titleHTML":"Properties of the Symbol Constructor","number":"20.4.2"},{"type":"clause","id":"sec-symbol-objects","titleHTML":"Symbol Objects","number":"20.4"},{"type":"clause","id":"sec-error-@@custommatcher","title":"Error [ @@customMatcher ] ( subject, hint )","titleHTML":"Error [ @@customMatcher ] ( subject, hint )","number":"20.5.1.2.1"},{"type":"clause","id":"sec-properties-of-the-error-constructors","titleHTML":"Properties of the Error Constructor","number":"20.5.1.2"},{"type":"clause","id":"sec-error-constructor","titleHTML":"The Error Constructor","number":"20.5.1"},{"type":"clause","id":"sec-error-objects","titleHTML":"Error Objects","number":"20.5"},{"type":"clause","id":"sec-fundamental-objects","titleHTML":"Fundamental Objects","number":"20"},{"type":"clause","id":"sec-number-@@custommatcher","title":"Number [ @@customMatcher ] ( subject, hint )","titleHTML":"Number [ @@customMatcher ] ( subject, hint )","number":"21.1.2.16"},{"type":"clause","id":"sec-properties-of-the-number-constructor","titleHTML":"Properties of the Number Constructor","number":"21.1.2"},{"type":"clause","id":"sec-number-objects","titleHTML":"Number Objects","number":"21.1"},{"type":"clause","id":"sec-bigint-@@custommatcher","title":"BigInt [ @@customMatcher ] ( subject, hint )","titleHTML":"BigInt [ @@customMatcher ] ( subject, hint )","number":"21.2.2.4"},{"type":"clause","id":"sec-properties-of-the-bigint-constructor","titleHTML":"Properties of the BigInt Constructor","number":"21.2.2"},{"type":"clause","id":"sec-bigint-objects","titleHTML":"BigInt Objects","number":"21.2"},{"type":"clause","id":"sec-date-@@custommatcher","title":"Date [ @@customMatcher ] ( subject, hint )","titleHTML":"Date [ @@customMatcher ] ( subject, hint )","number":"21.4.3.5"},{"type":"clause","id":"sec-properties-of-the-date-constructor","titleHTML":"Properties of the Date Constructor","number":"21.4.3"},{"type":"clause","id":"sec-date-objects","titleHTML":"Date Objects","number":"21.4"},{"type":"clause","id":"sec-numbers-and-dates","titleHTML":"Numbers and Dates","number":"21"},{"type":"clause","id":"sec-string-@@custommatcher","title":"String [ @@customMatcher ] ( subject, hint )","titleHTML":"String [ @@customMatcher ] ( subject, hint )","number":"22.1.2.5"},{"type":"clause","id":"sec-properties-of-the-string-constructor","titleHTML":"Properties of the String Constructor","number":"22.1.2"},{"type":"clause","id":"sec-string-objects","titleHTML":"String Objects","number":"22.1"},{"type":"clause","id":"sec-regexp-@@custommatcher","title":"RegExp [ @@customMatcher ] ( subject, hint )","titleHTML":"RegExp [ @@customMatcher ] ( subject, hint )","number":"22.2.5.3"},{"type":"clause","id":"sec-properties-of-the-regexp-constructor","titleHTML":"Properties of the RegExp Constructor","number":"22.2.5"},{"type":"clause","id":"sec-regexp.prototype-@@custommatcher","title":"RegExp.prototype [ @@customMatcher ] ( subject, hint )","titleHTML":"RegExp.prototype [ @@customMatcher ] ( subject, hint )","number":"22.2.6.20"},{"type":"clause","id":"sec-properties-of-the-regexp-prototype-object","titleHTML":"Properties of the RegExp Prototype Object","number":"22.2.6"},{"type":"clause","id":"sec-regexp-regular-expression-objects","titleHTML":"RegExp (Regular Expression) Objects","number":"22.2"},{"type":"clause","id":"sec-text-processing","titleHTML":"Text Processing","number":"22"},{"type":"clause","id":"sec-array-@@custommatcher","title":"Array [ @@customMatcher ] ( subject, hint )","titleHTML":"Array [ @@customMatcher ] ( subject, hint )","number":"23.1.2.6"},{"type":"clause","id":"sec-properties-of-the-array-constructor","titleHTML":"Properties of the Array Constructor","number":"23.1.2"},{"type":"clause","id":"sec-array-objects","titleHTML":"Array Objects","number":"23.1"},{"type":"clause","id":"sec-_typedarray_-@@custommatcher","title":"TypedArray [ @@customMatcher ] ( subject, hint )","titleHTML":"TypedArray [ @@customMatcher ] ( subject, hint )","number":"23.2.6.3"},{"type":"clause","id":"sec-properties-of-the-typedarray-constructors","title":"Properties of the TypedArray Constructors","titleHTML":"Properties of the TypedArray Constructors","number":"23.2.6"},{"type":"clause","id":"sec-typedarray-objects","titleHTML":"TypedArray Objects","number":"23.2"},{"type":"clause","id":"sec-indexed-collections","titleHTML":"Indexed Collections","number":"23"},{"type":"clause","id":"sec-map-@@custommatcher","title":"Map [ @@customMatcher ] ( subject, hint )","titleHTML":"Map [ @@customMatcher ] ( subject, hint )","number":"24.1.2.3"},{"type":"clause","id":"sec-properties-of-the-map-constructor","titleHTML":"Properties of the Map Constructor","number":"24.1.2"},{"type":"clause","id":"sec-map-objects","titleHTML":"Map Objects","number":"24.1"},{"type":"clause","id":"sec-set-@@custommatcher","title":"Set [ @@customMatcher ] ( subject, hint )","titleHTML":"Set [ @@customMatcher ] ( subject, hint )","number":"24.2.2.3"},{"type":"clause","id":"sec-properties-of-the-set-constructor","titleHTML":"Properties of the Set Constructor","number":"24.2.2"},{"type":"clause","id":"sec-set-objects","titleHTML":"Set Objects","number":"24.2"},{"type":"clause","id":"sec-weakmap-@@custommatcher","title":"WeakMap [ @@customMatcher ] ( subject, hint )","titleHTML":"WeakMap [ @@customMatcher ] ( subject, hint )","number":"24.3.2.2"},{"type":"clause","id":"sec-properties-of-the-weakmap-constructor","titleHTML":"Properties of the WeakMap Constructor","number":"24.3.2"},{"type":"clause","id":"sec-weakmap-objects","titleHTML":"WeakMap Objects","number":"24.3"},{"type":"clause","id":"sec-weakset-@@custommatcher","title":"WeakSet [ @@customMatcher ] ( subject, hint )","titleHTML":"WeakSet [ @@customMatcher ] ( subject, hint )","number":"24.4.2.2"},{"type":"clause","id":"sec-properties-of-the-weakset-constructor","titleHTML":"Properties of the WeakSet Constructor","number":"24.4.2"},{"type":"clause","id":"sec-weakset-objects","titleHTML":"WeakSet Objects","number":"24.4"},{"type":"clause","id":"sec-keyed-collections","titleHTML":"Keyed Collections","number":"24"},{"type":"clause","id":"sec-arraybuffer-@@custommatcher","title":"ArrayBuffer [ @@customMatcher ] ( subject, hint )","titleHTML":"ArrayBuffer [ @@customMatcher ] ( subject, hint )","number":"25.1.5.4"},{"type":"clause","id":"sec-properties-of-the-arraybuffer-constructor","titleHTML":"Properties of the ArrayBuffer Constructor","number":"25.1.5"},{"type":"clause","id":"sec-arraybuffer-objects","titleHTML":"ArrayBuffer Objects","number":"25.1"},{"type":"clause","id":"sec-sharedarraybuffer-@@custommatcher","title":"SharedArrayBuffer [ @@customMatcher ] ( subject, hint )","titleHTML":"SharedArrayBuffer [ @@customMatcher ] ( subject, hint )","number":"25.2.4.3"},{"type":"clause","id":"sec-properties-of-the-sharedarraybuffer-constructor","titleHTML":"Properties of the SharedArrayBuffer Constructor","number":"25.2.4"},{"type":"clause","id":"sec-sharedarraybuffer-objects","titleHTML":"SharedArrayBuffer Objects","number":"25.2"},{"type":"clause","id":"sec-dataview-@@custommatcher","title":"DataView [ @@customMatcher ] ( subject, hint )","titleHTML":"DataView [ @@customMatcher ] ( subject, hint )","number":"25.3.3.2"},{"type":"clause","id":"sec-properties-of-the-dataview-constructor","titleHTML":"Properties of the DataView Constructor","number":"25.3.3"},{"type":"clause","id":"sec-dataview-objects","titleHTML":"DataView Objects","number":"25.3"},{"type":"clause","id":"sec-json-@@custommatcher","title":"JSON [ @@customMatcher ] ( subject, hint )","titleHTML":"JSON [ @@customMatcher ] ( subject, hint )","number":"25.5.4","referencingIds":["_ref_2"]},{"type":"clause","id":"sec-json-object","titleHTML":"The JSON Object","number":"25.5"},{"type":"clause","id":"sec-structured-data","titleHTML":"Structured Data","number":"25"},{"type":"clause","id":"sec-weakref-@@custommatcher","title":"WeakRef [ @@customMatcher ] ( subject, hint )","titleHTML":"WeakRef [ @@customMatcher ] ( subject, hint )","number":"26.1.2.2"},{"type":"clause","id":"sec-properties-of-the-weak-ref-constructor","titleHTML":"Properties of the WeakRef Constructor","number":"26.1.2"},{"type":"clause","id":"sec-weak-ref-objects","titleHTML":"WeakRef Objects","number":"26.1"},{"type":"clause","id":"sec-finalizationregistry-@@custommatcher","title":"FinalizationRegistry [ @@customMatcher ] ( subject, hint )","titleHTML":"FinalizationRegistry [ @@customMatcher ] ( subject, hint )","number":"26.2.2.2"},{"type":"clause","id":"sec-properties-of-the-finalization-registry-constructor","titleHTML":"Properties of the FinalizationRegistry Constructor","number":"26.2.2"},{"type":"clause","id":"sec-finalization-registry-objects","titleHTML":"FinalizationRegistry Objects","number":"26.2"},{"type":"clause","id":"sec-managing-memory","titleHTML":"Managing Memory","number":"26"},{"type":"clause","id":"sec-promise-@@custommatcher","title":"Promise [ @@customMatcher ] ( subject, hint )","titleHTML":"Promise [ @@customMatcher ] ( subject, hint )","number":"27.2.4.9"},{"type":"clause","id":"sec-properties-of-the-promise-constructor","titleHTML":"Properties of the Promise Constructor","number":"27.2.4"},{"type":"clause","id":"sec-promise-objects","titleHTML":"Promise Objects","number":"27.2"},{"type":"clause","id":"sec-control-abstraction-objects","titleHTML":"Control Abstraction Objects","number":"27"},{"type":"clause","id":"sec-proxy-@@custommatcher","title":"Proxy [ @@customMatcher ] ( subject, hint )","titleHTML":"Proxy [ @@customMatcher ] ( subject, hint )","number":"28.2.1.2"},{"type":"clause","id":"sec-proxy-constructor","titleHTML":"The Proxy Constructor","number":"28.2.1"},{"type":"clause","id":"sec-proxy-objects","titleHTML":"Proxy Objects","number":"28.2"},{"type":"clause","id":"sec-reflection","titleHTML":"Reflection","number":"28"},{"type":"production","id":"prod-MatchPattern","name":"MatchPattern","referencingIds":["_ref_56","_ref_66","_ref_67","_ref_68","_ref_69","_ref_70","_ref_71","_ref_72","_ref_73","_ref_75","_ref_76","_ref_77","_ref_79","_ref_80","_ref_82","_ref_83","_ref_95","_ref_96","_ref_97","_ref_98","_ref_99","_ref_100","_ref_101","_ref_102","_ref_103","_ref_104"]},{"type":"production","id":"prod-PrimitivePattern","name":"PrimitivePattern","referencingIds":["_ref_57","_ref_84","_ref_85"]},{"type":"production","id":"prod-MemberExpressionPattern","name":"MemberExpressionPattern","referencingIds":["_ref_58","_ref_62","_ref_63","_ref_86","_ref_87"]},{"type":"production","id":"prod-PatternMatchingMemberExpression","name":"PatternMatchingMemberExpression","referencingIds":["_ref_61","_ref_64","_ref_65","_ref_92","_ref_93"]},{"type":"production","id":"prod-UnaryAlgebraicPattern","name":"UnaryAlgebraicPattern","referencingIds":["_ref_59","_ref_88","_ref_89","_ref_94"]},{"type":"production","id":"prod-CombinedMatchPattern","name":"CombinedMatchPattern","referencingIds":["_ref_60","_ref_74","_ref_78","_ref_81","_ref_90","_ref_91"]},{"type":"clause","id":"sec-match-patterns-early-errors","titleHTML":"Static Semantics: Early Errors","number":"30.1.1"},{"type":"clause","id":"sec-match-patterns","titleHTML":"Match Patterns","number":"30.1"},{"type":"op","aoid":"MatchPatternMatches","refId":"sec-match-pattern-matches"},{"type":"clause","id":"sec-match-pattern-matches","titleHTML":"Runtime Semantics: MatchPatternMatches","number":"30.2.1","referencingIds":["_ref_37","_ref_47","_ref_48","_ref_49","_ref_50","_ref_51"]},{"type":"op","aoid":"PrimitivePatternMatches","refId":"sec-primitive-pattern-matches"},{"type":"clause","id":"sec-primitive-pattern-matches","titleHTML":"Runtime Semantics: PrimitivePatternMatches","number":"30.2.2","referencingIds":["_ref_38"]},{"type":"op","aoid":"MemberExpressionPatternMatches","refId":"sec-member-expression-pattern-matches"},{"type":"clause","id":"sec-member-expression-pattern-matches","titleHTML":"Runtime Semantics: MemberExpressionPatternMatches","number":"30.2.3","referencingIds":["_ref_39"]},{"type":"op","aoid":"UnaryAlgebraicPatternMatches","refId":"sec-unary-algebraic-pattern-matches"},{"type":"clause","id":"sec-unary-algebraic-pattern-matches","titleHTML":"Runtime Semantics: UnaryAlgebraicPatternMatches","number":"30.2.4","referencingIds":["_ref_40"]},{"type":"op","aoid":"CombinedMatchPatternMatches","refId":"sec-combined-match-pattern-matches"},{"type":"clause","id":"sec-combined-match-pattern-matches","titleHTML":"Runtime Semantics: CombinedMatchPatternMatches","number":"30.2.5","referencingIds":["_ref_41"]},{"type":"clause","id":"sec-match-pattern-semantics","titleHTML":"Match Pattern Semantics","number":"30.2"},{"type":"op","aoid":"InvokeCustomMatcher","refId":"sec-invoke-custom-matcher"},{"type":"clause","id":"sec-invoke-custom-matcher","title":"InvokeCustomMatcher ( matcher, subject, kind )","titleHTML":"InvokeCustomMatcher ( matcher, subject, kind )","number":"30.3.1","referencingIds":["_ref_44"]},{"type":"op","aoid":"ValidateCustomMatcherHint","refId":"sec-validatecustommatcherhint"},{"type":"clause","id":"sec-validatecustommatcherhint","title":"ValidateCustomMatcherHint ( hint [ , kind ] )","titleHTML":"ValidateCustomMatcherHint ( hint [ , kind ] )","number":"30.3.2","referencingIds":["_ref_6","_ref_7","_ref_8","_ref_9","_ref_11","_ref_14","_ref_16","_ref_17","_ref_18","_ref_19","_ref_20","_ref_22","_ref_23","_ref_24","_ref_25","_ref_26","_ref_27","_ref_28","_ref_29","_ref_30","_ref_31","_ref_32","_ref_33","_ref_34","_ref_35"]},{"type":"clause","id":"sec-abstract-operations-for-pattern-matching","titleHTML":"Abstract Operations for Pattern Matching","number":"30.3"},{"type":"clause","id":"sec-pattern-matching","title":"Pattern Matching","titleHTML":"Pattern Matching","number":"30"},{"type":"clause","id":"sec-notes-layering","titleHTML":"Layering","number":"31.1"},{"type":"clause","id":"sec-notes-code-example","titleHTML":"Code example","number":"31.2"},{"type":"clause","id":"sec-notes","titleHTML":"Editor's notes","number":"31","referencingIds":["_ref_0"]},{"type":"clause","id":"sec-copyright-and-software-license","title":"Copyright & Software License","titleHTML":"Copyright & Software License","number":"A"}]}`); +let biblio = JSON.parse(`{"refsByClause":{"welcome":["_ref_0","_ref_1","_ref_2","_ref_3"],"sec-object-internal-methods-and-internal-slots":["_ref_4"],"sec-object-@@custommatcher":["_ref_5"],"sec-function-@@custommatcher":["_ref_6"],"sec-function.prototype-@@custommatcher":["_ref_7"],"sec-boolean-@@custommatcher":["_ref_8"],"sec-symbol.custommatcher":["_ref_9"],"sec-symbol-@@custommatcher":["_ref_10","_ref_11","_ref_12"],"sec-error-@@custommatcher":["_ref_13"],"sec-properties-of-the-error-constructors":["_ref_14"],"sec-number-@@custommatcher":["_ref_15"],"sec-bigint-@@custommatcher":["_ref_16"],"sec-date-@@custommatcher":["_ref_17"],"sec-string-@@custommatcher":["_ref_18"],"sec-regexp-@@custommatcher":["_ref_19","_ref_20"],"sec-regexp.prototype-@@custommatcher":["_ref_21"],"sec-array-@@custommatcher":["_ref_22"],"sec-_typedarray_-@@custommatcher":["_ref_23"],"sec-map-@@custommatcher":["_ref_24"],"sec-set-@@custommatcher":["_ref_25"],"sec-weakmap-@@custommatcher":["_ref_26"],"sec-weakset-@@custommatcher":["_ref_27"],"sec-arraybuffer-@@custommatcher":["_ref_28"],"sec-sharedarraybuffer-@@custommatcher":["_ref_29"],"sec-dataview-@@custommatcher":["_ref_30"],"sec-weakref-@@custommatcher":["_ref_31"],"sec-finalizationregistry-@@custommatcher":["_ref_32"],"sec-promise-@@custommatcher":["_ref_33"],"sec-match-pattern-matches":["_ref_34","_ref_35","_ref_36","_ref_37","_ref_38","_ref_39","_ref_83","_ref_84","_ref_85","_ref_86","_ref_87","_ref_88","_ref_89","_ref_90","_ref_91","_ref_92"],"sec-primitive-pattern-matches":["_ref_40"],"sec-member-expression-pattern-matches":["_ref_41","_ref_42","_ref_93","_ref_94"],"sec-unary-algebraic-pattern-matches":["_ref_43","_ref_95"],"sec-combined-match-pattern-matches":["_ref_44","_ref_45","_ref_46","_ref_47","_ref_48","_ref_49","_ref_96","_ref_97","_ref_98","_ref_99","_ref_100","_ref_101","_ref_102","_ref_103","_ref_104","_ref_105"],"sec-invoke-custom-matcher":["_ref_50","_ref_51","_ref_52","_ref_53"],"sec-validatecustommatcherhint":["_ref_54"],"sec-match-patterns":["_ref_55","_ref_56","_ref_57","_ref_58","_ref_59","_ref_60","_ref_61","_ref_62","_ref_63","_ref_64","_ref_65","_ref_66","_ref_67","_ref_68","_ref_69","_ref_70","_ref_71"],"sec-match-patterns-early-errors":["_ref_72","_ref_73","_ref_74","_ref_75","_ref_76","_ref_77","_ref_78","_ref_79","_ref_80","_ref_81","_ref_82"]},"entries":[{"type":"clause","id":"welcome","titleHTML":"Welcome","number":"1"},{"type":"table","id":"table-1","number":1,"caption":"Table 1: Well-known Symbols"},{"type":"term","term":"@@customMatcher","refId":"sec-well-known-symbols"},{"type":"clause","id":"sec-well-known-symbols","titleHTML":"Well-Known Symbols","number":"6.1.5.1","referencingIds":["_ref_9","_ref_14","_ref_20","_ref_53"]},{"type":"clause","id":"sec-ecmascript-language-types-symbol-type","titleHTML":"The Symbol Type","number":"6.1.5","referencingIds":["_ref_11","_ref_12"]},{"type":"clause","id":"sec-object-internal-methods-and-internal-slots","titleHTML":"Object Internal Methods and Internal Slots","number":"6.1.7"},{"type":"clause","id":"sec-ecmascript-language-types","titleHTML":"ECMAScript Language Types","number":"6.1","referencingIds":["_ref_4","_ref_34","_ref_40","_ref_41","_ref_43","_ref_44","_ref_50","_ref_51","_ref_52","_ref_54"]},{"type":"op","aoid":"Type","refId":"sec-ecmascript-data-types-and-values"},{"type":"clause","id":"sec-ecmascript-data-types-and-values","titleHTML":"ECMAScript Data Types and Values","number":"6"},{"type":"term","term":"InitializeInstance","refId":"sec-initializeinstance"},{"type":"op","aoid":"InitializeInstanceElements","refId":"sec-initializeinstance"},{"type":"clause","id":"sec-initializeinstance","title":"InitializeInstanceElements ( O, constructor )","titleHTML":"InitializeInstanceElements ( O, constructor )","number":"7.3.34","referencingIds":["_ref_2"]},{"type":"clause","id":"sec-operations-on-objects","titleHTML":"Operations on Objects","number":"7.3"},{"type":"clause","id":"sec-abstract-operations","titleHTML":"Abstract Operations","number":"7"},{"type":"op","aoid":"ClassDefinitionEvaluation","refId":"sec-runtime-semantics-classdefinitionevaluation"},{"type":"clause","id":"sec-runtime-semantics-classdefinitionevaluation","titleHTML":"Runtime Semantics: ClassDefinitionEvaluation","number":"15.7.14","referencingIds":["_ref_3"]},{"type":"clause","id":"sec-class-definitions","titleHTML":"Class Definitions","number":"15.7"},{"type":"clause","id":"sec-ecmascript-language-functions-and-classes","titleHTML":"ECMAScript Language: Functions and Classes","number":"15"},{"type":"clause","id":"sec-object-@@custommatcher","title":"Object [ @@customMatcher ] ( subject, hint )","titleHTML":"Object [ @@customMatcher ] ( subject, hint )","number":"20.1.2.24"},{"type":"clause","id":"sec-properties-of-the-object-constructor","titleHTML":"Properties of the Object Constructor","number":"20.1.2"},{"type":"clause","id":"sec-object-objects","titleHTML":"Object Objects","number":"20.1"},{"type":"clause","id":"sec-function-@@custommatcher","title":"Function [ @@customMatcher ] ( subject, hint )","titleHTML":"Function [ @@customMatcher ] ( subject, hint )","number":"20.2.2.2","referencingIds":["_ref_1"]},{"type":"clause","id":"sec-properties-of-the-function-constructor","titleHTML":"Properties of the Function Constructor","number":"20.2.2"},{"type":"clause","id":"sec-function.prototype-@@custommatcher","title":"Function.prototype [ @@customMatcher ] ( subject, hint, receiver )","titleHTML":"Function.prototype [ @@customMatcher ] ( subject, hint, receiver )","number":"20.2.3.7"},{"type":"clause","id":"sec-properties-of-the-function-prototype-object","titleHTML":"Properties of the Function Prototype Object","number":"20.2.3"},{"type":"clause","id":"sec-function-objects","titleHTML":"Function Objects","number":"20.2"},{"type":"clause","id":"sec-boolean-@@custommatcher","title":"Boolean [ @@customMatcher ] ( subject, hint )","titleHTML":"Boolean [ @@customMatcher ] ( subject, hint )","number":"20.3.2.2"},{"type":"clause","id":"sec-properties-of-the-boolean-constructor","titleHTML":"Properties of the Boolean Constructor","number":"20.3.2"},{"type":"clause","id":"sec-boolean-objects","titleHTML":"Boolean Objects","number":"20.3"},{"type":"clause","id":"sec-symbol.custommatcher","titleHTML":"Symbol.customMatcher","number":"20.4.2.17"},{"type":"clause","id":"sec-symbol-@@custommatcher","title":"Symbol [ @@customMatcher ] ( subject, hint )","titleHTML":"Symbol [ @@customMatcher ] ( subject, hint )","number":"20.4.2.18"},{"type":"clause","id":"sec-properties-of-the-symbol-constructor","titleHTML":"Properties of the Symbol Constructor","number":"20.4.2"},{"type":"clause","id":"sec-symbol-objects","titleHTML":"Symbol Objects","number":"20.4"},{"type":"clause","id":"sec-error-@@custommatcher","title":"Error [ @@customMatcher ] ( subject, hint )","titleHTML":"Error [ @@customMatcher ] ( subject, hint )","number":"20.5.1.2.1"},{"type":"clause","id":"sec-properties-of-the-error-constructors","titleHTML":"Properties of the Error Constructor","number":"20.5.1.2"},{"type":"clause","id":"sec-error-constructor","titleHTML":"The Error Constructor","number":"20.5.1"},{"type":"clause","id":"sec-error-objects","titleHTML":"Error Objects","number":"20.5"},{"type":"clause","id":"sec-fundamental-objects","titleHTML":"Fundamental Objects","number":"20"},{"type":"clause","id":"sec-number-@@custommatcher","title":"Number [ @@customMatcher ] ( subject, hint )","titleHTML":"Number [ @@customMatcher ] ( subject, hint )","number":"21.1.2.16"},{"type":"clause","id":"sec-properties-of-the-number-constructor","titleHTML":"Properties of the Number Constructor","number":"21.1.2"},{"type":"clause","id":"sec-number-objects","titleHTML":"Number Objects","number":"21.1"},{"type":"clause","id":"sec-bigint-@@custommatcher","title":"BigInt [ @@customMatcher ] ( subject, hint )","titleHTML":"BigInt [ @@customMatcher ] ( subject, hint )","number":"21.2.2.4"},{"type":"clause","id":"sec-properties-of-the-bigint-constructor","titleHTML":"Properties of the BigInt Constructor","number":"21.2.2"},{"type":"clause","id":"sec-bigint-objects","titleHTML":"BigInt Objects","number":"21.2"},{"type":"clause","id":"sec-date-@@custommatcher","title":"Date [ @@customMatcher ] ( subject, hint )","titleHTML":"Date [ @@customMatcher ] ( subject, hint )","number":"21.4.3.5"},{"type":"clause","id":"sec-properties-of-the-date-constructor","titleHTML":"Properties of the Date Constructor","number":"21.4.3"},{"type":"clause","id":"sec-date-objects","titleHTML":"Date Objects","number":"21.4"},{"type":"clause","id":"sec-numbers-and-dates","titleHTML":"Numbers and Dates","number":"21"},{"type":"clause","id":"sec-string-@@custommatcher","title":"String [ @@customMatcher ] ( subject, hint )","titleHTML":"String [ @@customMatcher ] ( subject, hint )","number":"22.1.2.5"},{"type":"clause","id":"sec-properties-of-the-string-constructor","titleHTML":"Properties of the String Constructor","number":"22.1.2"},{"type":"clause","id":"sec-string-objects","titleHTML":"String Objects","number":"22.1"},{"type":"clause","id":"sec-regexp-@@custommatcher","title":"RegExp [ @@customMatcher ] ( subject, hint )","titleHTML":"RegExp [ @@customMatcher ] ( subject, hint )","number":"22.2.5.3"},{"type":"clause","id":"sec-properties-of-the-regexp-constructor","titleHTML":"Properties of the RegExp Constructor","number":"22.2.5"},{"type":"clause","id":"sec-regexp.prototype-@@custommatcher","title":"RegExp.prototype [ @@customMatcher ] ( subject, hint )","titleHTML":"RegExp.prototype [ @@customMatcher ] ( subject, hint )","number":"22.2.6.20"},{"type":"clause","id":"sec-properties-of-the-regexp-prototype-object","titleHTML":"Properties of the RegExp Prototype Object","number":"22.2.6"},{"type":"clause","id":"sec-regexp-regular-expression-objects","titleHTML":"RegExp (Regular Expression) Objects","number":"22.2"},{"type":"clause","id":"sec-text-processing","titleHTML":"Text Processing","number":"22"},{"type":"clause","id":"sec-array-@@custommatcher","title":"Array [ @@customMatcher ] ( subject, hint )","titleHTML":"Array [ @@customMatcher ] ( subject, hint )","number":"23.1.2.6"},{"type":"clause","id":"sec-properties-of-the-array-constructor","titleHTML":"Properties of the Array Constructor","number":"23.1.2"},{"type":"clause","id":"sec-array-objects","titleHTML":"Array Objects","number":"23.1"},{"type":"clause","id":"sec-_typedarray_-@@custommatcher","title":"TypedArray [ @@customMatcher ] ( subject, hint )","titleHTML":"TypedArray [ @@customMatcher ] ( subject, hint )","number":"23.2.6.3"},{"type":"clause","id":"sec-properties-of-the-typedarray-constructors","title":"Properties of the TypedArray Constructors","titleHTML":"Properties of the TypedArray Constructors","number":"23.2.6"},{"type":"clause","id":"sec-typedarray-objects","titleHTML":"TypedArray Objects","number":"23.2"},{"type":"clause","id":"sec-indexed-collections","titleHTML":"Indexed Collections","number":"23"},{"type":"clause","id":"sec-map-@@custommatcher","title":"Map [ @@customMatcher ] ( subject, hint )","titleHTML":"Map [ @@customMatcher ] ( subject, hint )","number":"24.1.2.3"},{"type":"clause","id":"sec-properties-of-the-map-constructor","titleHTML":"Properties of the Map Constructor","number":"24.1.2"},{"type":"clause","id":"sec-map-objects","titleHTML":"Map Objects","number":"24.1"},{"type":"clause","id":"sec-set-@@custommatcher","title":"Set [ @@customMatcher ] ( subject, hint )","titleHTML":"Set [ @@customMatcher ] ( subject, hint )","number":"24.2.2.3"},{"type":"clause","id":"sec-properties-of-the-set-constructor","titleHTML":"Properties of the Set Constructor","number":"24.2.2"},{"type":"clause","id":"sec-set-objects","titleHTML":"Set Objects","number":"24.2"},{"type":"clause","id":"sec-weakmap-@@custommatcher","title":"WeakMap [ @@customMatcher ] ( subject, hint )","titleHTML":"WeakMap [ @@customMatcher ] ( subject, hint )","number":"24.3.2.2"},{"type":"clause","id":"sec-properties-of-the-weakmap-constructor","titleHTML":"Properties of the WeakMap Constructor","number":"24.3.2"},{"type":"clause","id":"sec-weakmap-objects","titleHTML":"WeakMap Objects","number":"24.3"},{"type":"clause","id":"sec-weakset-@@custommatcher","title":"WeakSet [ @@customMatcher ] ( subject, hint )","titleHTML":"WeakSet [ @@customMatcher ] ( subject, hint )","number":"24.4.2.2"},{"type":"clause","id":"sec-properties-of-the-weakset-constructor","titleHTML":"Properties of the WeakSet Constructor","number":"24.4.2"},{"type":"clause","id":"sec-weakset-objects","titleHTML":"WeakSet Objects","number":"24.4"},{"type":"clause","id":"sec-keyed-collections","titleHTML":"Keyed Collections","number":"24"},{"type":"clause","id":"sec-arraybuffer-@@custommatcher","title":"ArrayBuffer [ @@customMatcher ] ( subject, hint )","titleHTML":"ArrayBuffer [ @@customMatcher ] ( subject, hint )","number":"25.1.5.4"},{"type":"clause","id":"sec-properties-of-the-arraybuffer-constructor","titleHTML":"Properties of the ArrayBuffer Constructor","number":"25.1.5"},{"type":"clause","id":"sec-arraybuffer-objects","titleHTML":"ArrayBuffer Objects","number":"25.1"},{"type":"clause","id":"sec-sharedarraybuffer-@@custommatcher","title":"SharedArrayBuffer [ @@customMatcher ] ( subject, hint )","titleHTML":"SharedArrayBuffer [ @@customMatcher ] ( subject, hint )","number":"25.2.4.3"},{"type":"clause","id":"sec-properties-of-the-sharedarraybuffer-constructor","titleHTML":"Properties of the SharedArrayBuffer Constructor","number":"25.2.4"},{"type":"clause","id":"sec-sharedarraybuffer-objects","titleHTML":"SharedArrayBuffer Objects","number":"25.2"},{"type":"clause","id":"sec-dataview-@@custommatcher","title":"DataView [ @@customMatcher ] ( subject, hint )","titleHTML":"DataView [ @@customMatcher ] ( subject, hint )","number":"25.3.3.2"},{"type":"clause","id":"sec-properties-of-the-dataview-constructor","titleHTML":"Properties of the DataView Constructor","number":"25.3.3"},{"type":"clause","id":"sec-dataview-objects","titleHTML":"DataView Objects","number":"25.3"},{"type":"clause","id":"sec-structured-data","titleHTML":"Structured Data","number":"25"},{"type":"clause","id":"sec-weakref-@@custommatcher","title":"WeakRef [ @@customMatcher ] ( subject, hint )","titleHTML":"WeakRef [ @@customMatcher ] ( subject, hint )","number":"26.1.2.2"},{"type":"clause","id":"sec-properties-of-the-weak-ref-constructor","titleHTML":"Properties of the WeakRef Constructor","number":"26.1.2"},{"type":"clause","id":"sec-weak-ref-objects","titleHTML":"WeakRef Objects","number":"26.1"},{"type":"clause","id":"sec-finalizationregistry-@@custommatcher","title":"FinalizationRegistry [ @@customMatcher ] ( subject, hint )","titleHTML":"FinalizationRegistry [ @@customMatcher ] ( subject, hint )","number":"26.2.2.2"},{"type":"clause","id":"sec-properties-of-the-finalization-registry-constructor","titleHTML":"Properties of the FinalizationRegistry Constructor","number":"26.2.2"},{"type":"clause","id":"sec-finalization-registry-objects","titleHTML":"FinalizationRegistry Objects","number":"26.2"},{"type":"clause","id":"sec-managing-memory","titleHTML":"Managing Memory","number":"26"},{"type":"clause","id":"sec-promise-@@custommatcher","title":"Promise [ @@customMatcher ] ( subject, hint )","titleHTML":"Promise [ @@customMatcher ] ( subject, hint )","number":"27.2.4.9"},{"type":"clause","id":"sec-properties-of-the-promise-constructor","titleHTML":"Properties of the Promise Constructor","number":"27.2.4"},{"type":"clause","id":"sec-promise-objects","titleHTML":"Promise Objects","number":"27.2"},{"type":"clause","id":"sec-control-abstraction-objects","titleHTML":"Control Abstraction Objects","number":"27"},{"type":"clause","id":"sec-proxy-@@custommatcher","title":"Proxy [ @@customMatcher ] ( subject, hint )","titleHTML":"Proxy [ @@customMatcher ] ( subject, hint )","number":"28.2.1.2"},{"type":"clause","id":"sec-proxy-constructor","titleHTML":"The Proxy Constructor","number":"28.2.1"},{"type":"clause","id":"sec-proxy-objects","titleHTML":"Proxy Objects","number":"28.2"},{"type":"clause","id":"sec-reflection","titleHTML":"Reflection","number":"28"},{"type":"production","id":"prod-MatchPattern","name":"MatchPattern","referencingIds":["_ref_55","_ref_67","_ref_68","_ref_69","_ref_70","_ref_71","_ref_72","_ref_73","_ref_74","_ref_76","_ref_77","_ref_78","_ref_80","_ref_81","_ref_83","_ref_84","_ref_96","_ref_97","_ref_98","_ref_99","_ref_100","_ref_101","_ref_102","_ref_103","_ref_104","_ref_105"]},{"type":"production","id":"prod-PrimitivePattern","name":"PrimitivePattern","referencingIds":["_ref_56","_ref_85","_ref_86"]},{"type":"production","id":"prod-MemberExpressionPattern","name":"MemberExpressionPattern","referencingIds":["_ref_57","_ref_87","_ref_88"]},{"type":"production","id":"prod-PatternMatchingMemberExpression","name":"PatternMatchingMemberExpression","referencingIds":["_ref_60","_ref_61","_ref_62","_ref_63","_ref_64","_ref_65","_ref_66","_ref_93","_ref_94"]},{"type":"production","id":"prod-UnaryAlgebraicPattern","name":"UnaryAlgebraicPattern","referencingIds":["_ref_58","_ref_89","_ref_90","_ref_95"]},{"type":"production","id":"prod-CombinedMatchPattern","name":"CombinedMatchPattern","referencingIds":["_ref_59","_ref_75","_ref_79","_ref_82","_ref_91","_ref_92"]},{"type":"clause","id":"sec-match-patterns-early-errors","titleHTML":"Static Semantics: Early Errors","number":"30.1.1"},{"type":"clause","id":"sec-match-patterns","titleHTML":"Match Patterns","number":"30.1"},{"type":"op","aoid":"MatchPatternMatches","refId":"sec-match-pattern-matches"},{"type":"clause","id":"sec-match-pattern-matches","titleHTML":"Runtime Semantics: MatchPatternMatches","number":"30.2.1","referencingIds":["_ref_35","_ref_45","_ref_46","_ref_47","_ref_48","_ref_49"]},{"type":"op","aoid":"PrimitivePatternMatches","refId":"sec-primitive-pattern-matches"},{"type":"clause","id":"sec-primitive-pattern-matches","titleHTML":"Runtime Semantics: PrimitivePatternMatches","number":"30.2.2","referencingIds":["_ref_36"]},{"type":"op","aoid":"MemberExpressionPatternMatches","refId":"sec-member-expression-pattern-matches"},{"type":"clause","id":"sec-member-expression-pattern-matches","titleHTML":"Runtime Semantics: MemberExpressionPatternMatches","number":"30.2.3","referencingIds":["_ref_37"]},{"type":"op","aoid":"UnaryAlgebraicPatternMatches","refId":"sec-unary-algebraic-pattern-matches"},{"type":"clause","id":"sec-unary-algebraic-pattern-matches","titleHTML":"Runtime Semantics: UnaryAlgebraicPatternMatches","number":"30.2.4","referencingIds":["_ref_38"]},{"type":"op","aoid":"CombinedMatchPatternMatches","refId":"sec-combined-match-pattern-matches"},{"type":"clause","id":"sec-combined-match-pattern-matches","titleHTML":"Runtime Semantics: CombinedMatchPatternMatches","number":"30.2.5","referencingIds":["_ref_39"]},{"type":"clause","id":"sec-match-pattern-semantics","titleHTML":"Match Pattern Semantics","number":"30.2"},{"type":"op","aoid":"InvokeCustomMatcher","refId":"sec-invoke-custom-matcher"},{"type":"clause","id":"sec-invoke-custom-matcher","title":"InvokeCustomMatcher ( matcher, subject, kind, receiver )","titleHTML":"InvokeCustomMatcher ( matcher, subject, kind, receiver )","number":"30.3.1","referencingIds":["_ref_42"]},{"type":"op","aoid":"ValidateCustomMatcherHint","refId":"sec-validatecustommatcherhint"},{"type":"clause","id":"sec-validatecustommatcherhint","title":"ValidateCustomMatcherHint ( hint [ , kind ] )","titleHTML":"ValidateCustomMatcherHint ( hint [ , kind ] )","number":"30.3.2","referencingIds":["_ref_5","_ref_6","_ref_7","_ref_8","_ref_10","_ref_13","_ref_15","_ref_16","_ref_17","_ref_18","_ref_19","_ref_21","_ref_22","_ref_23","_ref_24","_ref_25","_ref_26","_ref_27","_ref_28","_ref_29","_ref_30","_ref_31","_ref_32","_ref_33"]},{"type":"clause","id":"sec-abstract-operations-for-pattern-matching","titleHTML":"Abstract Operations for Pattern Matching","number":"30.3"},{"type":"clause","id":"sec-pattern-matching","title":"Pattern Matching","titleHTML":"Pattern Matching","number":"30"},{"type":"clause","id":"sec-notes-layering","titleHTML":"Layering","number":"31.1"},{"type":"clause","id":"sec-notes-code-example","titleHTML":"Code example","number":"31.2"},{"type":"clause","id":"sec-notes","titleHTML":"Editor's notes","number":"31","referencingIds":["_ref_0"]},{"type":"clause","id":"sec-copyright-and-software-license","title":"Copyright & Software License","titleHTML":"Copyright & Software License","number":"A"}]}`); ;let usesMultipage = false \ No newline at end of file diff --git a/index.html b/index.html index 0504677..c20f2ac 100644 --- a/index.html +++ b/index.html @@ -3,7 +3,7 @@ -Pattern Matching
    +Pattern Matching
    • Toggle shortcuts help?
    • Toggle "can call user code" annotationsu
    • @@ -12,7 +12,7 @@

    Stage 1 Draft / October 29, 2023

    Pattern Matching

    +

    Stage 1 Draft / October 29, 2023

    Pattern Matching

    @@ -97,7 +100,7 @@

    6.1.5.1 Well-Known Symbols

    6.1.7 Object Internal Methods and Internal Slots

    -

    All objects have an internal slot named [[ConstructedBy]], which is a List of ECMAScript language values. This List represents the origin of the object. Initially, it is an empty List.

    +

    All objects have an internal slot named [[ConstructedBy]], which is a List of ECMAScript language values. This List represents the origin of the object. Initially, it is an empty List.

    @@ -139,10 +142,10 @@

    12.10.1 Rules of Automatic Semicolon InsertionThe following are the additions of the restricted productions in the grammar:

    RelationalExpression[In, Yield, Await] : - RelationalExpression + RelationalExpression [no LineTerminator here] is - MatchPattern + MatchPattern @@ -150,7 +153,7 @@

    12.10.1 Rules of Automatic Semicolon InsertionCoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] [no LineTerminator here] { - MatchExpressionClauses[?Yield, ?Await] + MatchExpressionClauses[?Yield, ?Await] ; } @@ -160,7 +163,7 @@

    12.10.1 Rules of Automatic Semicolon InsertionCoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] [no LineTerminator here] { - MatchStatementClauses[?Yield, ?Await] + MatchStatementClauses[?Yield, ?Await] ; } @@ -186,16 +189,42 @@

    13 ECMAScript Language: Expressions

    13.2 Primary Expression

    Syntax

    - PrimaryExpression[Yield, Await] : - MatchExpression[?Yield, ?Await] + PrimaryExpression[Yield, Await] : + RegularExpressionLiteral + + + MatchExpression[?Yield, ?Await] + +

    13.2.7 Regular Expression Literals

    + + +

    13.2.7.1 Static Semantics: Early Errors

    + + PrimaryExpression : RegularExpressionLiteral + + + +
    + + +

    13.2.7.2 Static Semantics: IsValidRegularExpressionLiteral ( literal, canCreateBinding )

    +

    The abstract operation IsValidRegularExpressionLiteral takes arguments literal (a RegularExpressionLiteral Parse Node) and canCreateBinding (a Boolean) and returns a Boolean. It determines if its argument is a valid regular expression literal. It performs the following steps when called:

    +
    1. Let flags be FlagText of literal.
    2. If flags contains any code points other than d, g, i, m, s, u, v, or y, or if flags contains any code point more than once, return false.
    3. If flags contains u, let u be true; else let u be false.
    4. If flags contains v, let v be true; else let v be false.
    5. Let patternText be BodyText of literal.
    6. If u is false and v is false, then
      1. Let stringValue be CodePointsToString(patternText).
      2. Set patternText to the sequence of code points resulting from interpreting each of the 16-bit elements of stringValue as a Unicode BMP code point. UTF-16 decoding is not applied to the elements.
    7. Let parseResult be ParsePattern(patternText, u, v, canCreateBinding).
    8. If parseResult is a Parse Node, return true; else return false.
    +
    +
    +

    13.2.10 Match Expression

    See Match Expression for - PrimaryExpression : MatchExpression + PrimaryExpression : MatchExpression

    @@ -205,10 +234,10 @@

    13.10 Relational Operators

    Syntax

    RelationalExpression[In, Yield, Await] : - RelationalExpression[?In, ?Yield, ?Await] + RelationalExpression[?In, ?Yield, ?Await] [no LineTerminator here] is - MatchPattern[?Yield, ?Await] + MatchPattern[?Yield, ?Await] @@ -216,13 +245,13 @@

    Syntax

    13.10.1 Runtime Semantics: Evaluation

    RelationalExpression : - RelationalExpression + RelationalExpression is - MatchPattern + MatchPattern -
    1. Let lref be ? Evaluation of RelationalExpression.
    2. Let lval be ? GetValue(lref).
    3. Let cacheGroup be CreateMatchCache().
    4. Let matchCompletion be ? MatchPatternMatches of MatchPattern with argument lval and cacheGroup.
    5. If matchCompletion is a normal completion, then
      1. If matchCompletion.[[Value]] is not-matched, set matchCompletion to NormalCompletion(false).
      2. Else, set matchCompletion to NormalCompletion(true).
    6. Let result be Completion(FinishMatch(matchCompletion, cacheGroup)).
    7. Assert: result is a normal completion or an abrupt completion.
    8. Return result.
    +
    1. Let lref be ? Evaluation of RelationalExpression.
    2. Let lval be ? GetValue(lref).
    3. Let cacheGroup be CreateMatchCache().
    4. Let matchCompletion be ? MatchPatternMatches of MatchPattern with argument lval and cacheGroup.
    5. If matchCompletion is a normal completion, then
      1. If matchCompletion.[[Value]] is not-matched, set matchCompletion to NormalCompletion(false).
      2. Else, set matchCompletion to NormalCompletion(true).
    6. Let result be Completion(FinishMatch(matchCompletion, cacheGroup)).
    7. Assert: result is a normal completion or an abrupt completion.
    8. Return result.
    Note
    expr is { length: 10, 0: "a" };
    @@ -242,7 +271,7 @@

    14 ECMAScript Language: Statements and Declarati

    Syntax

    Statement[Yield, Await, Return] : - MatchStatement[?Yield, ?Await, ?Return] + MatchStatement[?Yield, ?Await, ?Return] @@ -255,22 +284,22 @@

    Syntax

    CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] [no LineTerminator here] { - MatchStatementClauses[?Yield, ?Await] + MatchStatementClauses[?Yield, ?Await] ; }
    MatchStatementClauses[Yield, Await] : - MatchStatementClause[?Yield, ?Await] + MatchStatementClause[?Yield, ?Await] - MatchStatementClauses[?Yield, ?Await] + MatchStatementClauses[?Yield, ?Await] ; - MatchStatementClause[?Yield, ?Await] + MatchStatementClause[?Yield, ?Await] - MatchStatementClauses[?Yield, ?Await] + MatchStatementClauses[?Yield, ?Await] ; default : @@ -284,7 +313,7 @@

    Syntax

    MatchStatementClause[Yield, Await] : - MatchPattern[?Yield, ?Await] + MatchPattern[?Yield, ?Await] : Statement[?Yield, ?Await] @@ -328,18 +357,18 @@

    14.17.1 Static Semantics: Early Errors

    MatchStatement : CoverCallExpressionAndAsyncArrowHead { - MatchStatementClauses + MatchStatementClauses ; }
    MatchStatementClauses : - MatchStatementClauses + MatchStatementClauses ; default : @@ -355,7 +384,7 @@

    14.17.1 Static Semantics: Early Errors

    MatchStatementClause : - MatchPattern + MatchPattern : Statement @@ -372,35 +401,35 @@

    14.17.2 Runtime Semantics: Evaluation

    MatchStatement : CoverCallExpressionAndAsyncArrowHead { - MatchStatementClauses + MatchStatementClauses ; }
    -
    1. Let head be the MatchHead that is covered by CoverCallExpressionAndAsyncArrowHead.
    2. Let subjectParseNode be the Expression of head.
    3. Let subjectRef be the ? Evaluation of subjectParseNode.
    4. Let subject be ? GetValue(subjectRef).
    5. Let cacheGroup be CreateMatchCache().
    6. Let matchCompletion be Completion(MatchStatementClausesEvaluation of MatchStatementClauses with arguments subject and cacheGroup).
    7. Perform ? UpdateEmpty(matchCompletion, undefined).
    8. Return Completion(FinishMatch(matchCompletion, cacheGroup)).
    +
    1. Let head be the MatchHead that is covered by CoverCallExpressionAndAsyncArrowHead.
    2. Let subjectParseNode be the Expression of head.
    3. Let subjectRef be the ? Evaluation of subjectParseNode.
    4. Let subject be ? GetValue(subjectRef).
    5. Let cacheGroup be CreateMatchCache().
    6. Let matchCompletion be Completion(MatchStatementClausesEvaluation of MatchStatementClauses with arguments subject and cacheGroup).
    7. Perform ? UpdateEmpty(matchCompletion, undefined).
    8. Return Completion(FinishMatch(matchCompletion, cacheGroup)).

    14.17.3 Runtime Semantics: MatchStatementClausesEvaluation

    -

    The syntax-directed operation MatchStatementClausesEvaluation takes arguments subject (an ECMAScript language value) and cacheGroup (a %Map%) and returns either a normal completion containing either an ECMAScript language value, empty or not-matched, or an abrupt completion. It is defined piecewise over the following productions:

    +

    The syntax-directed operation MatchStatementClausesEvaluation takes arguments subject (an ECMAScript language value) and cacheGroup (a %Map%) and returns either a normal completion containing either an ECMAScript language value, empty or not-matched, or an abrupt completion. It is defined piecewise over the following productions:

    - MatchStatementClauses : MatchStatementClause + MatchStatementClauses : MatchStatementClause -
    1. Return ? MatchStatementClauseEvaluation of MatchStatementClause with arguments subject and cacheGroup.
    +
    1. Return ? MatchStatementClauseEvaluation of MatchStatementClause with arguments subject and cacheGroup.
    MatchStatementClauses : - MatchStatementClauses + MatchStatementClauses ; - MatchStatementClause + MatchStatementClause -
    1. Let result be ? MatchStatementClausesEvaluation of MatchStatementClauses with arguments subject and cacheGroup.
    2. If result is not not-matched, return result.
    3. Return ? MatchStatementClauseEvaluation of MatchStatementClause with arguments subject and cacheGroup.
    +
    1. Let result be ? MatchStatementClausesEvaluation of MatchStatementClauses with arguments subject and cacheGroup.
    2. If result is not not-matched, return result.
    3. Return ? MatchStatementClauseEvaluation of MatchStatementClause with arguments subject and cacheGroup.
    MatchStatementClauses : - MatchStatementClauses + MatchStatementClauses ; default : @@ -408,7 +437,7 @@

    14.17.3 Runtime Semantics: MatchStatementClauses -
    1. Let result be ? MatchStatementClausesEvaluation of MatchStatementClauses with arguments subject and cacheGroup.
    2. If result is not not-matched, return result.
    3. Return ? Evaluation of Statement.
    +
    1. Let result be ? MatchStatementClausesEvaluation of MatchStatementClauses with arguments subject and cacheGroup.
    2. If result is not not-matched, return result.
    3. Return ? Evaluation of Statement.
    MatchStatementClauses : default @@ -421,16 +450,16 @@

    14.17.3 Runtime Semantics: MatchStatementClauses

    14.17.4 Runtime Semantics: MatchStatementClauseEvaluation

    -

    The syntax-directed operation MatchStatementClauseEvaluation takes arguments subject (an ECMAScript language value) and cacheGroup (a %Map%) and returns either a normal completion containing either an ECMAScript language value, empty or not-matched, or an abrupt completion. It is defined piecewise over the following productions:

    +

    The syntax-directed operation MatchStatementClauseEvaluation takes arguments subject (an ECMAScript language value) and cacheGroup (a %Map%) and returns either a normal completion containing either an ECMAScript language value, empty or not-matched, or an abrupt completion. It is defined piecewise over the following productions:

    MatchStatementClause : - MatchPattern + MatchPattern : Statement -
    1. Let matches be ? MatchPatternMatches of MatchPattern with arguments subject and cacheGroup.
    2. If matches is true, return ? Evaluation of Statement.
    3. Return not-matched.
    +
    1. Let matches be ? MatchPatternMatches of MatchPattern with arguments subject and cacheGroup.
    2. If matches is true, return ? Evaluation of Statement.
    3. Return not-matched.
    @@ -457,51 +486,51 @@

    15.10.2

    RelationalExpression : - RelationalExpression + RelationalExpression is - MatchPattern + MatchPattern
    1. Return false.
    - PrimaryExpression : MatchExpression + PrimaryExpression : MatchExpression -
    1. Return HasCallInTailPosition of MatchExpression with argument call.
    +
    1. Return HasCallInTailPosition of MatchExpression with argument call.
    MatchExpression : CoverCallExpressionAndAsyncArrowHead { - MatchExpressionClauses + MatchExpressionClauses ; } -
    1. Return HasCallInTailPosition of MatchExpressionClauses with argument call.
    +
    1. Return HasCallInTailPosition of MatchExpressionClauses with argument call.
    - MatchExpressionClauses : MatchExpressionClause + MatchExpressionClauses : MatchExpressionClause -
    1. Return HasCallInTailPosition of MatchExpressionClause with argument call.
    +
    1. Return HasCallInTailPosition of MatchExpressionClause with argument call.
    MatchExpressionClauses : - MatchExpressionClauses + MatchExpressionClauses ; - MatchExpressionClause + MatchExpressionClause -
    1. Let result be HasCallInTailPosition of MatchExpressionClauses with argument call.
    2. If result is true, return true.
    3. Return HasCallInTailPosition of MatchExpressionClause with argument call.
    +
    1. Let result be HasCallInTailPosition of MatchExpressionClauses with argument call.
    2. If result is true, return true.
    3. Return HasCallInTailPosition of MatchExpressionClause with argument call.
    MatchExpressionClauses : - MatchExpressionClauses + MatchExpressionClauses ; default : @@ -509,7 +538,7 @@

    15.10.2 -
    1. Let result be HasCallInTailPosition of MatchExpressionClauses with argument call.
    2. If result is true, return true.
    3. Return HasCallInTailPosition of Expression with argument call.
    +
    1. Let result be HasCallInTailPosition of MatchExpressionClauses with argument call.
    2. If result is true, return true.
    3. Return HasCallInTailPosition of Expression with argument call.
    MatchExpressionClauses : @@ -523,7 +552,7 @@

    15.10.2 MatchExpressionClause : - MatchPattern + MatchPattern : Expression @@ -535,33 +564,33 @@

    15.10.2 MatchStatement : CoverCallExpressionAndAsyncArrowHead { - MatchStatementClauses + MatchStatementClauses ; } -
    1. Return HasCallInTailPosition of MatchStatementClauses with argument call.
    +
    1. Return HasCallInTailPosition of MatchStatementClauses with argument call.
    - MatchStatementClauses : MatchStatementClause + MatchStatementClauses : MatchStatementClause -
    1. Return HasCallInTailPosition of MatchStatementClause with argument call.
    +
    1. Return HasCallInTailPosition of MatchStatementClause with argument call.
    MatchStatementClauses : - MatchStatementClauses + MatchStatementClauses ; - MatchStatementClause + MatchStatementClause -
    1. Let result be HasCallInTailPosition of MatchStatementClauses with argument call.
    2. If result is true, return true.
    3. Return HasCallInTailPosition of MatchStatementClause with argument call.
    +
    1. Let result be HasCallInTailPosition of MatchStatementClauses with argument call.
    2. If result is true, return true.
    3. Return HasCallInTailPosition of MatchStatementClause with argument call.
    MatchStatementClauses : - MatchStatementClauses + MatchStatementClauses ; default : @@ -569,7 +598,7 @@

    15.10.2 -
    1. Let result be HasCallInTailPosition of MatchStatementClauses with argument call.
    2. If result is true, return true.
    3. Return HasCallInTailPosition of Statement with argument call.
    +
    1. Let result be HasCallInTailPosition of MatchStatementClauses with argument call.
    2. If result is true, return true.
    3. Return HasCallInTailPosition of Statement with argument call.
    MatchStatementClauses : @@ -583,7 +612,7 @@

    15.10.2 MatchStatementClause : - MatchPattern + MatchPattern : Statement @@ -603,7 +632,7 @@

    20.1.2 Properties of the Object Constructor

    20.1.2.24 Object [ @@customMatcher ] ( subject, hint )

    This function performs the following steps when called:

    -
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If subject is not an Object, return false.
    3. Return true.
    +
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If subject is not an Object, return false.
    3. Return true.
    @@ -614,7 +643,7 @@

    20.2.2 Properties of the Function Constructor

    20.2.2.2 Function [ @@customMatcher ] ( subject, hint )

    This function performs the following steps when called:

    -
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. Return IsCallable(subject).
    +
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. Return IsCallable(subject).
    @@ -622,7 +651,7 @@

    20.2.3 Properties of the Function Prototype Obje

    20.2.3.7 Function.prototype [ @@customMatcher ] ( subject, hint, receiver )

    This function performs the following steps when called:

    -
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. Let func be the this value.
    3. If IsCallable(func) is false, throw a TypeError exception.
    4. If subject.[[ConstructedBy]] contains func, return true.
    5. If func does not have a [[IsClassConstructor]] internal slot or func.[[IsClassConstructor]] is false, return ? Call(func, receiver, « subject, hint »).
    6. Return false.
    +
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. Let func be the this value.
    3. If IsCallable(func) is false, throw a TypeError exception.
    4. If subject.[[ConstructedBy]] contains func, return true.
    5. If func does not have a [[IsClassConstructor]] internal slot or func.[[IsClassConstructor]] is false, return ? Call(func, receiver, « subject, hint »).
    6. Return false.
    Note
    class C {}
     new C() is C; // true, by private-field semantics
    @@ -653,7 +682,7 @@ 

    20.3.2 Properties of the Boolean Constructor

    20.3.2.2 Boolean [ @@customMatcher ] ( subject, hint )

    This function performs the following steps when called:

    -
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. If subject is not a Boolean and does not have a [[BooleanData]] internal slot, return false.
    3. If hint is "boolean", return true.
    4. If subject is a Boolean, return CreateArrayFromListsubject »).
    5. Return CreateArrayFromListsubject.[[BooleanData]] »).
    +
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. If subject is not a Boolean and does not have a [[BooleanData]] internal slot, return false.
    3. If hint is "boolean", return true.
    4. If subject is a Boolean, return CreateArrayFromListsubject »).
    5. Return CreateArrayFromListsubject.[[BooleanData]] »).
    Editor's Note
    @@ -666,13 +695,13 @@

    20.4 Symbol Objects

    20.4.2 Properties of the Symbol Constructor

    20.4.2.17 Symbol.customMatcher

    -

    The initial value of Symbol.customMatcher is the well-known symbol @@customMatcher (Table 1).

    +

    The initial value of Symbol.customMatcher is the well-known symbol @@customMatcher (Table 1).

    This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.

    20.4.2.18 Symbol [ @@customMatcher ] ( subject, hint )

    This function performs the following steps when called:

    -
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. If subject is not a Symbol and does not have a [[SymbolData]] internal slot, return false.
    3. If hint is "boolean", return true.
    4. If subject is a Symbol, return CreateArrayFromListsubject »).
    5. Return CreateArrayFromListsubject.[[SymbolData]] »).
    +
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. If subject is not a Symbol and does not have a [[SymbolData]] internal slot, return false.
    3. If hint is "boolean", return true.
    4. If subject is a Symbol, return CreateArrayFromListsubject »).
    5. Return CreateArrayFromListsubject.[[SymbolData]] »).
    Editor's Note
    @@ -695,7 +724,7 @@

    20.5.2 Properties of the Error Constructor

    20.5.2.2 Error [ @@customMatcher ] ( subject, hint )

    This function performs the following steps when called:

    -
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If subject does not have a [[ErrorData]] internal slot, return false.
    3. Return true.
    +
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If subject does not have a [[ErrorData]] internal slot, return false.
    3. Return true.
    Editor's Note
    It's possible to provide extractor semantics for Error custom matchers. @@ -705,7 +734,7 @@

    20.5.2.2 Error [ @@customMatcher ] ( subjec

    20.5.4 Properties of Error Instances

    -

    Error instances are ordinary objects that inherit properties from the Error prototype object and have an [[ErrorData]] internal slot whose value is undefined a String. The only specified uses of [[ErrorData]] is to identify Error, AggregateError, and NativeError instances as Error objects within Object.prototype.toString and their @@customMatcher methods.

    +

    Error instances are ordinary objects that inherit properties from the Error prototype object and have an [[ErrorData]] internal slot whose value is undefined a String. The only specified uses of [[ErrorData]] is to identify Error, AggregateError, and NativeError instances as Error objects within Object.prototype.toString and their @@customMatcher methods.

    Editor's Note
    Maybe rename this internal slot to [[ErrorKind]].
    @@ -726,13 +755,13 @@

    20.5.6.1.1 NativeError ( message

    20.5.6.2 Properties of the NativeError Constructors

    20.5.6.2.2 NativeError [ @@customMatcher ] ( subject, hint )

    -
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If subject does not have a [[ErrorData]] internal slot or subject.[[ErrorData]] is not NativeError, return false.
    3. Return true.
    +
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If subject does not have a [[ErrorData]] internal slot or subject.[[ErrorData]] is not NativeError, return false.
    3. Return true.

    20.5.6.4 Properties of NativeError Instances

    -

    NativeError instances are ordinary objects that inherit properties from their NativeError prototype object and have an [[ErrorData]] internal slot whose value is undefined a String. The only specified use of [[ErrorData]] is by Object.prototype.toString (20.1.3.6) and their @@customMatcher methods to identify Error, AggregateError, or NativeError instances.

    +

    NativeError instances are ordinary objects that inherit properties from their NativeError prototype object and have an [[ErrorData]] internal slot whose value is undefined a String. The only specified use of [[ErrorData]] is by Object.prototype.toString (20.1.3.6) and their @@customMatcher methods to identify Error, AggregateError, or NativeError instances.

    @@ -751,13 +780,13 @@

    20.5.7.1.1 AggregateError ( errors, <

    20.5.7.2 Properties of the AggregateError Constructor

    20.5.7.2.2 AggregateError [ @@customMatcher ] ( subject, hint )

    -
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If subject does not have a [[ErrorData]] internal slot or subject.[[ErrorData]] is not "AggregateError", return false.
    3. Return true.
    +
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If subject does not have a [[ErrorData]] internal slot or subject.[[ErrorData]] is not "AggregateError", return false.
    3. Return true.

    20.5.7.4 Properties of AggregateError Instances

    -

    AggregateError instances are ordinary objects that inherit properties from their AggregateError prototype object and have an [[ErrorData]] internal slot whose value is undefined a String. The only specified use of [[ErrorData]] is by Object.prototype.toString (20.1.3.6) and their @@customMatcher methods to identify Error, AggregateError, or NativeError instances.

    +

    AggregateError instances are ordinary objects that inherit properties from their AggregateError prototype object and have an [[ErrorData]] internal slot whose value is undefined a String. The only specified use of [[ErrorData]] is by Object.prototype.toString (20.1.3.6) and their @@customMatcher methods to identify Error, AggregateError, or NativeError instances.

    @@ -772,7 +801,7 @@

    21.1.2 Properties of the Number Constructor

    21.1.2.16 Number [ @@customMatcher ] ( subject, hint )

    This function performs the following steps when called:

    -
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. If subject is not a Number and does not have a [[NumberData]] internal slot, return false.
    3. If hint is "boolean", return true.
    4. If subject is a Number, return CreateArrayFromListsubject »).
    5. Return CreateArrayFromListsubject.[[NumberData]] »).
    +
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. If subject is not a Number and does not have a [[NumberData]] internal slot, return false.
    3. If hint is "boolean", return true.
    4. If subject is a Number, return CreateArrayFromListsubject »).
    5. Return CreateArrayFromListsubject.[[NumberData]] »).
    Editor's Note
    Another approach is to ignore boxed primitives and only matches on primitive values. @@ -786,7 +815,7 @@

    21.2.2 Properties of the BigInt Constructor

    21.2.2.4 BigInt [ @@customMatcher ] ( subject, hint )

    This function performs the following steps when called:

    -
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. If subject is not a BigInt and does not have a [[BigIntData]] internal slot, return false.
    3. If hint is "boolean", return true.
    4. If subject is a BigInt, return CreateArrayFromListsubject »).
    5. Return CreateArrayFromListsubject.[[BigIntData]] »).
    +
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. If subject is not a BigInt and does not have a [[BigIntData]] internal slot, return false.
    3. If hint is "boolean", return true.
    4. If subject is a BigInt, return CreateArrayFromListsubject »).
    5. Return CreateArrayFromListsubject.[[BigIntData]] »).
    Editor's Note
    @@ -800,7 +829,7 @@

    21.4.3 Properties of the Date Constructor

    21.4.3.5 Date [ @@customMatcher ] ( subject, hint )

    This function performs the following steps when called:

    -
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If subject does not have a [[DateValue]] internal slot, return false.
    3. Return true.
    +
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If subject does not have a [[DateValue]] internal slot, return false.
    3. Return true.
    @@ -815,7 +844,7 @@

    22.1.2 Properties of the String Constructor

    22.1.2.5 String [ @@customMatcher ] ( subject, hint )

    This function performs the following steps when called:

    -
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. If subject is not a String and does not have a [[StringData]] internal slot, return false.
    3. If hint is "boolean", return true.
    4. If subject is a String, return CreateArrayFromListsubject »).
    5. Return CreateArrayFromListsubject.[[StringData]] »).
    +
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. If subject is not a String and does not have a [[StringData]] internal slot, return false.
    3. If hint is "boolean", return true.
    4. If subject is a String, return CreateArrayFromListsubject »).
    5. Return CreateArrayFromListsubject.[[StringData]] »).
    Editor's Note
    Another approach is to ignore boxed primitives and only matches on primitive values. @@ -824,14 +853,220 @@

    22.1.2.5 String [ @@customMatcher ] ( subje

    22.2 RegExp (Regular Expression) Objects

    + + +

    22.2.1 Patterns

    +

    Syntax

    + + Pattern[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups, NamedCaptureGroupsBindings] :: + Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] + + + + Disjunction[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups, NamedCaptureGroupsBindings] :: + Alternative[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] + + + Alternative[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] + | + Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] + + + + Alternative[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups, NamedCaptureGroupsBindings, NamedCaptureGroupsBindings] :: + [empty] + + + Alternative[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] + Term[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] + + + + Term[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups, NamedCaptureGroupsBindings] :: + Assertion[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] + + + Atom[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] + + + Atom[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] + Quantifier + + + + Assertion[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups, NamedCaptureGroupsBindings] :: + ^ + + + $ + + + \b + + + \B + + + (?= + Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] + ) + + + (?! + Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] + ) + + + (?<= + Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] + ) + + + (?<! + Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] + ) + + + + Atom[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups, NamedCaptureGroupsBindings] :: + PatternCharacter + + + . + + + \ + AtomEscape[?UnicodeMode, ?NamedCaptureGroups] + + + CharacterClass[?UnicodeMode, ?UnicodeSetsMode] + + + ( + GroupSpecifier[?UnicodeMode, ?NamedCaptureGroupsBindings]opt + Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] + ) + + + (?: + Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] + ) + + + + AtomEscape[UnicodeMode, NamedCaptureGroups] :: + DecimalEscape + + + CharacterClassEscape[?UnicodeMode] + + + CharacterEscape[?UnicodeMode] + + [+NamedCaptureGroups] + k + GroupName[?UnicodeMode, ~NamedCaptureGroupsBindings] + + + + GroupSpecifier[UnicodeMode, NamedCaptureGroupsBindings] :: + ? + GroupName[?UnicodeMode, ?NamedCaptureGroupsBindings] + + + + GroupName[UnicodeMode, NamedCaptureGroupsBindings] :: + < + RegExpIdentifierName[?UnicodeMode] + > + + [+NamedCaptureGroupsBindings] + < + VarOrLetOrConst + Identifier + > + + + + Editor's Note
    +

    A new syntax parameter NamedCaptureGroupsBindings has been added to the Regular Expression.

    +

    This feature can be removed.

    +
    when /(?<let first>\d\d\d)-(?<let second>\d\d\d)/: [first, second],
    +// can be written as
    +when /(?<first>\d\d\d)-(?<second>\d\d\d)/({ groups: { let first, let second } }):
    +  [first, second],
    +
    + Editor's Note
    +

    For simplicity, Identifier intead of BindingIdentifier is used. It's also possible to add [Yield, Await] to Pattern.

    +
    + + +

    22.2.1.9 Static Semantics: CapturingGroupName

    +

    The syntax-directed operation CapturingGroupName takes no arguments and returns a String. It is defined piecewise over the following productions:

    + + GroupName :: + < + RegExpIdentifierName + > + + + +
    1. Let idTextUnescaped be RegExpIdentifierCodePoints of RegExpIdentifierName.
    2. Return CodePointsToString(idTextUnescaped).
    + + GroupName :: + < + VarOrLetOrConst + Identifier + > + + + +
    1. Let idTextUnescaped be the first element of BoundNames of Identifier.
    2. Return CodePointsToString(idTextUnescaped).
    +
    +
    + + +

    22.2.3 Abstract Operations for RegExp Creation

    + + +

    22.2.3.1 RegExpCreate ( P, F )

    +

    The abstract operation RegExpCreate takes arguments P (an ECMAScript language value) and F (a String or undefined) and returns either a normal completion containing an Object or a throw completion. It performs the following steps when called:

    +
    1. Let obj be ! RegExpAlloc(%RegExp%).
    2. Return ? RegExpInitialize(obj, P, F, false).
    +
    + + +

    22.2.3.3 RegExpInitialize ( obj, pattern, flags, canCreateBinding )

    +

    The abstract operation RegExpInitialize takes arguments obj (an Object), pattern (an ECMAScript language value), flags (an ECMAScript language value), and canCreateBinding (a Boolean) and returns either a normal completion containing an Object or a throw completion. It performs the following steps when called:

    +
    1. If pattern is undefined, let P be the empty String.
    2. Else, let P be ? ToString(pattern).
    3. If flags is undefined, let F be the empty String.
    4. Else, let F be ? ToString(flags).
    5. If F contains any code unit other than "d", "g", "i", "m", "s", "u", "v", or "y", or if F contains any code unit more than once, throw a SyntaxError exception.
    6. If F contains "i", let i be true; else let i be false.
    7. If F contains "m", let m be true; else let m be false.
    8. If F contains "s", let s be true; else let s be false.
    9. If F contains "u", let u be true; else let u be false.
    10. If F contains "v", let v be true; else let v be false.
    11. If u is true or v is true, then
      1. Let patternText be StringToCodePoints(P).
    12. Else,
      1. Let patternText be the result of interpreting each of P's 16-bit elements as a Unicode BMP code point. UTF-16 decoding is not applied to the elements.
    13. Let parseResult be ParsePattern(patternText, u, v, canCreateBinding).
    14. If parseResult is a non-empty List of SyntaxError objects, throw a SyntaxError exception.
    15. Assert: parseResult is a Pattern Parse Node.
    16. Set obj.[[OriginalSource]] to P.
    17. Set obj.[[OriginalFlags]] to F.
    18. Let capturingGroupsCount be CountLeftCapturingParensWithin(parseResult).
    19. Let rer be the RegExp Record { [[IgnoreCase]]: i, [[Multiline]]: m, [[DotAll]]: s, [[Unicode]]: u, [[UnicodeSets]]: v, [[CapturingGroupsCount]]: capturingGroupsCount }.
    20. Set obj.[[RegExpRecord]] to rer.
    21. Set obj.[[RegExpMatcher]] to CompilePattern of parseResult with argument rer.
    22. Perform ? Set(obj, "lastIndex", +0𝔽, true).
    23. Return obj.
    +
    + + +

    22.2.3.4 Static Semantics: ParsePattern ( patternText, u, v, canCreateBinding )

    +

    The abstract operation ParsePattern takes arguments patternText (a sequence of Unicode code points), u (a Boolean), v (a Boolean), and canCreateBinding (a Boolean) and returns a Parse Node or a non-empty List of SyntaxError objects. It performs the following steps when called:

    +
    1. If v is true and u is true, then
      1. Let parseResult be a List containing one or more SyntaxError objects.
    2. Else if v is true, then
      1. If canCreateBinding is true, let parseResult be ParseText(patternText, Pattern[+UnicodeMode, +UnicodeSetsMode, +NamedCaptureGroups, +NamedCaptureGroupsBindings]).
      2. Else, Let parseResult be ParseText(patternText, Pattern[+UnicodeMode, +UnicodeSetsMode, +NamedCaptureGroups, ~NamedCaptureGroupsBindings]).
    3. Else if u is true, then
      1. If canCreateBinding is true, let parseResult be ParseText(patternText, Pattern[+UnicodeMode, ~UnicodeSetsMode, +NamedCaptureGroups, +NamedCaptureGroupsBindings]).
      2. Else, Let parseResult be ParseText(patternText, Pattern[+UnicodeMode, ~UnicodeSetsMode, +NamedCaptureGroups, ~NamedCaptureGroupsBindings]).
    4. Else,
      1. If canCreateBinding is true, let parseResult be ParseText(patternText, Pattern[~UnicodeMode, ~UnicodeSetsMode, +NamedCaptureGroups, +NamedCaptureGroupsBindings]).
      2. Else, Let parseResult be ParseText(patternText, Pattern[~UnicodeMode, ~UnicodeSetsMode, +NamedCaptureGroups, ~NamedCaptureGroupsBindings]).
    5. Return parseResult.
    +
    +
    + +
    1. NOTE: Ignore ecmarkup warning: every call site of RegExpCreate asserts the return value is a normal completion; it should be refactored to not return a completion record at all.
    2. Return ? RegExpCreate("", "").
    + + +

    22.2.4 The RegExp Constructor

    + + +

    22.2.4.1 RegExp ( pattern, flags )

    +

    This function performs the following steps when called:

    +
    1. Let patternIsRegExp be ? IsRegExp(pattern).
    2. If NewTarget is undefined, then
      1. Let newTarget be the active function object.
      2. If patternIsRegExp is true and flags is undefined, then
        1. Let patternConstructor be ? Get(pattern, "constructor").
        2. If SameValue(newTarget, patternConstructor) is true, return pattern.
    3. Else,
      1. Let newTarget be NewTarget.
    4. If pattern is an Object and pattern has a [[RegExpMatcher]] internal slot, then
      1. Let P be pattern.[[OriginalSource]].
      2. If flags is undefined, let F be pattern.[[OriginalFlags]].
      3. Else, let F be flags.
    5. Else if patternIsRegExp is true, then
      1. Let P be ? Get(pattern, "source").
      2. If flags is undefined, then
        1. Let F be ? Get(pattern, "flags").
      3. Else,
        1. Let F be flags.
    6. Else,
      1. Let P be pattern.
      2. Let F be flags.
    7. Let O be ? RegExpAlloc(newTarget).
    8. Return ? RegExpInitialize(O, P, F, false).
    +
    +
    +

    22.2.5 Properties of the RegExp Constructor

    22.2.5.3 RegExp [ @@customMatcher ] ( subject, hint )

    This function performs the following steps when called:

    -
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If ? IsRegExp(subject) is false, return false.
    3. Return true.
    +
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If ? IsRegExp(subject) is false, return false.
    3. Return true.
    Note
    - IsRegExp returns true for objects that have a truthy @@match property. Do we want that? + IsRegExp returns true for objects that have a truthy @@match property. Do we want that?
    @@ -840,7 +1075,7 @@

    22.2.6 Properties of the RegExp Prototype Object

    22.2.6.20 RegExp.prototype [ @@customMatcher ] ( subject, hint )

    This function performs the following steps when called:

    -
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. Let regexp be this value.
    3. If hint is "boolean", return ? Call(%RegExp.prototype.test%, regexp, « subject »).
    4. Let isRegExp be ? IsRegExp(regexp).
    5. If isRegExp is true, then
      1. Let flags be ? Get(regexp, "flags").
      2. Perform ? RequireObjectCoercible(flags).
      3. If ? ToString(flags) contain "g", return ? Call(%RegExp.prototype[@@matchAll]%, regexp, « subject »).
    6. Let result be ? Call(%RegExp.prototype[@@match]%, regexp, « subject »).
    7. Return CreateArrayFromListresult »).
    +
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. Let regexp be this value.
    3. If hint is "boolean", return ? Call(? Get(regexp, "test"), regexp, « subject »).
    4. Let isRegExp be ? IsRegExp(regexp).
    5. If isRegExp is true, then
      1. Let flags be ? Get(regexp, "flags").
      2. Perform ? RequireObjectCoercible(flags).
      3. If ? ToString(flags) contains g, then
        1. Let iterator be ? Call(? Get(regexp, @@matchAll), regexp, « subject »).
        2. Let array be ? Call(%Array.from%, %Array%, « iterator »).
        3. If ! LengthOfArrayLike(array) is 0, return false.
        4. Return array.
    6. Let result be ? Call(? Get(regexp, @@match), regexp, « subject »).
    7. If result is null, return false.
    8. Return CreateArrayFromListresult »).
    Note
    let regex = /(?<id>\d+)-?/g
     '012-345' is regex(["012-", "012"], { groups: { id: "345" } });
    @@ -854,6 +1089,9 @@ 

    22.2.6.20 RegExp.prototype [ @@customMatcher ] ( The "flags" property in this algorithm is accessed twice, this is not ideal. Another access is in RegExp.prototype [ @@matchAll ] ( string ) or RegExp.prototype [ @@match ] ( string ) depends on if the regexp has the g flag.

    + Editor's Note
    + When matching with an RegExp that "flags" contains "g", both %RegExpStringIteratorPrototype%.next ( ) and %ArrayIteratorPrototype%.next ( ) is called, this is not ideal. +
    @@ -868,7 +1106,7 @@

    23.1.2 Properties of the Array Constructor

    23.1.2.6 Array [ @@customMatcher ] ( subject, hint )

    This function performs the following steps when called:

    -
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. If ? IsArray(subject) is false, return false.
    3. If hint is "boolean", return true.
    4. Return subject.
    +
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. If ? IsArray(subject) is false, return false.
    3. If hint is "boolean", return true.
    4. Return subject.
    Note
    expr is Array(1, 2, 3, 4);
    @@ -882,7 +1120,7 @@

    23.2.6 Properties of the TypedArray C

    23.2.6.3 TypedArray [ @@customMatcher ] ( subject, hint )

    This function performs the following steps when called:

    -
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. If subject does not have a [[TypedArrayName]] internal slot or subject.[[TypedArrayName]] is not TypedArray, return false.
    3. If hint is "boolean", return true.
    4. Return subject.
    +
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. If subject does not have a [[TypedArrayName]] internal slot or subject.[[TypedArrayName]] is not TypedArray, return false.
    3. If hint is "boolean", return true.
    4. Return subject.
    Note
    const isPNG = binary is Uint8Array(
       0x89, 0x50, 0x4E, 0x47,
    @@ -903,7 +1141,7 @@ 

    24.1.2 Properties of the Map Constructor

    24.1.2.3 Map [ @@customMatcher ] ( subject, hint )

    This function performs the following steps when called:

    -
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. If subject does not have a [[MapData]] internal slot, return false.
    3. If hint is "boolean", return true.
    4. Return CreateArrayFromListsubject »).
    +
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. If subject does not have a [[MapData]] internal slot, return false.
    3. If hint is "boolean", return true.
    4. Return CreateArrayFromListsubject »).
    Note
    expr is Map([[1, 2], [3, 4]]);
     // matches new Map([[1, 2], [3, 4]])
    @@ -923,7 +1161,7 @@ 

    24.2.2 Properties of the Set Constructor

    24.2.2.3 Set [ @@customMatcher ] ( subject, hint )

    This function performs the following steps when called:

    -
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. If subject does not have a [[SetData]] internal slot, return false.
    3. If hint is "boolean", return true.
    4. Return CreateArrayFromListsubject »).
    +
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. If subject does not have a [[SetData]] internal slot, return false.
    3. If hint is "boolean", return true.
    4. Return CreateArrayFromListsubject »).
    Note
    expr is Set([1, 2, 3]);
     // matches new Set([1, 2, 3])
    @@ -943,7 +1181,7 @@ 

    24.3.2 Properties of the WeakMap Constructor

    24.3.2.2 WeakMap [ @@customMatcher ] ( subject, hint )

    This function performs the following steps when called:

    -
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If subject does not have a [[WeakMapData]] internal slot, return false.
    3. Return true.
    +
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If subject does not have a [[WeakMapData]] internal slot, return false.
    3. Return true.
    @@ -954,7 +1192,7 @@

    24.4.2 Properties of the WeakSet Constructor

    24.4.2.2 WeakSet [ @@customMatcher ] ( subject, hint )

    This function performs the following steps when called:

    -
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If subject does not have a [[WeakSetData]] internal slot, return false.
    3. Return true.
    +
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If subject does not have a [[WeakSetData]] internal slot, return false.
    3. Return true.
    @@ -969,7 +1207,7 @@

    25.1.5 Properties of the ArrayBuffer Constructor

    25.1.5.4 ArrayBuffer [ @@customMatcher ] ( subject, hint )

    This function performs the following steps when called:

    -
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If subject has a [[ArrayBufferData]] internal slot, return true.
    3. Return false.
    +
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If subject has a [[ArrayBufferData]] internal slot, return true.
    3. Return false.
    @@ -980,7 +1218,7 @@

    25.2.4 Properties of the SharedArrayBuffer Const

    25.2.4.3 SharedArrayBuffer [ @@customMatcher ] ( subject, hint )

    This function performs the following steps when called:

    -
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If subject does not have a [[ArrayBufferData]] internal slot, return false.
    3. Return IsSharedArrayBuffer(subject).
    +
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If subject does not have a [[ArrayBufferData]] internal slot, return false.
    3. Return IsSharedArrayBuffer(subject).
    @@ -991,7 +1229,7 @@

    25.3.3 Properties of the DataView Constructor

    25.3.3.2 DataView [ @@customMatcher ] ( subject, hint )

    This function performs the following steps when called:

    -
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If subject does not have a [[DataView]] internal slot, return false.
    3. Return true.
    +
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If subject does not have a [[DataView]] internal slot, return false.
    3. Return true.
    @@ -1006,7 +1244,7 @@

    26.1.2 Properties of the WeakRef Constructor

    26.1.2.2 WeakRef [ @@customMatcher ] ( subject, hint )

    This function performs the following steps when called:

    -
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. If subject does not have a [[WeakRefTarget]] internal slot, return false.
    3. If hint is "boolean", return true.
    4. Return CreateArrayFromListWeakRefDeref(subject) »).
    +
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. If subject does not have a [[WeakRefTarget]] internal slot, return false.
    3. If hint is "boolean", return true.
    4. Return CreateArrayFromListWeakRefDeref(subject) »).
    Note
    expr is WeakRef({ type: 1 });
    @@ -1020,7 +1258,7 @@

    26.2.2 Properties of the FinalizationRegistry Co

    26.2.2.2 FinalizationRegistry [ @@customMatcher ] ( subject, hint )

    This function performs the following steps when called:

    -
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If subject does not have a [[CleanupCallback]] internal slot, return false.
    3. Return true.
    +
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If subject does not have a [[CleanupCallback]] internal slot, return false.
    3. Return true.
    @@ -1035,7 +1273,7 @@

    27.2.4 Properties of the Promise Constructor

    27.2.4.9 Promise [ @@customMatcher ] ( subject, hint )

    This function performs the following steps when called:

    -
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. Return IsPromise(subject).
    +
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. Return IsPromise(subject).
    @@ -1053,7 +1291,7 @@

    28.2.1.2 Proxy [ @@customMatcher ] ( )

    1. Throw a TypeError exception.
    Editor's Note
    - All built-in constructors have a @@customMatcher method. This one is for design consistency.
    + All built-in constructors have a @@customMatcher method. This one is for design consistency.
    This is not a consensus in the champion group.
    @@ -1072,38 +1310,38 @@

    Syntax

    ( - MatchPattern[?Yield, ?Await] + MatchPattern[?Yield, ?Await] ) - PrimitivePattern + PrimitivePattern - BindingPattern[?Yield, ?Await] + BindingPattern[?Yield, ?Await] - - RegularExpressionPattern + + RegularExpressionPattern[?Yield, ?Await] - MemberExpressionPattern[?Yield, ?Await] + MemberExpressionPattern[?Yield, ?Await] - ObjectPattern[?Yield, ?Await] + ObjectPattern[?Yield, ?Await] - ArrayPattern[?Yield, ?Await] + ArrayPattern[?Yield, ?Await] - UnaryAlgebraicPattern[?Yield, ?Await] + UnaryAlgebraicPattern[?Yield, ?Await] - RelationalPattern[?Yield, ?Await] + RelationalPattern[?Yield, ?Await] - IfPattern[?Yield, ?Await] + IfPattern[?Yield, ?Await] - CombinedMatchPattern[?Yield, ?Await] + CombinedMatchPattern[?Yield, ?Await] @@ -1144,7 +1382,7 @@

    Syntax

    BindingPattern[Yield, Await] : - VarOrLetOrConst + VarOrLetOrConst BindingIdentifier[?Yield, ?Await] @@ -1165,10 +1403,16 @@

    Syntax

    - - RegularExpressionPattern : + + RegularExpressionPattern[Yield, Await] : RegularExpressionLiteral + + RegularExpressionLiteral + ( + MatchList[?Yield, ?Await] + ) + Note 3
    @@ -1186,12 +1430,12 @@

    Syntax

    MemberExpressionPattern[Yield, Await] : - PatternMatchingMemberExpression[?Yield, ?Await] + PatternMatchingMemberExpression[?Yield, ?Await] - PatternMatchingMemberExpression[?Yield, ?Await] + PatternMatchingMemberExpression[?Yield, ?Await] ( - MatchList[?Yield, ?Await] + MatchList[?Yield, ?Await] ) @@ -1211,22 +1455,22 @@

    Syntax

    IdentifierName - PatternMatchingMemberExpression[?Yield, ?Await] + PatternMatchingMemberExpression[?Yield, ?Await] . IdentifierName - PatternMatchingMemberExpression[?Yield, ?Await] + PatternMatchingMemberExpression[?Yield, ?Await] ?. IdentifierName - PatternMatchingMemberExpression[?Yield, ?Await] + PatternMatchingMemberExpression[?Yield, ?Await] . PrivateIdentifier - PatternMatchingMemberExpression[?Yield, ?Await] + PatternMatchingMemberExpression[?Yield, ?Await] ?. PrivateIdentifier @@ -1239,7 +1483,7 @@

    Syntax

    value is WeakRef({ type: 1 });
    Editor's Note
    - All productions except IdentifierReference in PatternMatchingMemberExpression can be removed. + All productions except IdentifierReference in PatternMatchingMemberExpression can be removed.
    value is Math.PI;
     // can be written as:
     const { PI } = Math;
    @@ -1257,21 +1501,21 @@ 

    Syntax

    { - MatchRestProperty[?Yield, ?Await] + MatchRestProperty[?Yield, ?Await] ,opt } { - MatchPropertyList[?Yield, ?Await] + MatchPropertyList[?Yield, ?Await] ,opt } { - MatchPropertyList[?Yield, ?Await] + MatchPropertyList[?Yield, ?Await] , - MatchRestProperty[?Yield, ?Await] + MatchRestProperty[?Yield, ?Await] ,opt } @@ -1279,55 +1523,55 @@

    Syntax

    ArrayPattern[Yield, Await] : [ - MatchList[?Yield, ?Await]opt + MatchList[?Yield, ?Await]opt ] MatchList[Yield, Await] : Elisionopt - MatchRestElement[?Yield, ?Await]opt + MatchRestElement[?Yield, ?Await]opt - MatchElementList[?Yield, ?Await] + MatchElementList[?Yield, ?Await] - MatchElementList[?Yield, ?Await] + MatchElementList[?Yield, ?Await] , Elisionopt - MatchRestElement[?Yield, ?Await]opt + MatchRestElement[?Yield, ?Await]opt MatchRestProperty[Yield, Await] : ... - MatchPattern[?Yield, ?Await] + MatchPattern[?Yield, ?Await] MatchPropertyList[Yield, Await] : - MatchProperty[?Yield, ?Await] + MatchProperty[?Yield, ?Await] - MatchPropertyList[?Yield, ?Await] + MatchPropertyList[?Yield, ?Await] , - MatchProperty[?Yield, ?Await] + MatchProperty[?Yield, ?Await] MatchElementList[Yield, Await] : - MatchElisionElement[?Yield, ?Await] + MatchElisionElement[?Yield, ?Await] - MatchElementList[?Yield, ?Await] + MatchElementList[?Yield, ?Await] , - MatchElisionElement[?Yield, ?Await] + MatchElisionElement[?Yield, ?Await] MatchElisionElement[Yield, Await] : Elisionopt - MatchElement[?Yield, ?Await] + MatchElement[?Yield, ?Await] @@ -1339,24 +1583,24 @@

    Syntax

    PropertyName[?Yield, ?Await] ?opt : - MatchPattern[?Yield, ?Await] + MatchPattern[?Yield, ?Await] - VarOrLetOrConst + VarOrLetOrConst BindingIdentifier[?Yield, ?Await] ?opt - VarOrLetOrConst + VarOrLetOrConst BindingIdentifier[?Yield, ?Await] ?opt : - MatchPattern[?Yield, ?Await] + MatchPattern[?Yield, ?Await]
    MatchElement[Yield, Await] : - MatchPattern[?Yield, ?Await] + MatchPattern[?Yield, ?Await] ?opt @@ -1366,7 +1610,7 @@

    Syntax

    ... - MatchPattern[?Yield, ?Await] + MatchPattern[?Yield, ?Await] @@ -1385,7 +1629,7 @@

    Syntax

    when [a, b, ...]: rhs,
    Editor's Note
    -

    The ? in the production MatchProperty or MatchElement can be removed.

    +

    The ? in the production MatchProperty or MatchElement can be removed.

    The feature is not a consensus in the champion group yet.

    when { x, y? }: ...,
     // can be written as
    @@ -1400,14 +1644,14 @@ 

    Syntax

    Editor's Note
    MatchProperty : - VarOrLetOrConst + VarOrLetOrConst BindingIdentifier ?opt : - MatchPattern + MatchPattern - VarOrLetOrConst + VarOrLetOrConst BindingIdentifier ?opt @@ -1440,17 +1684,17 @@

    Syntax

    UnaryAlgebraicPattern[Yield, Await] : - PatternMatchingUnaryAlgebraicExpression[?Yield, ?Await] + PatternMatchingUnaryAlgebraicExpression[?Yield, ?Await] PatternMatchingUnaryAlgebraicExpression[Yield, Await] : + - PatternMatchingMemberExpression[?Yield, ?Await] + PatternMatchingMemberExpression[?Yield, ?Await] - - PatternMatchingMemberExpression[?Yield, ?Await] + PatternMatchingMemberExpression[?Yield, ?Await] + @@ -1480,31 +1724,31 @@

    Syntax

    RelationalPattern[Yield, Await] : < - PatternMatchingOrderExpression[?Yield, ?Await] + PatternMatchingOrderExpression[?Yield, ?Await] > - PatternMatchingOrderExpression[?Yield, ?Await] + PatternMatchingOrderExpression[?Yield, ?Await] <= - PatternMatchingOrderExpression[?Yield, ?Await] + PatternMatchingOrderExpression[?Yield, ?Await] >= - PatternMatchingOrderExpression[?Yield, ?Await] + PatternMatchingOrderExpression[?Yield, ?Await] instanceof - PatternMatchingMemberExpression[?Yield, ?Await] + PatternMatchingMemberExpression[?Yield, ?Await] in - PatternMatchingMemberExpression[?Yield, ?Await] + PatternMatchingMemberExpression[?Yield, ?Await] has - PatternMatchingStringLikeExpression[?Yield, ?Await] + PatternMatchingStringLikeExpression[?Yield, ?Await] has @@ -1512,19 +1756,19 @@

    Syntax

    == - PatternMatchingEqualExpression[?Yield, ?Await] + PatternMatchingEqualExpression[?Yield, ?Await] != - PatternMatchingEqualExpression[?Yield, ?Await] + PatternMatchingEqualExpression[?Yield, ?Await] === - PatternMatchingEqualExpression[?Yield, ?Await] + PatternMatchingEqualExpression[?Yield, ?Await] !== - PatternMatchingEqualExpression[?Yield, ?Await] + PatternMatchingEqualExpression[?Yield, ?Await]
    @@ -1532,10 +1776,10 @@

    Syntax

    NumericLiteral
    - PatternMatchingMemberExpression[?Yield, ?Await] + PatternMatchingMemberExpression[?Yield, ?Await] - PatternMatchingUnaryAlgebraicExpression[?Yield, ?Await] + PatternMatchingUnaryAlgebraicExpression[?Yield, ?Await]
    @@ -1546,7 +1790,7 @@

    Syntax

    NoSubstitutionTemplate - PatternMatchingMemberExpression[?Yield, ?Await] + PatternMatchingMemberExpression[?Yield, ?Await]
    @@ -1557,10 +1801,10 @@

    Syntax

    NoSubstitutionTemplate - PatternMatchingMemberExpression[?Yield, ?Await] + PatternMatchingMemberExpression[?Yield, ?Await] - PatternMatchingUnaryAlgebraicExpression[?Yield, ?Await] + PatternMatchingUnaryAlgebraicExpression[?Yield, ?Await]
    @@ -1576,22 +1820,22 @@

    Syntax

    RelationalPattern[Yield, Await] : typeof == - PatternMatchingStringLikeExpression[?Yield, ?Await] + PatternMatchingStringLikeExpression[?Yield, ?Await] typeof != - PatternMatchingStringLikeExpression[?Yield, ?Await] + PatternMatchingStringLikeExpression[?Yield, ?Await] typeof === - PatternMatchingStringLikeExpression[?Yield, ?Await] + PatternMatchingStringLikeExpression[?Yield, ?Await] typeof !== - PatternMatchingStringLikeExpression[?Yield, ?Await] + PatternMatchingStringLikeExpression[?Yield, ?Await]
    @@ -1614,7 +1858,7 @@

    Syntax

    value is isInstanceOfMap;
    Editor's Note
    -

    The ==, !=, === and !== production can be removed, but it will be harder to match by === semantics when the PatternMatchingEqualExpression is a custom matcher.

    +

    The ==, !=, === and !== production can be removed, but it will be harder to match by === semantics when the PatternMatchingEqualExpression is a custom matcher.

    This feature is not a consensus in the champion group.

    expr is x;

    The code above will try to use x as a custom matcher when possible, then do the === check as a fallback. This feature is an opt-out of the custom matcher, to always do the === check.

    @@ -1671,18 +1915,18 @@

    Syntax

    CombinedMatchPattern[Yield, Await] : - MatchPattern[?Yield, ?Await] + MatchPattern[?Yield, ?Await] and - MatchPattern[?Yield, ?Await] + MatchPattern[?Yield, ?Await] - MatchPattern[?Yield, ?Await] + MatchPattern[?Yield, ?Await] or - MatchPattern[?Yield, ?Await] + MatchPattern[?Yield, ?Await] not - MatchPattern[?Yield, ?Await] + MatchPattern[?Yield, ?Await] @@ -1695,6 +1939,16 @@

    Syntax

    30.1.1 Static Semantics: Early Errors

    + + + PrimitivePattern : NoSubstitutionTemplate + + + + + MatchProperty : @@ -1705,7 +1959,7 @@

    30.1.1 Static Semantics: Early Errors

    PropertyName ?opt : - MatchPattern + MatchPattern
    @@ -1718,18 +1972,18 @@

    30.1.1 Static Semantics: Early Errors

    MatchRestElement : ... - MatchPattern + MatchPattern MatchRestElement : ... - MatchPattern + MatchPattern Note 2
    when { x: 1, y: 2, ...rest }: ..., // Syntax Error
    @@ -1743,7 +1997,7 @@ 

    30.1.1 Static Semantics: Early Errors

    PropertyName[?Yield, ?Await] ?opt : - MatchPattern[?Yield, ?Await] + MatchPattern[?Yield, ?Await] @@ -1757,26 +2011,26 @@

    30.1.1 Static Semantics: Early Errors

    when { if }: ..., // no Syntax Error
    MatchList : - MatchElementList + MatchElementList , Elisionopt - MatchRestElementopt + MatchRestElementopt MatchElementList : - MatchElementList + MatchElementList , - MatchElisionElement + MatchElisionElement Note 4
    value is [1, 2?, 3]; // Syntax Error
     value is [1, 2?, 3?]; // no Syntax Error
    @@ -1787,38 +2041,58 @@ 

    30.1.1 Static Semantics: Early Errors

    value is [1, 2?, ...]; // no Syntax Error
    + + + RegularExpressionPattern : + RegularExpressionLiteral + + + RegularExpressionLiteral + ( + MatchList + ) + + + + + + CombinedMatchPattern : - MatchPattern + MatchPattern and - MatchPattern + MatchPattern CombinedMatchPattern : - MatchPattern + MatchPattern or - MatchPattern + MatchPattern CombinedMatchPattern : not - MatchPattern + MatchPattern Note 5
    value is a and b and c; // no Syntax Error
     value is a or b or c; // no Syntax Error
    @@ -1836,33 +2110,33 @@ 

    30.1.1 Static Semantics: Early Errors

    -

    30.1.2 IsOptionalPattern

    +

    30.1.2 Static Semantics: IsOptionalPattern

    The syntax-directed operation IsOptionalPattern takes no arguments and returns a Boolean.. It is defined piecewise over the following productions:

    - MatchElementList : MatchElisionElement + MatchElementList : MatchElisionElement -
    1. Return IsOptionalPattern of MatchElisionElement.
    +
    1. Return IsOptionalPattern of MatchElisionElement.
    MatchElementList : - MatchElementList + MatchElementList , - MatchElisionElement + MatchElisionElement -
    1. If IsOptionalPattern of MatchElementList is true, return true.
    2. Return IsOptionalPattern of MatchElisionElement.
    +
    1. If IsOptionalPattern of MatchElementList is true, return true.
    2. Return IsOptionalPattern of MatchElisionElement.
    MatchElisionElement : Elisionopt - MatchElement + MatchElement -
    1. If Elision is present, return false.
    2. Return IsOptionalPattern of MatchElement.
    +
    1. If Elision is present, return false.
    2. Return IsOptionalPattern of MatchElement.
    MatchElement : - MatchPattern + MatchPattern ?opt @@ -1872,7 +2146,7 @@

    30.1.2 IsOptionalPattern

    30.1.3 Runtime Semantics: MatchPatternMatches

    -

    The syntax-directed operation MatchPatternMatches takes arguments subject (an ECMAScript language value) and cacheGroup (a %Map%) and returns either a normal completion containing a Boolean or an abrupt completion. It is defined piecewise over the following productions:

    +

    The syntax-directed operation MatchPatternMatches takes arguments subject (an ECMAScript language value) and cacheGroup (a %Map%) and returns either a normal completion containing a Boolean or an abrupt completion. It is defined piecewise over the following productions:

    MatchPattern : void @@ -1881,67 +2155,67 @@

    30.1.3 Runtime Semantics: MatchPatternMatches MatchPattern : ( - MatchPattern + MatchPattern ) -
    1. Return ? MatchPatternMatches of MatchPattern with arguments subject and cacheGroup.
    +
    1. Return ? MatchPatternMatches of MatchPattern with arguments subject and cacheGroup.
    - MatchPattern : PrimitivePattern + MatchPattern : PrimitivePattern -
    1. Return PrimitivePatternMatches of PrimitivePattern with arguments subject.
    +
    1. Return PrimitivePatternMatches of PrimitivePattern with arguments subject.
    - MatchPattern : BindingPattern + MatchPattern : BindingPattern -
    1. Return BindingPatternMatches of BindingPattern with arguments subject.
    +
    1. Return BindingPatternMatches of BindingPattern with arguments subject.
    - MatchPattern : RegularExpressionPattern + MatchPattern : RegularExpressionPattern -
    1. Return ? RegularExpressionPatternMatches of RegularExpressionPattern with arguments subject and cacheGroup.
    +
    1. Return ? RegularExpressionPatternMatches of RegularExpressionPattern with arguments subject and cacheGroup.
    - MatchPattern : MemberExpressionPattern + MatchPattern : MemberExpressionPattern -
    1. Return ? MemberExpressionPatternMatches of MemberExpressionPattern with arguments subject and cacheGroup.
    +
    1. Return ? MemberExpressionPatternMatches of MemberExpressionPattern with arguments subject and cacheGroup.
    - MatchPattern : ObjectPattern + MatchPattern : ObjectPattern -
    1. Return ? ObjectPatternMatches of ObjectPattern with arguments subject and cacheGroup.
    +
    1. Return ? ObjectPatternMatches of ObjectPattern with arguments subject and cacheGroup.
    - MatchPattern : ArrayPattern + MatchPattern : ArrayPattern -
    1. Return ? ArrayPatternMatches of ArrayPattern with arguments subject and cacheGroup.
    +
    1. Return ? ArrayPatternMatches of ArrayPattern with arguments subject and cacheGroup.
    - MatchPattern : UnaryAlgebraicPattern + MatchPattern : UnaryAlgebraicPattern -
    1. Return ? UnaryAlgebraicPatternMatches of UnaryAlgebraicPattern with arguments subject.
    +
    1. Return ? UnaryAlgebraicPatternMatches of UnaryAlgebraicPattern with arguments subject.
    - MatchPattern : RelationalPattern + MatchPattern : RelationalPattern -
    1. Return ? RelationalPatternMatches of RelationalPattern with arguments subject.
    +
    1. Return ? RelationalPatternMatches of RelationalPattern with arguments subject.
    - MatchPattern : IfPattern + MatchPattern : IfPattern -
    1. Return ? IfPatternMatches of IfPattern.
    +
    1. Return ? IfPatternMatches of IfPattern.
    - MatchPattern : CombinedMatchPattern + MatchPattern : CombinedMatchPattern -
    1. Return ? CombinedMatchPatternMatches of CombinedMatchPattern with arguments subject and cacheGroup.
    +
    1. Return ? CombinedMatchPatternMatches of CombinedMatchPattern with arguments subject and cacheGroup.

    30.1.4 Runtime Semantics: PrimitivePatternMatches

    -

    The syntax-directed operation PrimitivePatternMatches takes argument subject (an ECMAScript language value) and returns a Boolean. It is defined piecewise over the following productions:

    +

    The syntax-directed operation PrimitivePatternMatches takes argument subject (an ECMAScript language value) and returns a Boolean. It is defined piecewise over the following productions:

    PrimitivePattern : Literal @@ -1956,50 +2230,131 @@

    30.1.4 Runtime Semantics: PrimitivePatternMatche

    30.1.5 Runtime Semantics: BindingPatternMatches

    -

    The syntax-directed operation BindingPatternMatches takes argument subject (an ECMAScript language value) and returns a Boolean. It is defined piecewise over the following productions:

    +

    The syntax-directed operation BindingPatternMatches takes argument subject (an ECMAScript language value) and returns a Boolean. It is defined piecewise over the following productions:

    BindingPattern : - VarOrLetOrConst + VarOrLetOrConst BindingIdentifier -
    1. TODO: This section is not written in the spec language yet.
    2. Let name be the first element of BoundNames of BindingIdentifier.
    3. Initialize variable name with subject with the semantics of var, let or const based on VarOrLetOrConst.
    4. Return true.
    +
    1. TODO: This section is not written in the spec language yet.
    2. Let name be the first element of BoundNames of BindingIdentifier.
    3. Initialize variable name with subject with the semantics of var, let or const based on VarOrLetOrConst.
    4. Return true.

    30.1.6 Runtime Semantics: RegularExpressionPatternMatches

    -

    The syntax-directed operation RegularExpressionPatternMatches takes arguments subject (an ECMAScript language value) and cacheGroup (a %Map%) and returns either a normal completion containing a Boolean or an abrupt completion. It is defined piecewise over the following productions:

    - - RegularExpressionPattern : RegularExpressionLiteral +

    The syntax-directed operation RegularExpressionPatternMatches takes arguments subject (an ECMAScript language value) and cacheGroup (a %Map%) and returns either a normal completion containing a Boolean or an abrupt completion. It is defined piecewise over the following productions:

    + + RegularExpressionPattern : + RegularExpressionLiteral + + + RegularExpressionLiteral + ( + MatchListopt + ) + -
    1. Let pattern be CodePointsToString(BodyText of RegularExpressionLiteral).
    2. Let flags be CodePointsToString(FlagText of RegularExpressionLiteral).
    3. Let regexp be ! RegExpCreate(pattern, flags).
    4. Let result be ? InvokeCustomMatcher(regexp, subject, cacheGroup, boolean, null).
    5. Assert: result is a Boolean.
    6. Return result.
    +
    1. Assert: The following steps will not trigger any user code.
    2. If subject is not a String, return false.
    3. Let pattern be CodePointsToString(BodyText of RegularExpressionLiteral).
    4. Let flags be CodePointsToString(FlagText of RegularExpressionLiteral).
    5. Let regexp be ! RegExpAlloc(%RegExp%).
    6. Perform ! RegExpInitialize(regexp, pattern, flags, true).
    7. Perform ! CreateDataPropertyOrThrow(regexp, "exec", %RegExp.prototype.exec%).
    8. NOTE: This is to prevent the "exec" method on the prototype to be replaced. RegExpExec will call it.
    9. Let match be ! RegExpExec(regexp, subject).
    10. If match is null, return false.
    11. Let result be an empty List of ECMAScript language values.
    12. If flags contains "u" or flags contains "v", let fullUnicode be true.
    13. Else, let fullUnicode be false.
    14. Repeat, until match is null,
      1. Let matchStr be ! ToString(! Get(match, "0")).
      2. If matchStr is the empty String, then
        1. Let thisIndex be (! ToLength(! Get(regexp, "lastIndex"))).
        2. Let nextIndex be AdvanceStringIndex(subject, thisIndex, fullUnicode).
        3. Perform ! Set(regexp, "lastIndex", 𝔽(nextIndex), true).
      3. Append match to result.
      4. TODO: This section is not written in the spec language yet.
      5. Let groups be ! Get(match, "groups").
      6. Let namedGroups be ! GetOwnPropertyKeys(groups, string).
      7. For each String s of namedGroups, do
        1. Let parseNode be the Parse Node within the RegularExpressionLiteral that CapturingGroupName of this Parse Node is s.
        2. Assert: parseNode is present and is a GroupSpecifier.
        3. If GroupName of GroupSpecifier is + GroupName : < VarOrLetOrConst Identifier > + +, then
          1. Initialize variable s with subject with the semantics of var, let or const based on VarOrLetOrConst.
      8. Set match to ! RegExpExec(regexp, subject).
    15. Let resultArray be CreateArrayFromList(result).
    16. NOTE: "The following steps will not trigger any user code" ends here.
    17. If RegularExpressionPattern is + RegularExpressionPattern : + RegularExpressionLiteral + ( + MatchList + ) + + +, then
      1. Return ? ListPatternMatches of MatchList with arguments resultArray and cacheGroup.
    18. Return true.
    + Editor's Note
    +

    In order to create binding without triggering user code, we're not calling RegExp.prototype [ @@customMatcher ] ( subject, hint ) and making the behaviour unforgeable.

    +

    Contrast to call RegExp.prototype [ @@customMatcher ] ( subject, hint ) directly, this syntax-directed operation skipped the following user code:

    + +

    30.1.7 Runtime Semantics: MemberExpressionPatternMatches

    -

    The syntax-directed operation MemberExpressionPatternMatches takes arguments subject (an ECMAScript language value) and cacheGroup (a %Map%) and returns either a normal completion containing a Boolean or an abrupt completion. It is defined piecewise over the following productions:

    +

    The syntax-directed operation MemberExpressionPatternMatches takes arguments subject (an ECMAScript language value) and cacheGroup (a %Map%) and returns either a normal completion containing a Boolean or an abrupt completion. It is defined piecewise over the following productions:

    - MemberExpressionPattern : PatternMatchingMemberExpression + MemberExpressionPattern : PatternMatchingMemberExpression -
    1. Let expr be the LeftHandSideExpression that is covered by PatternMatchingMemberExpression.
    2. Let ref be ? Evaluation of expr.
    3. Let value be ? GetValue(ref).
    4. If ref is a Reference Record and IsPropertyReference(ref) is true, let receiver be GetThisValue(ref).
    5. Else, let receiver be null.
    6. Let result be ? InvokeCustomMatcher(value, subject, cacheGroup, boolean, receiver).
    7. Assert: result is a Boolean.
    8. Return result.
    +
    1. Let expr be the LeftHandSideExpression that is covered by PatternMatchingMemberExpression.
    2. Let ref be ? Evaluation of expr.
    3. Let value be ? GetValue(ref).
    4. If ref is a Reference Record and IsPropertyReference(ref) is true, let receiver be GetThisValue(ref).
    5. Else, let receiver be null.
    6. Let result be ? InvokeCustomMatcher(value, subject, cacheGroup, boolean, receiver).
    7. Assert: result is a Boolean.
    8. Return result.
    MemberExpressionPattern : - PatternMatchingMemberExpression + PatternMatchingMemberExpression ( - MatchListopt + MatchListopt ) -
    1. Let expr be the LeftHandSideExpression that is covered by PatternMatchingMemberExpression.
    2. Let ref be ? Evaluation of expr.
    3. Let value be ? GetValue(ref).
    4. If ref is a Reference Record and IsPropertyReference(ref) is true, let receiver be GetThisValue(ref).
    5. Else, let receiver be null.
    6. Let listSubject be ? InvokeCustomMatcher(value, subject, cacheGroup, list, receiver).
    7. Assert: listSubject is an Object.
    8. If MatchList is not present, then
      1. Return ? FinishListMatch(listSubject, cacheGroup, 0).
    9. Return ? ListPatternMatches of MatchList with arguments listSubject and cacheGroup.
    +
    1. Let expr be the LeftHandSideExpression that is covered by PatternMatchingMemberExpression.
    2. Let ref be ? Evaluation of expr.
    3. Let value be ? GetValue(ref).
    4. If ref is a Reference Record and IsPropertyReference(ref) is true, let receiver be GetThisValue(ref).
    5. Else, let receiver be null.
    6. Let listSubject be ? InvokeCustomMatcher(value, subject, cacheGroup, list, receiver).
    7. Assert: listSubject is an Object.
    8. If MatchList is not present, then
      1. Return ? FinishListMatch(listSubject, cacheGroup, 0).
    9. Return ? ListPatternMatches of MatchList with arguments listSubject and cacheGroup.

    30.1.8 Runtime Semantics: ObjectPatternMatches

    -

    The syntax-directed operation ObjectPatternMatches takes arguments subject (an ECMAScript language value) and cacheGroup (a %Map%) and returns either a normal completion containing a Boolean or an abrupt completion. It is defined piecewise over the following productions:

    +

    The syntax-directed operation ObjectPatternMatches takes arguments subject (an ECMAScript language value) and cacheGroup (a %Map%) and returns either a normal completion containing a Boolean or an abrupt completion. It is defined piecewise over the following productions:

    ObjectPattern : { @@ -2011,35 +2366,35 @@

    30.1.8 Runtime Semantics: ObjectPatternMatches ObjectPattern : { - MatchRestProperty + MatchRestProperty ,opt } -
    1. If subject is not an Object, return false.
    2. Let matches be ? ObjectPatternInnerMatches of MatchRestProperty with arguments subject, cacheGroup and a new empty List.
    3. If matches is not-matched, return false.
    4. Return true.
    +
    1. If subject is not an Object, return false.
    2. Let matches be ? ObjectPatternInnerMatches of MatchRestProperty with arguments subject, cacheGroup and a new empty List.
    3. If matches is not-matched, return false.
    4. Return true.
    ObjectPattern : { - MatchPropertyList + MatchPropertyList ,opt } -
    1. If subject is not an Object, return false.
    2. Let matches be ? ObjectPatternInnerMatches of MatchPropertyList with arguments subject, cacheGroup and a new empty List.
    3. If matches is not-matched, return false.
    4. Return true.
    +
    1. If subject is not an Object, return false.
    2. Let matches be ? ObjectPatternInnerMatches of MatchPropertyList with arguments subject, cacheGroup and a new empty List.
    3. If matches is not-matched, return false.
    4. Return true.
    ObjectPattern : { - MatchPropertyList + MatchPropertyList , - MatchRestProperty + MatchRestProperty ,opt } -
    1. If subject is not an Object, return false.
    2. Let matches be ? ObjectPatternInnerMatches of MatchPropertyList with arguments subject, cacheGroup and a new empty List.
    3. If matches is not-matched, return false.
    4. If MatchRestProperty is not present, return true.
    5. Let restMatches be ? ObjectPatternInnerMatches of MatchRestProperty with arguments subject, cacheGroup and matches.
    6. If restMatches is not-matched, return false.
    7. Return true.
    +
    1. If subject is not an Object, return false.
    2. Let matches be ? ObjectPatternInnerMatches of MatchPropertyList with arguments subject, cacheGroup and a new empty List.
    3. If matches is not-matched, return false.
    4. If MatchRestProperty is not present, return true.
    5. Let restMatches be ? ObjectPatternInnerMatches of MatchRestProperty with arguments subject, cacheGroup and matches.
    6. If restMatches is not-matched, return false.
    7. Return true.
    @@ -2048,25 +2403,25 @@

    30.1.9 Runtime Semantics: ObjectPatternInnerMatc MatchRestProperty : ... - MatchPattern + MatchPattern -
    1. Let restObj be OrdinaryObjectCreate(%Object.prototype%).
    2. Perform ? CopyDataProperties(restObj, subject, excludedNames).
    3. Let matches be ? MatchPatternMatches of MatchPattern with arguments restObj and cacheGroup.
    4. If matches is false, return not-matched.
    5. Return « ».
    +
    1. Let restObj be OrdinaryObjectCreate(%Object.prototype%).
    2. Perform ? CopyDataProperties(restObj, subject, excludedNames).
    3. Let matches be ? MatchPatternMatches of MatchPattern with arguments restObj and cacheGroup.
    4. If matches is false, return not-matched.
    5. Return « ».
    - MatchPropertyList : MatchProperty + MatchPropertyList : MatchProperty -
    1. Return ? ObjectPatternInnerMatches of MatchProperty with arguments subject, cacheGroup and excludedNames.
    +
    1. Return ? ObjectPatternInnerMatches of MatchProperty with arguments subject, cacheGroup and excludedNames.
    MatchPropertyList : - MatchPropertyList + MatchPropertyList , - MatchProperty + MatchProperty -
    1. Let matches be ? ObjectPatternInnerMatches of MatchProperty with arguments subject, cacheGroup and excludedNames.
    2. If matches is not-matched, return not-matched.
    3. Let propMatches be ? ObjectPatternInnerMatches of MatchPropertyList with arguments subject, cacheGroup and matches.
    4. If propMatches is not-matched, return not-matched.
    5. Assert: matches and propMatches are Lists of String.
    6. Return the list-concatenation of matches and propMatches.
    +
    1. Let matches be ? ObjectPatternInnerMatches of MatchProperty with arguments subject, cacheGroup and excludedNames.
    2. If matches is not-matched, return not-matched.
    3. Let propMatches be ? ObjectPatternInnerMatches of MatchPropertyList with arguments subject, cacheGroup and matches.
    4. If propMatches is not-matched, return not-matched.
    5. Assert: matches and propMatches are Lists of String.
    6. Return the list-concatenation of matches and propMatches.
    MatchProperty : PropertyName @@ -2074,51 +2429,51 @@

    30.1.9 Runtime Semantics: ObjectPatternInnerMatc -
    1. Let propertyName be ? Evaluation of PropertyName.
    2. If ? HasPropertyCached(subject, cacheGroup, propertyName) is false, then
      1. If ? is present, return « ».
      2. Return not-matched.
    3. Return « propertyName ».
    +
    1. Let propertyName be ? Evaluation of PropertyName.
    2. If ? HasPropertyCached(subject, cacheGroup, propertyName) is false, then
      1. If ? is present, return « ».
      2. Return not-matched.
    3. Return « propertyName ».
    MatchProperty : PropertyName ?opt : - MatchPattern + MatchPattern -
    1. Let propertyName be ? Evaluation of PropertyName.
    2. If ? HasPropertyCached(subject, cacheGroup, propertyName) is false, then
      1. If ? is present, return « ».
      2. Return not-matched.
    3. Let value be ? GetCached(subject, cacheGroup, propertyName).
    4. Let matches be ? MatchPatternMatches of MatchPattern with arguments value and cacheGroup.
    5. If matches is false, return not-matched.
    6. Return « propertyName ».
    +
    1. Let propertyName be ? Evaluation of PropertyName.
    2. If ? HasPropertyCached(subject, cacheGroup, propertyName) is false, then
      1. If ? is present, return « ».
      2. Return not-matched.
    3. Let value be ? GetCached(subject, cacheGroup, propertyName).
    4. Let matches be ? MatchPatternMatches of MatchPattern with arguments value and cacheGroup.
    5. If matches is false, return not-matched.
    6. Return « propertyName ».
    MatchProperty : - VarOrLetOrConst + VarOrLetOrConst BindingIdentifier ?opt -
    1. TODO: This section is not written in the spec language yet.
    2. Let propertyName be the first element of BoundNames of BindingIdentifier.
    3. If ? HasPropertyCached(subject, cacheGroup, propertyName) is false, then
      1. If ? is present, return « ».
      2. Return not-matched.
    4. Let value be ? GetCached(subject, cacheGroup, propertyName).
    5. Initialize variable propertyName with value with the semantics of var, let or const based on VarOrLetOrConst.
    6. Return « propertyName ».
    +
    1. TODO: This section is not written in the spec language yet.
    2. Let propertyName be the first element of BoundNames of BindingIdentifier.
    3. If ? HasPropertyCached(subject, cacheGroup, propertyName) is false, then
      1. If ? is present, return « ».
      2. Return not-matched.
    4. Let value be ? GetCached(subject, cacheGroup, propertyName).
    5. Initialize variable propertyName with value with the semantics of var, let or const based on VarOrLetOrConst.
    6. Return « propertyName ».
    MatchProperty : - VarOrLetOrConst + VarOrLetOrConst BindingIdentifier ?opt : - MatchPattern + MatchPattern -
    1. TODO: This section is not written in the spec language yet.
    2. Let propertyName be the first element of BoundNames of BindingIdentifier.
    3. If ? HasPropertyCached(subject, cacheGroup, propertyName) is false, then
      1. If ? is present, return « ».
      2. Return not-matched.
    4. Let value be ? GetCached(subject, cacheGroup, propertyName).
    5. Let matches be ? MatchPatternMatches of MatchPattern with arguments value and cacheGroup.
    6. If matches is false, return not-matched.
    7. Initialize variable propertyName with value with the semantics of var, let or const based on VarOrLetOrConst.
    8. Return « propertyName ».
    +
    1. TODO: This section is not written in the spec language yet.
    2. Let propertyName be the first element of BoundNames of BindingIdentifier.
    3. If ? HasPropertyCached(subject, cacheGroup, propertyName) is false, then
      1. If ? is present, return « ».
      2. Return not-matched.
    4. Let value be ? GetCached(subject, cacheGroup, propertyName).
    5. Let matches be ? MatchPatternMatches of MatchPattern with arguments value and cacheGroup.
    6. If matches is false, return not-matched.
    7. Initialize variable propertyName with value with the semantics of var, let or const based on VarOrLetOrConst.
    8. Return « propertyName ».

    30.1.10 Runtime Semantics: ArrayPatternMatches

    -

    The syntax-directed operation ArrayPatternMatches takes arguments subject (an ECMAScript language value) and cacheGroup (a %Map%) and returns either a normal completion containing a Boolean or an abrupt completion. It is defined piecewise over the following productions:

    +

    The syntax-directed operation ArrayPatternMatches takes arguments subject (an ECMAScript language value) and cacheGroup (a %Map%) and returns either a normal completion containing a Boolean or an abrupt completion. It is defined piecewise over the following productions:

    ArrayPattern : [ - MatchListopt + MatchListopt ] -
    1. If IsCallable(? GetCached(subject, cacheGroup, @@iterator)) is false, return false.
    2. Let iteratorRecord be ? GetIteratorCached(subject, cacheGroup).
    3. If MatchList is not present, then
      1. Return ? FinishListMatch(subject, cacheGroup, 0).
    4. Return ? ListPatternMatches of MatchList with arguments iteratorRecord and cacheGroup.
    +
    1. If IsCallable(? GetCached(subject, cacheGroup, @@iterator)) is false, return false.
    2. Let iteratorRecord be ? GetIteratorCached(subject, cacheGroup).
    3. If MatchList is not present, then
      1. Return ? FinishListMatch(subject, cacheGroup, 0).
    4. Return ? ListPatternMatches of MatchList with arguments iteratorRecord and cacheGroup.
    @@ -2127,61 +2482,61 @@

    30.1.11 Runtime Semantics: ListPatternMatches MatchList : Elisionopt - MatchRestElementopt + MatchRestElementopt -
    1. Let visitedCount be 0.
    2. If Elision is present, then
      1. If ? GetIteratorNthValueCached(subject, cacheGroup, 0) is not-matched, return false.
      2. Set visitedCount to 1.
    3. If MatchRestElement is present, then
      1. Let matches be ? ListPatternInnerMatches of MatchRestElement with arguments subject, cacheGroup and visitedCount.
      2. Return ? FinishListMatch(subject, cacheGroup, matches).
    4. Return ? FinishListMatch(subject, cacheGroup, visitedCount).
    +
    1. Let visitedCount be 0.
    2. If Elision is present, then
      1. If ? GetIteratorNthValueCached(subject, cacheGroup, 0) is not-matched, return false.
      2. Set visitedCount to 1.
    3. If MatchRestElement is present, then
      1. Let matches be ? ListPatternInnerMatches of MatchRestElement with arguments subject, cacheGroup and visitedCount.
      2. Return ? FinishListMatch(subject, cacheGroup, matches).
    4. Return ? FinishListMatch(subject, cacheGroup, visitedCount).
    - MatchList : MatchElementList + MatchList : MatchElementList -
    1. Let matches be ? ListPatternInnerMatches of MatchElementList with arguments subject, cacheGroup and 0.
    2. Return ? FinishListMatch(subject, cacheGroup, matches).
    +
    1. Let matches be ? ListPatternInnerMatches of MatchElementList with arguments subject, cacheGroup and 0.
    2. Return ? FinishListMatch(subject, cacheGroup, matches).
    MatchList : - MatchElementList + MatchElementList , Elisionopt - MatchRestElementopt + MatchRestElementopt -
    1. Let visitedCount be ? ListPatternInnerMatches of MatchElementList with arguments subject, cacheGroup and 0.
    2. If visitedCount is not-matched, return false.
    3. Assert: visitedCount is a non-negative integer.
    4. If Elision is present, then
      1. If ? GetIteratorNthValueCached(subject, cacheGroup, visitedCount) is not-matched, return false.
      2. Set visitedCount to visitedCount + 1.
    5. If MatchRestElement is present, then
      1. Let matches be ? ListPatternInnerMatches of MatchRestElement with arguments subject, cacheGroup and visitedCount.
      2. Return ? FinishListMatch(subject, cacheGroup, matches).
    6. Return ? FinishListMatch(subject, cacheGroup, visitedCount).
    +
    1. Let visitedCount be ? ListPatternInnerMatches of MatchElementList with arguments subject, cacheGroup and 0.
    2. If visitedCount is not-matched, return false.
    3. Assert: visitedCount is a non-negative integer.
    4. If Elision is present, then
      1. If ? GetIteratorNthValueCached(subject, cacheGroup, visitedCount) is not-matched, return false.
      2. Set visitedCount to visitedCount + 1.
    5. If MatchRestElement is present, then
      1. Let matches be ? ListPatternInnerMatches of MatchRestElement with arguments subject, cacheGroup and visitedCount.
      2. Return ? FinishListMatch(subject, cacheGroup, matches).
    6. Return ? FinishListMatch(subject, cacheGroup, visitedCount).

    30.1.12 Runtime Semantics: ListPatternInnerMatches

    The syntax-directed operation ListPatternInnerMatches takes arguments subject (an Iterator Record), cacheGroup (a %Map%), and startIndex (a non-negative integer) and returns either a normal completion containing either a non-negative integer, unlimited or not-matched, or an abrupt completion. It is defined piecewise over the following productions:

    - MatchElementList : MatchElisionElement + MatchElementList : MatchElisionElement -
    1. Return ? ListPatternInnerMatches of MatchElisionElement with arguments subject, cacheGroup and startIndex.
    +
    1. Return ? ListPatternInnerMatches of MatchElisionElement with arguments subject, cacheGroup and startIndex.
    MatchElementList : - MatchElementList + MatchElementList , - MatchElisionElement + MatchElisionElement -
    1. Let visitedCount be ? ListPatternInnerMatches of MatchElementList with arguments subject, cacheGroup and startIndex.
    2. If visitedCount is not-matched, return not-matched.
    3. Assert: visitedCount is a non-negative integer.
    4. Let matches be ? ListPatternInnerMatches of MatchElisionElement with arguments subject, cacheGroup and startIndex + visitedCount.
    5. If matches is not-matched, return not-matched.
    6. Assert: matches is a non-negative integer.
    7. Return visitedCount + matches.
    +
    1. Let visitedCount be ? ListPatternInnerMatches of MatchElementList with arguments subject, cacheGroup and startIndex.
    2. If visitedCount is not-matched, return not-matched.
    3. Assert: visitedCount is a non-negative integer.
    4. Let matches be ? ListPatternInnerMatches of MatchElisionElement with arguments subject, cacheGroup and startIndex + visitedCount.
    5. If matches is not-matched, return not-matched.
    6. Assert: matches is a non-negative integer.
    7. Return visitedCount + matches.
    MatchElisionElement : Elisionopt - MatchElement + MatchElement -
    1. Let visitedCount be 0.
    2. If Elision is present, then
      1. If ? GetIteratorNthValueCached(subject, cacheGroup, startIndex) is not-matched, return not-matched.
      2. Set visitedCount to visitedCount + 1.
    3. Let matches be ? ListPatternInnerMatches of MatchElement with arguments subject, cacheGroup and startIndex + visitedCount.
    4. If matches is not-matched, return not-matched.
    5. Assert: matches is a non-negative integer.
    6. Return visitedCount + matches.
    +
    1. Let visitedCount be 0.
    2. If Elision is present, then
      1. If ? GetIteratorNthValueCached(subject, cacheGroup, startIndex) is not-matched, return not-matched.
      2. Set visitedCount to visitedCount + 1.
    3. Let matches be ? ListPatternInnerMatches of MatchElement with arguments subject, cacheGroup and startIndex + visitedCount.
    4. If matches is not-matched, return not-matched.
    5. Assert: matches is a non-negative integer.
    6. Return visitedCount + matches.
    MatchElement : - MatchPattern + MatchPattern ?opt -
    1. Let value be ? GetIteratorNthValueCached(subject, cacheGroup, startIndex).
    2. If value is not-matched, then
      1. If ? is present, return 1.
      2. Return not-matched.
    3. Let matches be ? MatchPatternMatches of MatchPattern with arguments value and cacheGroup.
    4. If matches is false, return not-matched.
    5. Return 1.
    +
    1. Let value be ? GetIteratorNthValueCached(subject, cacheGroup, startIndex).
    2. If value is not-matched, then
      1. If ? is present, return 1.
      2. Return not-matched.
    3. Let matches be ? MatchPatternMatches of MatchPattern with arguments value and cacheGroup.
    4. If matches is false, return not-matched.
    5. Return 1.
    MatchRestElement : ... @@ -2190,85 +2545,85 @@

    30.1.12 Runtime Semantics: ListPatternInnerMatch MatchRestElement : ... - MatchPattern + MatchPattern -
    1. Let elements be a new empty List.
    2. Let i be startIndex.
    3. Let next be unused.
    4. Repeat, while next is not not-matched,
      1. Set next to ? GetIteratorNthValueCached(subject, cacheGroup, i).
      2. If next is not not-matched, append next to elements.
      3. Set i to i + 1.
    5. Let rest be CreateArrayFromList(elements).
    6. Let matches be ? MatchPatternMatches of MatchPattern with arguments rest and cacheGroup.
    7. If matches is false, return not-matched.
    8. Return unlimited.
    +
    1. Let elements be a new empty List.
    2. Let i be startIndex.
    3. Let next be unused.
    4. Repeat, while next is not not-matched,
      1. Set next to ? GetIteratorNthValueCached(subject, cacheGroup, i).
      2. If next is not not-matched, append next to elements.
      3. Set i to i + 1.
    5. Let rest be CreateArrayFromList(elements).
    6. Let matches be ? MatchPatternMatches of MatchPattern with arguments rest and cacheGroup.
    7. If matches is false, return not-matched.
    8. Return unlimited.

    30.1.13 Runtime Semantics: UnaryAlgebraicPatternMatches

    -

    The syntax-directed operation UnaryAlgebraicPatternMatches takes argument subject (an ECMAScript language value) and returns either a normal completion containing a Boolean or an abrupt completion. It is defined piecewise over the following productions:

    +

    The syntax-directed operation UnaryAlgebraicPatternMatches takes argument subject (an ECMAScript language value) and returns either a normal completion containing a Boolean or an abrupt completion. It is defined piecewise over the following productions:

    - UnaryAlgebraicPattern : PatternMatchingUnaryAlgebraicExpression + UnaryAlgebraicPattern : PatternMatchingUnaryAlgebraicExpression -
    1. Let expr be the Expression that is covered by PatternMatchingUnaryAlgebraicExpression.
    2. Let ref be ? Evaluation of expr.
    3. Let value be ? GetValue(ref).
    4. Return SameValue(subject, value).
    +
    1. Let expr be the Expression that is covered by PatternMatchingUnaryAlgebraicExpression.
    2. Let ref be ? Evaluation of expr.
    3. Let value be ? GetValue(ref).
    4. Return SameValue(subject, value).

    30.1.14 Runtime Semantics: RelationalPatternMatches

    -

    The syntax-directed operation RelationalPatternMatches takes argument subject (an ECMAScript language value) and returns either a normal completion containing a Boolean or an abrupt completion. It is defined piecewise over the following productions:

    +

    The syntax-directed operation RelationalPatternMatches takes argument subject (an ECMAScript language value) and returns either a normal completion containing a Boolean or an abrupt completion. It is defined piecewise over the following productions:

    RelationalPattern : < - PatternMatchingOrderExpression + PatternMatchingOrderExpression -
    1. Let expr be the Expression that is covered by PatternMatchingOrderExpression.
    2. Let ref be ? Evaluation of expr.
    3. Let value be ? GetValue(ref).
    4. Let r be ? IsLessThan(subject, value, true).
    5. If r is undefined, return false. Otherwise, return r.
    +
    1. Let expr be the Expression that is covered by PatternMatchingOrderExpression.
    2. Let ref be ? Evaluation of expr.
    3. Let value be ? GetValue(ref).
    4. Let r be ? IsLessThan(subject, value, true).
    5. If r is undefined, return false. Otherwise, return r.
    RelationalPattern : > - PatternMatchingOrderExpression + PatternMatchingOrderExpression -
    1. Let expr be the Expression that is covered by PatternMatchingOrderExpression.
    2. Let ref be ? Evaluation of expr.
    3. Let value be ? GetValue(ref).
    4. Let r be ? IsLessThan(value, subject, false).
    5. If r is undefined, return false. Otherwise, return r.
    +
    1. Let expr be the Expression that is covered by PatternMatchingOrderExpression.
    2. Let ref be ? Evaluation of expr.
    3. Let value be ? GetValue(ref).
    4. Let r be ? IsLessThan(value, subject, false).
    5. If r is undefined, return false. Otherwise, return r.
    RelationalPattern : <= - PatternMatchingOrderExpression + PatternMatchingOrderExpression -
    1. Let expr be the Expression that is covered by PatternMatchingOrderExpression.
    2. Let ref be ? Evaluation of expr.
    3. Let value be ? GetValue(ref).
    4. Let r be ? IsLessThan(subject, value, true).
    5. If r is either true or undefined, return false. Otherwise, return true.
    +
    1. Let expr be the Expression that is covered by PatternMatchingOrderExpression.
    2. Let ref be ? Evaluation of expr.
    3. Let value be ? GetValue(ref).
    4. Let r be ? IsLessThan(subject, value, true).
    5. If r is either true or undefined, return false. Otherwise, return true.
    RelationalPattern : >= - PatternMatchingOrderExpression + PatternMatchingOrderExpression -
    1. Let expr be the Expression that is covered by PatternMatchingOrderExpression.
    2. Let ref be ? Evaluation of expr.
    3. Let value be ? GetValue(ref).
    4. Let r be ? IsLessThan(value, subject, false).
    5. If r is either true or undefined, return false. Otherwise, return true.
    +
    1. Let expr be the Expression that is covered by PatternMatchingOrderExpression.
    2. Let ref be ? Evaluation of expr.
    3. Let value be ? GetValue(ref).
    4. Let r be ? IsLessThan(value, subject, false).
    5. If r is either true or undefined, return false. Otherwise, return true.
    RelationalPattern : instanceof - PatternMatchingMemberExpression + PatternMatchingMemberExpression -
    1. Let expr be the Expression that is covered by PatternMatchingMemberExpression.
    2. Let ref be ? Evaluation of expr.
    3. Let value be ? GetValue(ref).
    4. Return ? InstanceofOperator(subject, value).
    +
    1. Let expr be the Expression that is covered by PatternMatchingMemberExpression.
    2. Let ref be ? Evaluation of expr.
    3. Let value be ? GetValue(ref).
    4. Return ? InstanceofOperator(subject, value).
    RelationalPattern : in - PatternMatchingMemberExpression + PatternMatchingMemberExpression -
    1. Let key be ? ToPropertyKey(subject).
    2. Let expr be the Expression that is covered by PatternMatchingMemberExpression.
    3. Let ref be ? Evaluation of expr.
    4. Let value be ? GetValue(ref).
    5. If value is not an Object, return false.
    6. Return ? HasProperty(value, key).
    +
    1. Let key be ? ToPropertyKey(subject).
    2. Let expr be the Expression that is covered by PatternMatchingMemberExpression.
    3. Let ref be ? Evaluation of expr.
    4. Let value be ? GetValue(ref).
    5. If value is not an Object, return false.
    6. Return ? HasProperty(value, key).
    Editor's Note
    The current proposal caches all operations on subject except this. Should we cache the result of ToPropertyKey?
    RelationalPattern : has - PatternMatchingStringLikeExpression + PatternMatchingStringLikeExpression -
    1. If subject is not an Object, return false.
    2. Let expr be the Expression that is covered by PatternMatchingStringLikeExpression.
    3. Let ref be ? Evaluation of expr.
    4. Let value be ? GetValue(ref).
    5. Return ? HasProperty(subject, ? ToPropertyKey(value)).
    +
    1. If subject is not an Object, return false.
    2. Let expr be the Expression that is covered by PatternMatchingStringLikeExpression.
    3. Let ref be ? Evaluation of expr.
    4. Let value be ? GetValue(ref).
    5. Return ? HasProperty(subject, ? ToPropertyKey(value)).
    RelationalPattern : has @@ -2280,35 +2635,35 @@

    30.1.14 Runtime Semantics: RelationalPatternMatc RelationalPattern : == - PatternMatchingEqualExpression + PatternMatchingEqualExpression -
    1. Let expr be the Expression that is covered by PatternMatchingEqualExpression.
    2. Let ref be ? Evaluation of expr.
    3. Let value be ? GetValue(ref).
    4. Return ? IsLooselyEqual(subject, value).
    +
    1. Let expr be the Expression that is covered by PatternMatchingEqualExpression.
    2. Let ref be ? Evaluation of expr.
    3. Let value be ? GetValue(ref).
    4. Return ? IsLooselyEqual(subject, value).
    RelationalPattern : != - PatternMatchingEqualExpression + PatternMatchingEqualExpression -
    1. Let expr be the Expression that is covered by PatternMatchingEqualExpression.
    2. Let ref be ? Evaluation of expr.
    3. Let value be ? GetValue(ref).
    4. Let r be ? IsLooselyEqual(subject, value).
    5. If r is true, return false. Otherwise, return true.
    +
    1. Let expr be the Expression that is covered by PatternMatchingEqualExpression.
    2. Let ref be ? Evaluation of expr.
    3. Let value be ? GetValue(ref).
    4. Let r be ? IsLooselyEqual(subject, value).
    5. If r is true, return false. Otherwise, return true.
    RelationalPattern : === - PatternMatchingEqualExpression + PatternMatchingEqualExpression -
    1. Let expr be the Expression that is covered by PatternMatchingEqualExpression.
    2. Let ref be ? Evaluation of expr.
    3. Let value be ? GetValue(ref).
    4. Return IsStrictlyEqual(subject, value).
    +
    1. Let expr be the Expression that is covered by PatternMatchingEqualExpression.
    2. Let ref be ? Evaluation of expr.
    3. Let value be ? GetValue(ref).
    4. Return IsStrictlyEqual(subject, value).
    RelationalPattern : !== - PatternMatchingEqualExpression + PatternMatchingEqualExpression -
    1. Let expr be the Expression that is covered by PatternMatchingEqualExpression.
    2. Let ref be ? Evaluation of expr.
    3. Let value be ? GetValue(ref).
    4. Let r be IsStrictlyEqual(subject, value).
    5. If r is true, return false. Otherwise, return true.
    +
    1. Let expr be the Expression that is covered by PatternMatchingEqualExpression.
    2. Let ref be ? Evaluation of expr.
    3. Let value be ? GetValue(ref).
    4. Let r be IsStrictlyEqual(subject, value).
    5. If r is true, return false. Otherwise, return true.
    @@ -2328,33 +2683,33 @@

    30.1.15 Runtime Semantics: IfPatternMatches

    30.1.16 Runtime Semantics: CombinedMatchPatternMatches

    -

    The syntax-directed operation CombinedMatchPatternMatches takes arguments subject (an ECMAScript language value) and cacheGroup (a %Map%) and returns either a normal completion containing a Boolean or an abrupt completion. It is defined piecewise over the following productions:

    +

    The syntax-directed operation CombinedMatchPatternMatches takes arguments subject (an ECMAScript language value) and cacheGroup (a %Map%) and returns either a normal completion containing a Boolean or an abrupt completion. It is defined piecewise over the following productions:

    CombinedMatchPattern : - MatchPattern + MatchPattern and - MatchPattern + MatchPattern -
    1. Let leftMatches be ? MatchPatternMatches of the first MatchPattern with arguments subject and cacheGroup.
    2. If leftMatches is false, return false.
    3. Return ? MatchPatternMatches of the second MatchPattern with arguments subject and cacheGroup.
    +
    1. Let leftMatches be ? MatchPatternMatches of the first MatchPattern with arguments subject and cacheGroup.
    2. If leftMatches is false, return false.
    3. Return ? MatchPatternMatches of the second MatchPattern with arguments subject and cacheGroup.
    CombinedMatchPattern : - MatchPattern + MatchPattern or - MatchPattern + MatchPattern -
    1. Let leftMatches be ? MatchPatternMatches of the first MatchPattern with arguments subject and cacheGroup.
    2. If leftMatches is true, return true.
    3. Return ? MatchPatternMatches of the second MatchPattern with arguments subject and cacheGroup.
    +
    1. Let leftMatches be ? MatchPatternMatches of the first MatchPattern with arguments subject and cacheGroup.
    2. If leftMatches is true, return true.
    3. Return ? MatchPatternMatches of the second MatchPattern with arguments subject and cacheGroup.
    CombinedMatchPattern : not - MatchPattern + MatchPattern -
    1. Let matches be ? MatchPatternMatches of MatchPattern with arguments subject and cacheGroup.
    2. If matches is true, return false.
    3. Return true.
    +
    1. Let matches be ? MatchPatternMatches of MatchPattern with arguments subject and cacheGroup.
    2. If matches is true, return false.
    3. Return true.
    @@ -2366,22 +2721,22 @@

    Syntax

    CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] [no LineTerminator here] { - MatchExpressionClauses[?Yield, ?Await] + MatchExpressionClauses[?Yield, ?Await] ; }
    MatchExpressionClauses[Yield, Await] : - MatchExpressionClause[?Yield, ?Await] + MatchExpressionClause[?Yield, ?Await] - MatchExpressionClauses[?Yield, ?Await] + MatchExpressionClauses[?Yield, ?Await] ; - MatchExpressionClause[?Yield, ?Await] + MatchExpressionClause[?Yield, ?Await] - MatchExpressionClauses[?Yield, ?Await] + MatchExpressionClauses[?Yield, ?Await] ; default : @@ -2395,7 +2750,7 @@

    Syntax

    MatchExpressionClause[Yield, Await] : - MatchPattern[?Yield, ?Await] + MatchPattern[?Yield, ?Await] : Expression[+In, ?Yield, ?Await] @@ -2409,7 +2764,7 @@

    Supplemental Syntax

    MatchExpression : CoverCallExpressionAndAsyncArrowHead { - MatchExpressionClauses + MatchExpressionClauses ; } @@ -2437,7 +2792,7 @@

    Supplemental Syntax

    }

    Editor's Note
    - This production can be replaced by the is expression. + This production can be replaced by the is expression. The code example above can be written as:
    const result =
       value is { type: "add", var lhs, var rhs } ? lhs + rhs :
    @@ -2464,14 +2819,14 @@ 

    30.2.1 Static Semantics: Early Errors

    MatchExpression : CoverCallExpressionAndAsyncArrowHead { - MatchExpressionClauses + MatchExpressionClauses ; } @@ -2481,35 +2836,35 @@

    30.2.2 Runtime Semantics: Evaluation

    MatchExpression : CoverCallExpressionAndAsyncArrowHead { - MatchExpressionClauses + MatchExpressionClauses ; } -
    1. Let head be the MatchHead that is covered by CoverCallExpressionAndAsyncArrowHead.
    2. Let subjectParseNode be the Expression of head.
    3. Let subjectRef be the ? Evaluation of subjectParseNode.
    4. Let subject be ? GetValue(subjectRef).
    5. Let cacheGroup be CreateMatchCache().
    6. Let matchCompletion be Completion(MatchExpressionClausesEvaluation of MatchExpressionClauses with arguments subject and cacheGroup).
    7. Let result be Completion(FinishMatch(matchCompletion, cacheGroup)).
    8. Assert: result is a normal completion or an abrupt completion.
    9. Return result.
    +
    1. Let head be the MatchHead that is covered by CoverCallExpressionAndAsyncArrowHead.
    2. Let subjectParseNode be the Expression of head.
    3. Let subjectRef be the ? Evaluation of subjectParseNode.
    4. Let subject be ? GetValue(subjectRef).
    5. Let cacheGroup be CreateMatchCache().
    6. Let matchCompletion be Completion(MatchExpressionClausesEvaluation of MatchExpressionClauses with arguments subject and cacheGroup).
    7. Let result be Completion(FinishMatch(matchCompletion, cacheGroup)).
    8. Assert: result is a normal completion or an abrupt completion.
    9. Return result.

    30.2.3 Runtime Semantics: MatchExpressionClausesEvaluation

    -

    The syntax-directed operation MatchExpressionClausesEvaluation takes arguments subject (an ECMAScript language value) and cacheGroup (a %Map%) and returns either a normal completion containing either an ECMAScript language value or not-matched, or an abrupt completion. It is defined piecewise over the following productions:

    +

    The syntax-directed operation MatchExpressionClausesEvaluation takes arguments subject (an ECMAScript language value) and cacheGroup (a %Map%) and returns either a normal completion containing either an ECMAScript language value or not-matched, or an abrupt completion. It is defined piecewise over the following productions:

    - MatchExpressionClauses : MatchExpressionClause + MatchExpressionClauses : MatchExpressionClause -
    1. Return ? MatchExpressionClauseEvaluation of MatchExpressionClause with arguments subject and cacheGroup.
    +
    1. Return ? MatchExpressionClauseEvaluation of MatchExpressionClause with arguments subject and cacheGroup.
    MatchExpressionClauses : - MatchExpressionClauses + MatchExpressionClauses ; - MatchExpressionClause + MatchExpressionClause -
    1. Let result be ? MatchExpressionClausesEvaluation of MatchExpressionClauses with arguments subject and cacheGroup.
    2. If result is an ECMAScript language value, return result.
    3. Return ? MatchExpressionClauseEvaluation of MatchExpressionClause with arguments subject and cacheGroup.
    +
    1. Let result be ? MatchExpressionClausesEvaluation of MatchExpressionClauses with arguments subject and cacheGroup.
    2. If result is an ECMAScript language value, return result.
    3. Return ? MatchExpressionClauseEvaluation of MatchExpressionClause with arguments subject and cacheGroup.
    MatchExpressionClauses : - MatchExpressionClauses + MatchExpressionClauses ; default : @@ -2517,7 +2872,7 @@

    30.2.3 Runtime Semantics: MatchExpressionClauses -
    1. Let result be ? MatchExpressionClausesEvaluation of MatchExpressionClauses with arguments subject and cacheGroup.
    2. If result is an ECMAScript language value, return result.
    3. Return ? Evaluation of Expression.
    +
    1. Let result be ? MatchExpressionClausesEvaluation of MatchExpressionClauses with arguments subject and cacheGroup.
    2. If result is an ECMAScript language value, return result.
    3. Return ? Evaluation of Expression.
    MatchExpressionClauses : default @@ -2531,16 +2886,16 @@

    30.2.3 Runtime Semantics: MatchExpressionClauses

    30.2.4 Runtime Semantics: MatchExpressionClauseEvaluation

    -

    The syntax-directed operation MatchExpressionClauseEvaluation takes arguments subject (an ECMAScript language value) and cacheGroup (a %Map%) and returns either a normal completion containing either an ECMAScript language value or not-matched, or an abrupt completion. It is defined piecewise over the following productions:

    +

    The syntax-directed operation MatchExpressionClauseEvaluation takes arguments subject (an ECMAScript language value) and cacheGroup (a %Map%) and returns either a normal completion containing either an ECMAScript language value or not-matched, or an abrupt completion. It is defined piecewise over the following productions:

    MatchExpressionClause : - MatchPattern + MatchPattern : Expression -
    1. Let matches be ? MatchPatternMatches of MatchPattern with arguments subject and cacheGroup.
    2. If matches is true, return ? Evaluation of Expression.
    3. Return not-matched.
    +
    1. Let matches be ? MatchPatternMatches of MatchPattern with arguments subject and cacheGroup.
    2. If matches is true, return ? Evaluation of Expression.
    3. Return not-matched.
    @@ -2549,8 +2904,8 @@

    30.3 Abstract Operations for Pattern Matching

    30.3.1 InvokeCustomMatcher ( matcher, subject, cacheGroup, kind, receiver )

    -

    The abstract operation InvokeCustomMatcher takes arguments matcher (an ECMAScript language value), subject (an ECMAScript language value), cacheGroup (a %Map%), kind (boolean or list), and receiver (an ECMAScript language value) and returns either a normal completion containing either a Boolean or an Object, or an abrupt completion. It performs the following steps when called:

    -
    1. If matcher is not an Object, return SameValueZero(matcher, subject).
    2. Let f be ? Get(matcher, @@customMatcher).
    3. If f is undefined, return SameValueNonNumber(matcher, subject).
    4. If kind is boolean, let hint be "boolean".
    5. Else, let hint be "list".
    6. Let result be ? Call(f, matcher, « subject, hint, receiver »).
    7. If result is false, return false.
    8. If result is true and kind is boolean, return true.
    9. If result is not an Object, throw a TypeError exception.
    10. Perform ? GetIteratorCached(result, cacheGroup).
    11. If kind is boolean, return true.
    12. Return result.
    +

    The abstract operation InvokeCustomMatcher takes arguments matcher (an ECMAScript language value), subject (an ECMAScript language value), cacheGroup (a %Map%), kind (boolean or list), and receiver (an ECMAScript language value) and returns either a normal completion containing either a Boolean or an Object, or an abrupt completion. It performs the following steps when called:

    +
    1. If matcher is not an Object, return SameValueZero(matcher, subject).
    2. Let f be ? Get(matcher, @@customMatcher).
    3. If f is undefined, return SameValueNonNumber(matcher, subject).
    4. If kind is boolean, let hint be "boolean".
    5. Else, let hint be "list".
    6. Let result be ? Call(f, matcher, « subject, hint, receiver »).
    7. If result is false, return false.
    8. If result is true and kind is boolean, return true.
    9. If result is not an Object, throw a TypeError exception.
    10. Perform ? GetIteratorCached(result, cacheGroup).
    11. If kind is boolean, return true.
    12. Return result.
    Editor's Note
    The hint parameter is not a consensus in the champion group yet. This design is to solve runtime performance concerns about custom matchers. The extractor proposal may add a new hint object for the following syntax.
    const Point{ x, y } = expr;
    @@ -2559,7 +2914,7 @@

    30.3.1 InvokeCustomMatcher ( matcher,

    30.3.2 ValidateCustomMatcherHint ( hint [ , kind ] )

    -

    The abstract operation ValidateCustomMatcherHint takes argument hint (an ECMAScript language value) and optional argument kind (boolean or list) and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:

    +

    The abstract operation ValidateCustomMatcherHint takes argument hint (an ECMAScript language value) and optional argument kind (boolean or list) and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:

    1. If hint is not "boolean" or "list", throw a TypeError exception.
    2. If kind is not present, return unused.
    3. If hint is "boolean" and kind is list, throw a TypeError exception.
    4. If hint is "list" and kind is boolean, throw a TypeError exception.
    @@ -2576,46 +2931,46 @@

    30.3.3 CreateMatchCache ( )

    30.3.4 GetMatchCache ( subject, cacheGroup )

    -

    The abstract operation GetMatchCache takes arguments subject (an ECMAScript language value) and cacheGroup (a %Map%) and returns an ECMAScript language value. It performs the following steps when called:

    -
    1. Assert: cacheGroup is created by CreateMatchCache and used internally for pattern-matching.
    2. If ! Call(%Map.prototype.has%, cacheGroup, « subject ») is true, then
      1. Return ! Call(%Map.prototype.get%, cacheGroup, « subject »).
    3. Let cache be OrdinaryObjectCreate(null).
    4. Perform ! CreateDataPropertyOrThrow(cache, "Has", ! Construct(%Map%)).
    5. Perform ! CreateDataPropertyOrThrow(cache, "Get", ! Construct(%Map%)).
    6. Perform ! CreateDataPropertyOrThrow(cache, "Iterator", undefined).
    7. Perform ! CreateDataPropertyOrThrow(cache, "IteratedValues", ! ArrayCreate(0, null)).
    8. Perform ! Call(%Map.prototype.set%, cacheGroup, « subject, cache »).
    9. Return cache.
    +

    The abstract operation GetMatchCache takes arguments subject (an ECMAScript language value) and cacheGroup (a %Map%) and returns an ECMAScript language value. It performs the following steps when called:

    +
    1. Assert: cacheGroup is created by CreateMatchCache and used internally for pattern-matching.
    2. If ! Call(%Map.prototype.has%, cacheGroup, « subject ») is true, then
      1. Return ! Call(%Map.prototype.get%, cacheGroup, « subject »).
    3. Let cache be OrdinaryObjectCreate(null).
    4. Perform ! CreateDataPropertyOrThrow(cache, "Has", ! Construct(%Map%)).
    5. Perform ! CreateDataPropertyOrThrow(cache, "Get", ! Construct(%Map%)).
    6. Perform ! CreateDataPropertyOrThrow(cache, "Iterator", undefined).
    7. Perform ! CreateDataPropertyOrThrow(cache, "IteratedValues", ! ArrayCreate(0, null)).
    8. Perform ! Call(%Map.prototype.set%, cacheGroup, « subject, cache »).
    9. Return cache.

    30.3.5 HasPropertyCached ( subject, cacheGroup, propertyName )

    -

    The abstract operation HasPropertyCached takes arguments subject (an ECMAScript language value), cacheGroup (a %Map%), and propertyName (a property key) and returns either a normal completion containing a Boolean or an abrupt completion. It performs the following steps when called:

    -
    1. Assert: cacheGroup is created by CreateMatchCache and used internally for pattern-matching.
    2. Let cache be ! Get(GetMatchCache(subject, cacheGroup), "Has").
    3. Let hasCache be ! Call(%Map.prototype.has%, cache, « propertyName »).
    4. If hasCache is true, return ! Call(%Map.prototype.get%, cache, « propertyName »).
    5. Let result be ? HasProperty(subject, propertyName).
    6. Perform ! Call(%Map.prototype.set%, cache, « propertyName, result »).
    7. Return result.
    +

    The abstract operation HasPropertyCached takes arguments subject (an ECMAScript language value), cacheGroup (a %Map%), and propertyName (a property key) and returns either a normal completion containing a Boolean or an abrupt completion. It performs the following steps when called:

    +
    1. Assert: cacheGroup is created by CreateMatchCache and used internally for pattern-matching.
    2. Let cache be ! Get(GetMatchCache(subject, cacheGroup), "Has").
    3. Let hasCache be ! Call(%Map.prototype.has%, cache, « propertyName »).
    4. If hasCache is true, return ! Call(%Map.prototype.get%, cache, « propertyName »).
    5. Let result be ? HasProperty(subject, propertyName).
    6. Perform ! Call(%Map.prototype.set%, cache, « propertyName, result »).
    7. Return result.

    30.3.6 GetCached ( subject, cacheGroup, propertyName )

    -

    The abstract operation GetCached takes arguments subject (an ECMAScript language value), cacheGroup (a %Map%), and propertyName (a property key) and returns either a normal completion containing an ECMAScript language value or an abrupt completion. It performs the following steps when called:

    -
    1. Assert: cacheGroup is created by CreateMatchCache and used internally for pattern-matching.
    2. Let cache be ! Get(GetMatchCache(subject, cacheGroup), "Get").
    3. Let hasCache be ! Call(%Map.prototype.has%, cache, « propertyName »).
    4. If hasCache is true, return ! Call(%Map.prototype.get%, cache, « propertyName »).
    5. Let result be ? Get(subject, propertyName).
    6. Perform ! Call(%Map.prototype.set%, cache, « propertyName, result »).
    7. Return result.
    +

    The abstract operation GetCached takes arguments subject (an ECMAScript language value), cacheGroup (a %Map%), and propertyName (a property key) and returns either a normal completion containing an ECMAScript language value or an abrupt completion. It performs the following steps when called:

    +
    1. Assert: cacheGroup is created by CreateMatchCache and used internally for pattern-matching.
    2. Let cache be ! Get(GetMatchCache(subject, cacheGroup), "Get").
    3. Let hasCache be ! Call(%Map.prototype.has%, cache, « propertyName »).
    4. If hasCache is true, return ! Call(%Map.prototype.get%, cache, « propertyName »).
    5. Let result be ? Get(subject, propertyName).
    6. Perform ! Call(%Map.prototype.set%, cache, « propertyName, result »).
    7. Return result.

    30.3.7 GetIteratorCached ( subject, cacheGroup )

    -

    The abstract operation GetIteratorCached takes arguments subject (an ECMAScript language value) and cacheGroup (a %Map%) and returns either a normal completion containing an Iterator Record or an abrupt completion. It performs the following steps when called:

    -
    1. Assert: cacheGroup is created by CreateMatchCache and used internally for pattern-matching.
    2. Let cache be GetMatchCache(subject, cacheGroup).
    3. Let iteratorRecordObject be ! Get(cache, "Iterator").
    4. If iteratorRecordObject is not undefined, return iteratorRecordObject.[[CachedIterator]].
    5. Let f be ? GetCached(subject, cacheGroup, @@iterator).
    6. Let iteratorRecord be ? GetIteratorFromMethod(subject, f).
    7. Set iteratorRecordObject to OrdinaryObjectCreate(null, « [[CachedIterator]] »).
    8. Set iteratorRecordObject.[[CachedIterator]] to iteratorRecord.
    9. Perform ! Set(cache, "Iterator", iteratorRecordObject, true).
    10. Perform ! Call(%Set.prototype.add%, ! Get(cacheGroup, "IteratorsToClose"), « iteratorRecordObject »).
    11. Return iteratorRecordObject.[[CachedIterator]].
    +

    The abstract operation GetIteratorCached takes arguments subject (an ECMAScript language value) and cacheGroup (a %Map%) and returns either a normal completion containing an Iterator Record or an abrupt completion. It performs the following steps when called:

    +
    1. Assert: cacheGroup is created by CreateMatchCache and used internally for pattern-matching.
    2. Let cache be GetMatchCache(subject, cacheGroup).
    3. Let iteratorRecordObject be ! Get(cache, "Iterator").
    4. If iteratorRecordObject is not undefined, return iteratorRecordObject.[[CachedIterator]].
    5. Let f be ? GetCached(subject, cacheGroup, @@iterator).
    6. Let iteratorRecord be ? GetIteratorFromMethod(subject, f).
    7. Set iteratorRecordObject to OrdinaryObjectCreate(null, « [[CachedIterator]] »).
    8. Set iteratorRecordObject.[[CachedIterator]] to iteratorRecord.
    9. Perform ! Set(cache, "Iterator", iteratorRecordObject, true).
    10. Perform ! Call(%Set.prototype.add%, ! Get(cacheGroup, "IteratorsToClose"), « iteratorRecordObject »).
    11. Return iteratorRecordObject.[[CachedIterator]].
    Editor's Note
    - The [[CachedIterator]] field only used in GetIteratorCached and CloseCachedIterators. Iterator Records are not ECMAScript language values and cannot be Set on an object, therefore an object is created to wrap the Iterator Record. + The [[CachedIterator]] field only used in GetIteratorCached and CloseCachedIterators. Iterator Records are not ECMAScript language values and cannot be Set on an object, therefore an object is created to wrap the Iterator Record.

    30.3.8 IteratorStepCached ( iterator, cacheGroup )

    -

    The abstract operation IteratorStepCached takes arguments iterator (an Iterator Record) and cacheGroup (a %Map%) and returns either a normal completion containing either an ECMAScript language value or not-matched, or an abrupt completion. It performs the following steps when called:

    -
    1. Assert: cacheGroup is created by CreateMatchCache and used internally for pattern-matching.
    2. If iterator.[[Done]] is true, return not-matched.
    3. Let cache be GetMatchCache(iterator, cacheGroup).
    4. Let iteratedValues be ! Get(cache, "IteratedValues").
    5. Let iteratorResult be Completion(IteratorStep(iterator)).
    6. If iteratorResult is an abrupt completion, set iterator.[[Done]] to true.
    7. ReturnIfAbrupt(iteratorResult).
    8. If iteratorResult is false, then
      1. Set iterator.[[Done]] to true.
      2. Return not-matched.
    9. Let value be Completion(IteratorValue(iteratorResult)).
    10. If value is an abrupt completion, set iterator.[[Done]] to true.
    11. ReturnIfAbrupt(value).
    12. Perform ! Call(%Array.prototype.push%, iteratedValues, « value »).
    13. Return value.
    +

    The abstract operation IteratorStepCached takes arguments iterator (an Iterator Record) and cacheGroup (a %Map%) and returns either a normal completion containing either an ECMAScript language value or not-matched, or an abrupt completion. It performs the following steps when called:

    +
    1. Assert: cacheGroup is created by CreateMatchCache and used internally for pattern-matching.
    2. If iterator.[[Done]] is true, return not-matched.
    3. Let cache be GetMatchCache(iterator, cacheGroup).
    4. Let iteratedValues be ! Get(cache, "IteratedValues").
    5. Let iteratorResult be Completion(IteratorStep(iterator)).
    6. If iteratorResult is an abrupt completion, set iterator.[[Done]] to true.
    7. ReturnIfAbrupt(iteratorResult).
    8. If iteratorResult is false, then
      1. Set iterator.[[Done]] to true.
      2. Return not-matched.
    9. Let value be Completion(IteratorValue(iteratorResult)).
    10. If value is an abrupt completion, set iterator.[[Done]] to true.
    11. ReturnIfAbrupt(value).
    12. Perform ! Call(%Array.prototype.push%, iteratedValues, « value »).
    13. Return value.

    30.3.9 GetIteratorNthValueCached ( iterator, cacheGroup, n )

    -

    The abstract operation GetIteratorNthValueCached takes arguments iterator (an Iterator Record), cacheGroup (a %Map%), and n (a non-negative integer) and returns either a normal completion containing either an ECMAScript language value or not-matched, or an abrupt completion. It performs the following steps when called:

    -
    1. NOTE: 0th is the first value.
    2. Assert: cacheGroup is created by CreateMatchCache and used internally for pattern-matching.
    3. Let iteratedValues be ! Get(GetMatchCache(iterator, cacheGroup), "IteratedValues").
    4. Let nthItem be ! iteratedValues.[[GetOwnProperty]](n).
    5. If nthItem is not undefined, return nthItem.[[Value]].
    6. Assert: ! LengthOfArrayLike(iteratedValues) is n. For example, iteratedValues has 0 values, n should be 0 to get the first value from the iterator.
    7. Return ? IteratorStepCached(iterator, cacheGroup).
    +

    The abstract operation GetIteratorNthValueCached takes arguments iterator (an Iterator Record), cacheGroup (a %Map%), and n (a non-negative integer) and returns either a normal completion containing either an ECMAScript language value or not-matched, or an abrupt completion. It performs the following steps when called:

    +
    1. NOTE: 0th is the first value.
    2. Assert: cacheGroup is created by CreateMatchCache and used internally for pattern-matching.
    3. Let iteratedValues be ! Get(GetMatchCache(iterator, cacheGroup), "IteratedValues").
    4. Let nthItem be ! iteratedValues.[[GetOwnProperty]](n).
    5. If nthItem is not undefined, return nthItem.[[Value]].
    6. Assert: ! LengthOfArrayLike(iteratedValues) is n. For example, iteratedValues has 0 values, n should be 0 to get the first value from the iterator.
    7. Return ? IteratorStepCached(iterator, cacheGroup).
    Editor's Note
    - This abstract operation get the nth (start from 0) value of the iterator, and run IteratorStepCached if it is not cached in the cacheGroup. + This abstract operation get the nth (start from 0) value of the iterator, and run IteratorStepCached if it is not cached in the cacheGroup. For all n > 1, this abstract operation expect this invariant:
      -
    • The evaluation of MatchList always evaluate the n-1th value before evaluate the nth.
    • +
    • The evaluation of MatchList always evaluate the n-1th value before evaluate the nth.
    • If the nth value is exists ([[GetOwnProperty]](n) returns a Property Descriptor), the n-1th value also exists.
    • If the nth value does not exist and the iterator.[[Done]] is true, there is no further call with a bigger n parameter with the same cacheGroup and iterator.
    @@ -2624,10 +2979,10 @@

    30.3.9 GetIteratorNthValueCached ( iterator

    30.3.10 FinishListMatch ( subject, cacheGroup, expectedLength )

    -

    The abstract operation FinishListMatch takes arguments subject (an ECMAScript language value), cacheGroup (a %Map%), and expectedLength (either a non-negative integer, not-matched or unlimited) and returns either a normal completion containing a Boolean or an abrupt completion. It performs the following steps when called:

    -
    1. If expectedLength is not-matched, return false.
    2. If expectedLength is unlimited, return true.
    3. Let iterator be ? GetIteratorCached(subject, cacheGroup).
    4. Let cache be GetMatchCache(iterator, cacheGroup).
    5. Let cachedLength be ! LengthOfArrayLike(! Get(cache, "IteratedValues")).
    6. If cachedLength > expectedLength, return false.
    7. Assert: cachedLength is expectedLength.
    8. If iterator.[[Done]] is true, return true.
    9. Let iteratorResult be ? GetIteratorNthValueCached(iterator, cacheGroup, expectedLength).
    10. If iteratorResult is not-matched, return true.
    11. Return false.
    +

    The abstract operation FinishListMatch takes arguments subject (an ECMAScript language value), cacheGroup (a %Map%), and expectedLength (either a non-negative integer, not-matched or unlimited) and returns either a normal completion containing a Boolean or an abrupt completion. It performs the following steps when called:

    +
    1. If expectedLength is not-matched, return false.
    2. If expectedLength is unlimited, return true.
    3. Let iterator be ? GetIteratorCached(subject, cacheGroup).
    4. Let cache be GetMatchCache(iterator, cacheGroup).
    5. Let cachedLength be ! LengthOfArrayLike(! Get(cache, "IteratedValues")).
    6. If cachedLength > expectedLength, return false.
    7. Assert: cachedLength is expectedLength.
    8. If iterator.[[Done]] is true, return true.
    9. Let iteratorResult be ? GetIteratorNthValueCached(iterator, cacheGroup, expectedLength).
    10. If iteratorResult is not-matched, return true.
    11. Return false.
    Editor's Note
    -

    This abstract operation is called at the final step of the evaluation of MatchList.

    +

    This abstract operation is called at the final step of the evaluation of MatchList.

    For example, when match with [], the expectedLength is 0. This abstract operation check if cachedLength is 0. @@ -2648,7 +3003,7 @@

    30.3.10 FinishListMatch ( subject,

    30.3.11 FinishMatch ( matchCompletion, cacheGroup )

    The abstract operation FinishMatch takes arguments matchCompletion (a Completion Record) and cacheGroup (a %Map%) and returns a Completion Record. It performs the following steps when called:

    -
    1. Assert: cacheGroup is created by CreateMatchCache and used internally for pattern-matching.
    2. If matchCompletion is a normal completion and matchCompletion.[[Value]] is not-matched, then
      1. Set matchCompletion to ThrowCompletion(a newly created TypeError).
    3. Let iterators be a new empty List.
    4. For each element value of ! Get(cacheGroup, "IteratorsToClose").[[SetData]], do
      1. Assert: value.[[Value]] is not empty.
      2. Let iteratorRecordObject be ! Get(value.[[Value]], "IteratorsToClose").
      3. Append iteratorRecordObject.[[CachedIterator]] to iterators.
    5. Let errors be a new empty List.
    6. If matchCompletion is an abrupt completion, append matchCompletion.[[Value]] to errors.
    7. For each element iterator of iterators, do
      1. If iterator.[[Done]] is false, then
        1. Let closeResult be Completion(IteratorClose(iterator, Completion(undefined))).
        2. If closeResult is an abrupt completion, append closeResult.[[Value]] to errors.
    8. If errors is not empty, then
      1. If length of errors is 1, return ThrowCompletion(errors[0]).
      2. Let error be a newly created AggregateError object.
      3. Perform ! DefinePropertyOrThrow(error, "errors", PropertyDescriptor { [[Configurable]]: true, [[Enumerable]]: false, [[Writable]]: true, [[Value]]: CreateArrayFromList(errors) }).
      4. Return ThrowCompletion(error).
    9. Return matchCompletion.
    +
    1. Assert: cacheGroup is created by CreateMatchCache and used internally for pattern-matching.
    2. If matchCompletion is a normal completion and matchCompletion.[[Value]] is not-matched, then
      1. Set matchCompletion to ThrowCompletion(a newly created TypeError).
    3. Let iterators be a new empty List.
    4. For each element value of ! Get(cacheGroup, "IteratorsToClose").[[SetData]], do
      1. Assert: value.[[Value]] is not empty.
      2. Let iteratorRecordObject be ! Get(value.[[Value]], "IteratorsToClose").
      3. Append iteratorRecordObject.[[CachedIterator]] to iterators.
    5. Let errors be a new empty List.
    6. If matchCompletion is an abrupt completion, append matchCompletion.[[Value]] to errors.
    7. For each element iterator of iterators, do
      1. If iterator.[[Done]] is false, then
        1. Let closeResult be Completion(IteratorClose(iterator, Completion(undefined))).
        2. If closeResult is an abrupt completion, append closeResult.[[Value]] to errors.
    8. If errors is not empty, then
      1. If length of errors is 1, return ThrowCompletion(errors[0]).
      2. Let error be a newly created AggregateError object.
      3. Perform ! DefinePropertyOrThrow(error, "errors", PropertyDescriptor { [[Configurable]]: true, [[Enumerable]]: false, [[Writable]]: true, [[Value]]: CreateArrayFromList(errors) }).
      4. Return ThrowCompletion(error).
    9. Return matchCompletion.
    Editor's Note

    If any error occurs when closing iterators, this abstract operation ignores the matchCompletion and return an abrupt completion. This might be problematic when the matchCompletion is a Return Completion, Continue Completion or a Break Completion.

    for (const value of iter) {
    @@ -2656,7 +3011,7 @@ 

    30.3.11 FinishMatch ( matchCompletion [...]: continue } }

    -

    In the code example above, if the only branch of the MatchStatement matches, but IteratorClose throws, the Continue Completion will be dropped and throw the error.

    +

    In the code example above, if the only branch of the MatchStatement matches, but IteratorClose throws, the Continue Completion will be dropped and throw the error.

    @@ -2668,7 +3023,10 @@

    A Grammar Summary

    A.1 Expressions

    - PrimaryExpression[Yield, Await] : + PrimaryExpression[Yield, Await] : + RegularExpressionLiteral + + MatchExpression[?Yield, ?Await] @@ -2764,7 +3122,7 @@

    A.2 Statements

    - +

    A.9 Patterns

    MatchPattern[Yield, Await] : @@ -2781,8 +3139,8 @@

    A.9 Patterns

    BindingPattern[?Yield, ?Await] - - RegularExpressionPattern + + RegularExpressionPattern[?Yield, ?Await] MemberExpressionPattern[?Yield, ?Await] @@ -2828,10 +3186,16 @@

    A.9 Patterns

    LetOrConst
    - - RegularExpressionPattern : + + RegularExpressionPattern[Yield, Await] : RegularExpressionLiteral + + RegularExpressionLiteral + ( + MatchList[?Yield, ?Await] + ) + MemberExpressionPattern[Yield, Await] : diff --git a/spec.emu b/spec.emu index 90294ec..3f57aa5 100644 --- a/spec.emu +++ b/spec.emu @@ -39,6 +39,9 @@ contributors: body.folded .fold { display: none; } + .show-ao-annotations a.e-user-code::before, .show-ao-annotations span.e-user-code::before { + display: inline-block; + } @@ -184,9 +187,49 @@ contributors:

    Syntax

    PrimaryExpression[Yield, Await] : + RegularExpressionLiteral MatchExpression[?Yield, ?Await] + +

    Regular Expression Literals

    + + +

    Static Semantics: Early Errors

    + PrimaryExpression : RegularExpressionLiteral +
      +
    • + It is a Syntax Error if IsValidRegularExpressionLiteral(|RegularExpressionLiteral|, *false*) is *false*. +
    • +
    +
    + + +

    + Static Semantics: IsValidRegularExpressionLiteral ( + _literal_: a |RegularExpressionLiteral| Parse Node, + _canCreateBinding_: a Boolean, + ): a Boolean +

    +
    +
    description
    +
    It determines if its argument is a valid regular expression literal.
    +
    + + 1. Let _flags_ be FlagText of _literal_. + 1. If _flags_ contains any code points other than `d`, `g`, `i`, `m`, `s`, `u`, `v`, or `y`, or if _flags_ contains any code point more than once, return *false*. + 1. If _flags_ contains `u`, let _u_ be *true*; else let _u_ be *false*. + 1. If _flags_ contains `v`, let _v_ be *true*; else let _v_ be *false*. + 1. Let _patternText_ be BodyText of _literal_. + 1. If _u_ is *false* and _v_ is *false*, then + 1. Let _stringValue_ be CodePointsToString(_patternText_). + 1. Set _patternText_ to the sequence of code points resulting from interpreting each of the 16-bit elements of _stringValue_ as a Unicode BMP code point. UTF-16 decoding is not applied to the elements. + 1. Let _parseResult_ be ParsePattern(_patternText_, _u_, _v_, _canCreateBinding_). + 1. If _parseResult_ is a Parse Node, return *true*; else return *false*. + +
    +
    +

    Match Expression

    See for PrimaryExpression : MatchExpression

    @@ -846,6 +889,218 @@ contributors:

    RegExp (Regular Expression) Objects

    + + +

    Patterns

    +

    Syntax

    + + Pattern[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups, NamedCaptureGroupsBindings] :: + Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] + + Disjunction[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups, NamedCaptureGroupsBindings] :: + Alternative[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] + Alternative[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] `|` Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] + + Alternative[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups, NamedCaptureGroupsBindings, NamedCaptureGroupsBindings] :: + [empty] + Alternative[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] Term[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] + + Term[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups, NamedCaptureGroupsBindings] :: + Assertion[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] + Atom[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] + Atom[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] Quantifier + + Assertion[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups, NamedCaptureGroupsBindings] :: + `^` + `$` + `\b` + `\B` + `(?=` Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] `)` + `(?!` Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] `)` + `(?<=` Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] `)` + `(?<!` Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] `)` + + Atom[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups, NamedCaptureGroupsBindings] :: + PatternCharacter + `.` + `\` AtomEscape[?UnicodeMode, ?NamedCaptureGroups] + CharacterClass[?UnicodeMode, ?UnicodeSetsMode] + `(` GroupSpecifier[?UnicodeMode, ?NamedCaptureGroupsBindings]? Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] `)` + `(?:` Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] `)` + + AtomEscape[UnicodeMode, NamedCaptureGroups] :: + DecimalEscape + CharacterClassEscape[?UnicodeMode] + CharacterEscape[?UnicodeMode] + [+NamedCaptureGroups] `k` GroupName[?UnicodeMode, ~NamedCaptureGroupsBindings] + + GroupSpecifier[UnicodeMode, NamedCaptureGroupsBindings] :: + `?` GroupName[?UnicodeMode, ?NamedCaptureGroupsBindings] + + GroupName[UnicodeMode, NamedCaptureGroupsBindings] :: + `<` RegExpIdentifierName[?UnicodeMode] `>` + [+NamedCaptureGroupsBindings] `<` VarOrLetOrConst Identifier `>` + + +

    A new syntax parameter *NamedCaptureGroupsBindings* has been added to the Regular Expression.

    +

    This feature can be removed.

    +
    
    +          when /(?<let first>\d\d\d)-(?<let second>\d\d\d)/: [first, second],
    +          // can be written as
    +          when /(?<first>\d\d\d)-(?<second>\d\d\d)/({ groups: { let first, let second } }):
    +            [first, second],
    +        
    +
    + +

    For simplicity, |Identifier| intead of |BindingIdentifier| is used. It's also possible to add [Yield, Await] to |Pattern|.

    +
    + + +

    Static Semantics: CapturingGroupName ( ): a String

    +
    +
    + + GroupName :: `<` RegExpIdentifierName `>` + + + 1. Let _idTextUnescaped_ be RegExpIdentifierCodePoints of |RegExpIdentifierName|. + 1. Return CodePointsToString(_idTextUnescaped_). + + + GroupName :: `<` VarOrLetOrConst Identifier `>` + + + 1. Let _idTextUnescaped_ be the first element of BoundNames of |Identifier|. + 1. Return CodePointsToString(_idTextUnescaped_). + +
    +
    + + +

    Abstract Operations for RegExp Creation

    + + +

    + RegExpCreate ( + _P_: an ECMAScript language value, + _F_: a String or *undefined*, + ): either a normal completion containing an Object or a throw completion +

    +
    +
    + + 1. Let _obj_ be ! RegExpAlloc(%RegExp%). + 1. Return ? RegExpInitialize(_obj_, _P_, _F_, *false*). + +
    + + +

    + RegExpInitialize ( + _obj_: an Object, + _pattern_: an ECMAScript language value, + _flags_: an ECMAScript language value, + _canCreateBinding_: a Boolean + ): either a normal completion containing an Object or a throw completion +

    +
    +
    + + 1. If _pattern_ is *undefined*, let _P_ be the empty String. + 1. Else, let _P_ be ? ToString(_pattern_). + 1. If _flags_ is *undefined*, let _F_ be the empty String. + 1. Else, let _F_ be ? ToString(_flags_). + 1. If _F_ contains any code unit other than *"d"*, *"g"*, *"i"*, *"m"*, *"s"*, *"u"*, *"v"*, or *"y"*, or if _F_ contains any code unit more than once, throw a *SyntaxError* exception. + 1. If _F_ contains *"i"*, let _i_ be *true*; else let _i_ be *false*. + 1. If _F_ contains *"m"*, let _m_ be *true*; else let _m_ be *false*. + 1. If _F_ contains *"s"*, let _s_ be *true*; else let _s_ be *false*. + 1. If _F_ contains *"u"*, let _u_ be *true*; else let _u_ be *false*. + 1. If _F_ contains *"v"*, let _v_ be *true*; else let _v_ be *false*. + 1. If _u_ is *true* or _v_ is *true*, then + 1. Let _patternText_ be StringToCodePoints(_P_). + 1. Else, + 1. Let _patternText_ be the result of interpreting each of _P_'s 16-bit elements as a Unicode BMP code point. UTF-16 decoding is not applied to the elements. + 1. Let _parseResult_ be ParsePattern(_patternText_, _u_, _v_, _canCreateBinding_). + 1. If _parseResult_ is a non-empty List of *SyntaxError* objects, throw a *SyntaxError* exception. + 1. Assert: _parseResult_ is a |Pattern| Parse Node. + 1. Set _obj_.[[OriginalSource]] to _P_. + 1. Set _obj_.[[OriginalFlags]] to _F_. + 1. Let _capturingGroupsCount_ be CountLeftCapturingParensWithin(_parseResult_). + 1. Let _rer_ be the RegExp Record { [[IgnoreCase]]: _i_, [[Multiline]]: _m_, [[DotAll]]: _s_, [[Unicode]]: _u_, [[UnicodeSets]]: _v_, [[CapturingGroupsCount]]: _capturingGroupsCount_ }. + 1. Set _obj_.[[RegExpRecord]] to _rer_. + 1. Set _obj_.[[RegExpMatcher]] to CompilePattern of _parseResult_ with argument _rer_. + 1. Perform ? Set(_obj_, *"lastIndex"*, *+0*𝔽, *true*). + 1. Return _obj_. + +
    + + +

    + Static Semantics: ParsePattern ( + _patternText_: a sequence of Unicode code points, + _u_: a Boolean, + _v_: a Boolean, + _canCreateBinding_: a Boolean + ): a Parse Node or a non-empty List of *SyntaxError* objects +

    +
    +
    + + 1. If _v_ is *true* and _u_ is *true*, then + 1. Let _parseResult_ be a List containing one or more *SyntaxError* objects. + 1. Else if _v_ is *true*, then + 1. If _canCreateBinding_ is *true*, let _parseResult_ be ParseText(_patternText_, |Pattern[+UnicodeMode, +UnicodeSetsMode, +NamedCaptureGroups, +NamedCaptureGroupsBindings]|). + 1. Else, Let _parseResult_ be ParseText(_patternText_, |Pattern[+UnicodeMode, +UnicodeSetsMode, +NamedCaptureGroups, ~NamedCaptureGroupsBindings]|). + 1. Else if _u_ is *true*, then + 1. If _canCreateBinding_ is *true*, let _parseResult_ be ParseText(_patternText_, |Pattern[+UnicodeMode, ~UnicodeSetsMode, +NamedCaptureGroups, +NamedCaptureGroupsBindings]|). + 1. Else, Let _parseResult_ be ParseText(_patternText_, |Pattern[+UnicodeMode, ~UnicodeSetsMode, +NamedCaptureGroups, ~NamedCaptureGroupsBindings]|). + 1. Else, + 1. If _canCreateBinding_ is *true*, let _parseResult_ be ParseText(_patternText_, |Pattern[~UnicodeMode, ~UnicodeSetsMode, +NamedCaptureGroups, +NamedCaptureGroupsBindings]|). + 1. Else, Let _parseResult_ be ParseText(_patternText_, |Pattern[~UnicodeMode, ~UnicodeSetsMode, +NamedCaptureGroups, ~NamedCaptureGroupsBindings]|). + 1. Return _parseResult_. + +
    +
    + + + 1. NOTE: Ignore ecmarkup warning: every call site of RegExpCreate asserts the return value is a normal completion; it should be refactored to not return a completion record at all. + 1. Return ? RegExpCreate(*""*, *""*). + + + +

    The RegExp Constructor

    + + +

    RegExp ( _pattern_, _flags_ )

    +

    This function performs the following steps when called:

    + + 1. Let _patternIsRegExp_ be ? IsRegExp(_pattern_). + 1. If NewTarget is *undefined*, then + 1. Let _newTarget_ be the active function object. + 1. If _patternIsRegExp_ is *true* and _flags_ is *undefined*, then + 1. Let _patternConstructor_ be ? Get(_pattern_, *"constructor"*). + 1. If SameValue(_newTarget_, _patternConstructor_) is *true*, return _pattern_. + 1. Else, + 1. Let _newTarget_ be NewTarget. + 1. If _pattern_ is an Object and _pattern_ has a [[RegExpMatcher]] internal slot, then + 1. Let _P_ be _pattern_.[[OriginalSource]]. + 1. If _flags_ is *undefined*, let _F_ be _pattern_.[[OriginalFlags]]. + 1. Else, let _F_ be _flags_. + 1. Else if _patternIsRegExp_ is *true*, then + 1. Let _P_ be ? Get(_pattern_, *"source"*). + 1. If _flags_ is *undefined*, then + 1. Let _F_ be ? Get(_pattern_, *"flags"*). + 1. Else, + 1. Let _F_ be _flags_. + 1. Else, + 1. Let _P_ be _pattern_. + 1. Let _F_ be _flags_. + 1. Let _O_ be ? RegExpAlloc(_newTarget_). + 1. Return ? RegExpInitialize(_O_, _P_, _F_, *false*). + +
    +
    +

    Properties of the RegExp Constructor

    @@ -869,13 +1124,18 @@ contributors: 1. Perform ? ValidateCustomMatcherHint(_hint_). 1. Let _regexp_ be *this* value. - 1. If _hint_ is *"boolean"*, return ? Call(%RegExp.prototype.test%, _regexp_, « _subject_ »). + 1. If _hint_ is *"boolean"*, return ? Call(? Get(_regexp_, *"test"*), _regexp_, « _subject_ »). 1. Let _isRegExp_ be ? IsRegExp(_regexp_). 1. If _isRegExp_ is *true*, then 1. Let _flags_ be ? Get(_regexp_, "flags"). 1. Perform ? RequireObjectCoercible(_flags_). - 1. If ? ToString(_flags_) contain *"g"*, return ? Call(%RegExp.prototype[@@matchAll]%, _regexp_, « _subject_ »). - 1. Let _result_ be ? Call(%RegExp.prototype[@@match]%, _regexp_, « _subject_ »). + 1. If ? ToString(_flags_) contains *g*, then + 1. Let _iterator_ be ? Call(? Get(_regexp_, @@matchAll), _regexp_, « _subject_ »). + 1. Let _array_ be ? Call(%Array.from%, %Array%, « _iterator_ »). + 1. If ! LengthOfArrayLike(_array_) is 0, return *false*. + 1. Return _array_. + 1. Let _result_ be ? Call(? Get(_regexp_, @@match), _regexp_, « _subject_ »). + 1. If _result_ is *null*, return *false*. 1. Return CreateArrayFromList(« _result_ »). @@ -893,6 +1153,9 @@ contributors: The *"flags"* property in this algorithm is accessed twice, this is not ideal. Another access is in or depends on if the _regexp_ has the *g* flag. + + When matching with an RegExp that *"flags"* contains *"g"*, both and is called, this is not ideal. +
    @@ -1175,7 +1438,7 @@ contributors: `(` MatchPattern[?Yield, ?Await] `)` PrimitivePattern BindingPattern[?Yield, ?Await] - RegularExpressionPattern + RegularExpressionPattern[?Yield, ?Await] MemberExpressionPattern[?Yield, ?Await] ObjectPattern[?Yield, ?Await] ArrayPattern[?Yield, ?Await] @@ -1242,8 +1505,9 @@ contributors: - RegularExpressionPattern : + RegularExpressionPattern[Yield, Await] : RegularExpressionLiteral + RegularExpressionLiteral `(` MatchList[?Yield, ?Await] `)`
    
    @@ -1580,6 +1844,15 @@ contributors:
         
           

    Static Semantics: Early Errors

    + + + PrimitivePattern : NoSubstitutionTemplate + +
      +
    • It is a Syntax Error |NoSubstitutionTemplate| Contains |NotEscapeSequence|.
    • +
    + + MatchProperty : @@ -1649,6 +1922,19 @@ contributors:
    + + + RegularExpressionPattern : + RegularExpressionLiteral + RegularExpressionLiteral `(` MatchList `)` + +
      +
    • It is a Syntax Error if IsValidRegularExpressionLiteral(|RegularExpressionLiteral|, *true*) is *false*.
    • +
    • It is a Syntax Error if RegularExpressionLiteral of |RegularExpressionLiteral| does not contain *"g"*.
    • +
    • This early error should be added after Normative: allow duplicate named capture groups lands:
      It is a Syntax Error if for any name _x_, some of the |GroupSpecifier| are using the production that has |VarOrLetOrConst| and some of the |GroupSpecifier| don't.
    • +
    + + CombinedMatchPattern : @@ -1690,7 +1976,7 @@ contributors:

    - IsOptionalPattern (): a Boolean. + Static Semantics: IsOptionalPattern (): a Boolean.

    @@ -1857,16 +2143,108 @@ contributors:
    - RegularExpressionPattern : RegularExpressionLiteral + RegularExpressionPattern : + RegularExpressionLiteral + RegularExpressionLiteral `(` MatchList? `)` + 1. Assert: The following steps will not trigger any user code. + 1. If _subject_ is not a String, return *false*. 1. Let _pattern_ be CodePointsToString(BodyText of |RegularExpressionLiteral|). 1. Let _flags_ be CodePointsToString(FlagText of |RegularExpressionLiteral|). - 1. Let _regexp_ be ! RegExpCreate(_pattern_, _flags_). - 1. Let _result_ be ? InvokeCustomMatcher(_regexp_, _subject_, _cacheGroup_, ~boolean~, *null*). - 1. Assert: _result_ is a Boolean. - 1. Return _result_. + 1. Let _regexp_ be ! RegExpAlloc(%RegExp%). + 1. Perform ! RegExpInitialize(_regexp_, _pattern_, _flags_, *true*). + 1. Perform ! CreateDataPropertyOrThrow(_regexp_, *"exec"*, %RegExp.prototype.exec%). + 1. NOTE: This is to prevent the *"exec"* method on the prototype to be replaced. RegExpExec will call it. + 1. Let _match_ be ! RegExpExec(_regexp_, _subject_). + 1. If _match_ is *null*, return *false*. + 1. Let _result_ be an empty List of ECMAScript language values. + 1. If _flags_ contains *"u"* or _flags_ contains *"v"*, let _fullUnicode_ be *true*. + 1. Else, let _fullUnicode_ be *false*. + 1. Repeat, until _match_ is *null*, + 1. Let _matchStr_ be ! ToString(! Get(_match_, *"0"*)). + 1. If _matchStr_ is the empty String, then + 1. Let _thisIndex_ be ℝ(! ToLength(! Get(_regexp_, *"lastIndex"*))). + 1. Let _nextIndex_ be AdvanceStringIndex(_subject_, _thisIndex_, _fullUnicode_). + 1. Perform ! Set(_regexp_, *"lastIndex"*, 𝔽(_nextIndex_), *true*). + 1. Append _match_ to _result_. + 1. TODO: This section is not written in the spec language yet. + 1. Let _groups_ be ! Get(_match_, *"groups"*). + 1. Let _namedGroups_ be ! GetOwnPropertyKeys(_groups_, ~string~). + 1. For each String _s_ of _namedGroups_, do + 1. Let _parseNode_ be the Parse Node within the |RegularExpressionLiteral| that CapturingGroupName of this Parse Node is _s_. + 1. Assert: _parseNode_ is present and is a |GroupSpecifier|. + 1. If |GroupName| of |GroupSpecifier| is GroupName : < VarOrLetOrConst Identifier >, then + 1. Initialize variable _s_ with subject with the semantics of `var`, `let` or `const` based on |VarOrLetOrConst|. + 1. Set _match_ to ! RegExpExec(_regexp_, _subject_). + 1. Let _resultArray_ be CreateArrayFromList(_result_). + 1. NOTE: "The following steps will not trigger any user code" ends here. + 1. If |RegularExpressionPattern| is RegularExpressionPattern : RegularExpressionLiteral `(` MatchList `)`, then + 1. Return ? ListPatternMatches of |MatchList| with arguments _resultArray_ and _cacheGroup_. + 1. Return *true*. + +

    In order to create binding without triggering user code, we're not calling and making the behaviour unforgeable.

    +

    Contrast to call directly, this syntax-directed operation skipped the following user code:

    +
      +
    • + get and call +
        +
      • + get and call +
          +
        • + RegExpExec +
            +
          • get
          • +
          +
        • +
        +
      • +
      • + get and call +
          +
        • get
        • +
        • + RegExpExec +
            +
          • get
          • +
          +
        • +
        +
      • +
      • + get and call +
          +
        • + SpeciesConstructor +
            +
          • get
          • +
          • get
          • +
          +
        • +
        • get
        • +
        • + Call +
            +
          • IsRegExp
          • +
              +
            • get
            • +
            +
          +
        • +
        • + RegExpExec +
            +
          • get
          • +
          +
        • +
        +
      • +
      +
    • +
    +
    @@ -2869,7 +3247,7 @@ contributors:
    - +

    Patterns

    From fe9fa8434b089a37612e6bc302552b19e562d3c4 Mon Sep 17 00:00:00 2001 From: Jack-Works Date: Fri, 17 Nov 2023 16:55:36 +0000 Subject: [PATCH 45/71] fixup: [spec] `npm run build` --- assets/ecmarkup.css | 69 +++++++++++++++++++++++++++++++++++++-------- assets/ecmarkup.js | 37 ++++++++++++++++++++---- index.html | 8 ++++-- 3 files changed, 94 insertions(+), 20 deletions(-) diff --git a/assets/ecmarkup.css b/assets/ecmarkup.css index 630a302..2bd77c0 100644 --- a/assets/ecmarkup.css +++ b/assets/ecmarkup.css @@ -894,26 +894,68 @@ tr.del > td { display: block; } +#menu-pins .unpin-all { + border: none; + background: #ccc; + border-radius: 4px; + height: 18px; + font-size: 12px; + margin: 0 5px 0 10px; + font-family: IBM Plex Sans; +} +#menu-pins .unpin-all:hover { + background: #ddd; +} + #menu-pins-list { margin: 0; padding: 0; counter-reset: pins-counter; } +#menu-pins-list > li { + display: flex; + align-items: stretch; + gap: 4px; + margin: 3px 1px; + border-radius: 4px; +} + +#menu-pins-list > li > a { + flex-grow: 1; + align-self: center; +} + +#menu-pins-list > li:before, +#menu-pins-list > li > .unpin { + flex-shrink: 0; + flex-grow: 0; + text-align: center; + padding: 1px 3px; + border-radius: 4px; + background: none; + border: none; +} +#menu-pins-list > li:before, +#menu-pins-list > li > .unpin:hover { + background: #ccc; +} + +#menu-pins-list > li > .unpin, +#menu-pins .unpin-all { + cursor: pointer; +} +#menu-pins-list > li > .unpin:hover, +#menu-pins .unpin-all:hover { + color: #bb1212; +} + #menu-pins-list > li:before { content: counter(pins-counter); counter-increment: pins-counter; - display: inline-block; - width: 25px; - text-align: center; - border: 1px solid #bbb; - padding: 2px; - margin: 4px; - box-sizing: border-box; - line-height: 1em; - background-color: #ccc; - border-radius: 4px; + font-size: 16px; } + #menu-toc > ol { padding: 0; flex-grow: 1; @@ -1010,7 +1052,6 @@ tr.del > td { flex-grow: 0; flex-shrink: 0; font-size: 80%; - cursor: row-resize; user-select: none; } @@ -1285,12 +1326,16 @@ li.menu-search-result-term:before { flex-direction: column; } +#references-pane > .menu-pane-header { + cursor: row-resize; +} + #references-pane-container.active { display: flex; } #references-pane-close:after { - content: '✖'; + content: '\2716'; float: right; cursor: pointer; } diff --git a/assets/ecmarkup.js b/assets/ecmarkup.js index 2b5375e..3ab1005 100644 --- a/assets/ecmarkup.js +++ b/assets/ecmarkup.js @@ -350,6 +350,14 @@ function Menu() { this._pinnedIds = {}; this.loadPinEntries(); + // unpin all button + document + .querySelector('#menu-pins .unpin-all') + .addEventListener('click', this.unpinAll.bind(this)); + + // individual unpinning buttons + this.$pinList.addEventListener('click', this.pinListClick.bind(this)); + // toggle menu this.$toggle.addEventListener('click', this.toggle.bind(this)); @@ -399,8 +407,8 @@ Menu.prototype.documentKeydown = function (e) { e.stopPropagation(); if (e.keyCode === 80) { this.togglePinEntry(); - } else if (e.keyCode > 48 && e.keyCode < 58) { - this.selectPin(e.keyCode - 49); + } else if (e.keyCode >= 48 && e.keyCode < 58) { + this.selectPin((e.keyCode - 9) % 10); } }; @@ -562,6 +570,7 @@ Menu.prototype.addPinEntry = function (id) { return; } + let text; if (entry.type === 'clause') { let prefix; if (entry.number) { @@ -570,11 +579,14 @@ Menu.prototype.addPinEntry = function (id) { prefix = ''; } // prettier-ignore - this.$pinList.innerHTML += `
  • ${prefix}${entry.titleHTML}
  • `; + text = `${prefix}${entry.titleHTML}`; } else { - this.$pinList.innerHTML += `
  • ${getKey(entry)}
  • `; + text = getKey(entry); } + let link = `${text}`; + this.$pinList.innerHTML += `
  • ${link}
  • `; + if (Object.keys(this._pinnedIds).length === 0) { this.showPins(); } @@ -583,7 +595,7 @@ Menu.prototype.addPinEntry = function (id) { }; Menu.prototype.removePinEntry = function (id) { - let item = this.$pinList.querySelector(`a[href="${makeLinkToId(id)}"]`).parentNode; + let item = this.$pinList.querySelector(`li[data-section-id="${id}"]`); this.$pinList.removeChild(item); delete this._pinnedIds[id]; if (Object.keys(this._pinnedIds).length === 0) { @@ -593,6 +605,21 @@ Menu.prototype.removePinEntry = function (id) { this.persistPinEntries(); }; +Menu.prototype.unpinAll = function () { + for (let id of Object.keys(this._pinnedIds)) { + this.removePinEntry(id); + } +}; + +Menu.prototype.pinListClick = function (event) { + if (event?.target?.classList.contains('unpin')) { + let id = event.target.parentNode.dataset.sectionId; + if (id) { + this.removePinEntry(id); + } + } +}; + Menu.prototype.persistPinEntries = function () { try { if (!window.localStorage) return; diff --git a/index.html b/index.html index 79275d0..1a4cf08 100644 --- a/index.html +++ b/index.html @@ -3,16 +3,18 @@ -Pattern Matching
    +Pattern Matching
    • Toggle shortcuts help?
    • Toggle "can call user code" annotationsu
    • Jump to search box/
    • +
    • Toggle pinning of the current clausep
    • +
    • Jump to nth pin1-9

    Stage 1 Draft / November 17, 2023

    Pattern Matching

    - -

    1 Welcome

    -

    Work in progress. Before continuing, please read the Editor's notes.

    -

    Most of built-in matchers are folded.

    -

    - -
    + +

    Welcome

    + + +

    TODOs

    + +
    + + +

    Introduction

    +

    This specification consists of the following parts:

    + +

    + Trivia built-in matchers are folded. + Click to not show the trivia sections. +

    + +
    + + +

    Layering

    +

    The pattern-matching champion group designed this proposal with a layering approach. It does not mean the proposal is an MVP. The champion group wishes to ship the proposal as a whole when possible, but we can drop some features if there is strong pushback from the committee.

    +

    This approach allows the champion group to consider how all features combine and also how the proposal should behave if any of the features are missing.

    +

    A feature will have a note if

    +
      +
    • it is a convenient feature instead of a necessary feature.
    • +
    • not all champion group members represent the hope to include it.
    • +
    +
    +

    4 Overview

    4.5 Organization of This Specification

    -

    Clause 30 describes the pattern-matching feature.

    +

    Clause 30 describes the pattern-matching feature.

    6 ECMAScript Data Types and Values

    +

    6.1 ECMAScript Language Types

    6.1.5 The Symbol Type

    +

    6.1.5.1 Well-Known Symbols

    Table 1: Well-known Symbols
    @@ -99,17 +176,21 @@

    6.1.5.1 Well-Known Symbols

    +

    6.1.7 Object Internal Methods and Internal Slots

    -

    All objects have an internal slot named [[ConstructedBy]], which is a List of ECMAScript language values. This List represents the origin of the object. Initially, it is an empty List.

    +

    All objects have an internal slot named [[ConstructedBy]], which is a List of ECMAScript language values. + This List represents the origin of the object. Initially, it is an empty List.

    7 Abstract Operations

    +

    7.3 Operations on Objects

    +

    7.3.34 InitializeInstanceElements ( O, constructor )

    The abstract operation InitializeInstanceElements takes arguments O (an Object) and constructor (an ECMAScript function object) and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:

    @@ -219,7 +300,7 @@

    8.6 Miscellaneous

    8.6.2 Runtime Semantics: BindingInitialization

    -

    The syntax-directed operation BindingInitialization takes arguments value (an ECMAScript language value) and environment (an Environment Record or undefined) and returns either a normal completion containing unused or an abrupt completion.

    +

    The syntax-directed operation BindingInitialization takes arguments value (an ECMAScript language value) and environment (an Environment Record or undefined) and returns either a normal completion containing unused or an abrupt completion.

    Editor's Note
    TODO: Scope Analysis.
    @@ -237,13 +318,13 @@

    8.6.3 Runtime Semantics: IteratorBindingInitiali

    9 Executable Code and Execution Contexts

    +

    9.10 Processing Model of WeakRef and FinalizationRegistryweakly hold Targets

    +

    9.10.3 Execution

    -

    At any time, if a set of objects and/or symbols S is not live, an ECMAScript implementation may perform the following steps atomically:

    -
    1. For each element value of S, do
      1. For each WeakRef ref such that ref.[[WeakRefTarget]] is value, do
        1. Set ref.[[WeakRefTarget]] to empty.
      2. For each FinalizationRegistry fg such that fg.[[Cells]] contains a Record cell such that cell.[[WeakRefTarget]] is value, do
        1. Set cell.[[WeakRefTarget]] to empty.
        2. Optionally, perform HostEnqueueFinalizationRegistryCleanupJob(fg).
      3. For each WeakMap map such that map.[[WeakMapData]] contains a Record r such that r.[[Key]] is value, do
        1. Set r.[[Key]] to empty.
        2. Set r.[[Value]] to empty.
      4. For each WeakSet set such that set.[[WeakSetData]] contains value, do
        1. Replace the element of set.[[WeakSetData]] whose value is value with an element whose value is empty.
      5. For each Object o such that o.[[ConstructedBy]] contains value, do
        1. Remove value from o.[[ConstructedBy]].
    @@ -251,18 +332,20 @@

    9.10.3 Execution

    12 ECMAScript Language: Lexical Grammar

    +

    12.10 Automatic Semicolon Insertion

    +

    12.10.1 Rules of Automatic Semicolon Insertion

    Note

    The following are the additions of the restricted productions in the grammar:

    RelationalExpression[In, Yield, Await] : - RelationalExpression + RelationalExpression [no LineTerminator here] is - MatchPattern + MatchPattern @@ -270,7 +353,7 @@

    12.10.1 Rules of Automatic Semicolon InsertionCoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] [no LineTerminator here] { - MatchExpressionClauses[?Yield, ?Await] + MatchExpressionClauses[?Yield, ?Await] ; } @@ -280,7 +363,7 @@

    12.10.1 Rules of Automatic Semicolon InsertionCoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] [no LineTerminator here] { - MatchStatementClauses[?Yield, ?Await] + MatchStatementClauses[?Yield, ?Await] ; } @@ -300,13 +383,15 @@

    12.10.1 Rules of Automatic Semicolon Insertion

    12.10.3 Interesting Cases of Automatic Semicolon Insertion

    +

    12.10.3.2 Cases of Automatic Semicolon Insertion and “[no LineTerminator here]”

    +

    12.10.3.2.1 List of Grammar Productions with Optional Operands and “[no LineTerminator here]”

    @@ -316,6 +401,7 @@

    12.10.3.2.1 List of Grammar Productions with Opt

    13 ECMAScript Language: Expressions

    +

    13.2 Primary Expression

    Syntax

    @@ -324,7 +410,7 @@

    Syntax

    RegularExpressionLiteral - MatchExpression[?Yield, ?Await] + MatchExpression[?Yield, ?Await] @@ -340,7 +426,7 @@

    13.2.7.1 Static Semantics: Early Errors

    @@ -348,51 +434,54 @@

    13.2.7.1 Static Semantics: Early Errors

    13.2.7.2 Static Semantics: IsValidRegularExpressionLiteral ( literal, canCreateBinding )

    The abstract operation IsValidRegularExpressionLiteral takes arguments literal (a RegularExpressionLiteral Parse Node) and canCreateBinding (a Boolean) and returns a Boolean. It determines if its argument is a valid regular expression literal. It performs the following steps when called:

    -
    1. Let flags be FlagText of literal.
    2. If flags contains any code points other than d, g, i, m, s, u, v, or y, or if flags contains any code point more than once, return false.
    3. If flags contains u, let u be true; else let u be false.
    4. If flags contains v, let v be true; else let v be false.
    5. Let patternText be BodyText of literal.
    6. If u is false and v is false, then
      1. Let stringValue be CodePointsToString(patternText).
      2. Set patternText to the sequence of code points resulting from interpreting each of the 16-bit elements of stringValue as a Unicode BMP code point. UTF-16 decoding is not applied to the elements.
    7. Let parseResult be ParsePattern(patternText, u, v, canCreateBinding).
    8. If parseResult is a Parse Node, return true; else return false.
    +
    1. Let flags be FlagText of literal.
    2. If flags contains any code points other than d, g, i, m, s, u, v, or y, or if flags contains any code point more than once, return false.
    3. If flags contains u, let u be true; else let u be false.
    4. If flags contains v, let v be true; else let v be false.
    5. Let patternText be BodyText of literal.
    6. If u is false and v is false, then
      1. Let stringValue be CodePointsToString(patternText).
      2. Set patternText to the sequence of code points resulting from interpreting each of the 16-bit elements of stringValue as a Unicode BMP code point. UTF-16 decoding is not applied to the elements.
    7. Let parseResult be ParsePattern(patternText, u, v, canCreateBinding).
    8. If parseResult is a Parse Node, return true; else return false.

    13.2.10 Match Expression

    -

    See Match Expression for - PrimaryExpression : MatchExpression +

    See The match Expression for + PrimaryExpression : MatchExpression

    +

    13.10 Relational Operators

    Syntax

    RelationalExpression[In, Yield, Await] : - RelationalExpression[?In, ?Yield, ?Await] + RelationalExpression[?In, ?Yield, ?Await] [no LineTerminator here] is - MatchPattern[?Yield, ?Await] + MatchPattern[?Yield, ?Await] + Note
    +
    const isOk = response is { ok: true, status: > 200 and < 400 };
    +
    + Editor's Note
    + This feature can be replaced by the The match Expression. + The code example above can be written as: +
    const isOk = match (response) {
    +  { ok: true, status: > 200 and < 400 }: true,
    +  default: false
    +};
    +
    +

    13.10.1 Runtime Semantics: Evaluation

    RelationalExpression : - RelationalExpression + RelationalExpression is - MatchPattern + MatchPattern -
    1. Let lref be ? Evaluation of RelationalExpression.
    2. Let lval be ? GetValue(lref).
    3. Let cacheGroup be CreateMatchCache().
    4. Let matchCompletion be ? MatchPatternMatches of MatchPattern with argument lval and cacheGroup.
    5. If matchCompletion is a normal completion, then
      1. If matchCompletion.[[Value]] is not-matched, set matchCompletion to NormalCompletion(false).
      2. Else, set matchCompletion to NormalCompletion(true).
    6. Let result be Completion(FinishMatch(matchCompletion, cacheGroup)).
    7. Assert: result is a normal completion or an abrupt completion.
    8. Return result.
    - Note
    -
    expr is { length: 10, 0: "a" };
    -
    - Editor's Note
    - This production can be replaced by the Match Expression. The code example above can be written as: -
    (match (expr) {
    -  { length: 10, 0: "a" }: true,
    -  default: false
    -})
    -
    +
    1. Let lref be ? Evaluation of RelationalExpression.
    2. Let lval be ? GetValue(lref).
    3. Let cacheGroup be CreateMatchCache().
    4. Let matchCompletion be ? MatchPatternMatches of MatchPattern with argument lval and cacheGroup.
    5. If matchCompletion is a normal completion, then
      1. If matchCompletion.[[Value]] is not-matched, set matchCompletion to NormalCompletion(false).
      2. Else, set matchCompletion to NormalCompletion(true).
    6. Let result be Completion(FinishMatch(matchCompletion, cacheGroup)).
    7. Assert: result is a normal completion or an abrupt completion.
    8. Return result.
    @@ -402,7 +491,7 @@

    14 ECMAScript Language: Statements and Declarati

    Syntax

    Statement[Yield, Await, Return] : - MatchStatement[?Yield, ?Await, ?Return] + MatchStatement[?Yield, ?Await, ?Return] @@ -413,19 +502,16 @@

    14.7 Iteration Statements

    14.7.1 The for-in, for-of, and for-await-of Statements

    Editor's Note
    - It's possible to add pattern-matching to the for iteration statements. It might looks like this: -
    for (const item of items) {
    -  if (item is { kind: "foo", let data }) {
    -    // ...
    +        It is possible to add pattern-matching to the for iteration statements. It might look like this:
    +        
    for (const response of responses) {
    +  if (item is { ok: true, let body }) {
       }
     }
     // can be written as
    -for (const item is { kind: "foo", let data } of items) {
    -  // ...
    +for (const response is { ok: true, let body } of responses) {
     }
     // or
    -for (const item of items matches { kind: "foo", let data }) {
    -  // ...
    +for (const response of responses matches { ok: true, let body }) {
     }
    @@ -434,29 +520,37 @@

    14.7.1 The for-in,

    14.14 The try Statement

    Editor's Note
    - It's possible to add pattern-matching to the try statement. It might looks like this: + It is possible to add pattern-matching to the try statement. It might look like this:
    try { }
    -catch (e is { message: /network/ }) {
    -  // ...
    +catch (error) {
    +  if (error is { message: /JSON/ }) { return null; }
    +  throw error;
     }
    -catch (e) {}
    +// can be written as +try { } +catch (error is { message: /JSON/ }) { return null; } +// unmatched error will be re-thrown.

    14.17 The match Statement

    - See 30.2. + See 30.2.

    15 ECMAScript Language: Functions and Classes

    +

    15.7 Class Definitions

    +

    15.7.14 Runtime Semantics: ClassDefinitionEvaluation

    The syntax-directed operation ClassDefinitionEvaluation takes arguments classBinding (a String or undefined) and className (a property key or a Private Name) and returns either a normal completion containing a function object or an abrupt completion.

    - Editor's Note + Editor's Note
    @@ -468,51 +562,46 @@

    15.10.2 Static Semantics: HasCallInTailPosition<

    The syntax-directed operation HasCallInTailPosition takes argument call (a CallExpression Parse Node, a MemberExpression Parse Node, or an OptionalChain Parse Node) and returns a Boolean. It is defined piecewise over the following productions:

    RelationalExpression : - RelationalExpression + RelationalExpression is - MatchPattern + MatchPattern
    1. Return false.
    - - PrimaryExpression : MatchExpression + PrimaryExpression : MatchExpression -
    1. Return HasCallInTailPosition of MatchExpression with argument call.
    - +
    1. Return HasCallInTailPosition of MatchExpression with argument call.
    MatchExpression : CoverCallExpressionAndAsyncArrowHead { - MatchExpressionClauses + MatchExpressionClauses ; } -
    1. Return HasCallInTailPosition of MatchExpressionClauses with argument call.
    - +
    1. Return HasCallInTailPosition of MatchExpressionClauses with argument call.
    - MatchExpressionClauses : MatchExpressionClause + MatchExpressionClauses : MatchExpressionClause -
    1. Return HasCallInTailPosition of MatchExpressionClause with argument call.
    - +
    1. Return HasCallInTailPosition of MatchExpressionClause with argument call.
    MatchExpressionClauses : - MatchExpressionClauses + MatchExpressionClauses ; - MatchExpressionClause + MatchExpressionClause -
    1. Let result be HasCallInTailPosition of MatchExpressionClauses with argument call.
    2. If result is true, return true.
    3. Return HasCallInTailPosition of MatchExpressionClause with argument call.
    - +
    1. Let result be HasCallInTailPosition of MatchExpressionClauses with argument call.
    2. If result is true, return true.
    3. Return HasCallInTailPosition of MatchExpressionClause with argument call.
    MatchExpressionClauses : - MatchExpressionClauses + MatchExpressionClauses ; default : @@ -520,8 +609,7 @@

    15.10.2 Static Semantics: HasCallInTailPosition< -
    1. Let result be HasCallInTailPosition of MatchExpressionClauses with argument call.
    2. If result is true, return true.
    3. Return HasCallInTailPosition of Expression with argument call.
    - +
    1. Let result be HasCallInTailPosition of MatchExpressionClauses with argument call.
    2. If result is true, return true.
    3. Return HasCallInTailPosition of Expression with argument call.
    MatchExpressionClauses : default @@ -530,49 +618,44 @@

    15.10.2 Static Semantics: HasCallInTailPosition< -
    1. Return HasCallInTailPosition of Expression with argument call.
    - +
    1. Return HasCallInTailPosition of Expression with argument call.
    MatchExpressionClause : - MatchPattern + MatchPattern : Expression -
    1. Return HasCallInTailPosition of Expression with argument call.
    - +
    1. Return HasCallInTailPosition of Expression with argument call.
    MatchStatement : CoverCallExpressionAndAsyncArrowHead { - MatchStatementClauses + MatchStatementClauses ; } -
    1. Return HasCallInTailPosition of MatchStatementClauses with argument call.
    - +
    1. Return HasCallInTailPosition of MatchStatementClauses with argument call.
    - MatchStatementClauses : MatchStatementClause + MatchStatementClauses : MatchStatementClause -
    1. Return HasCallInTailPosition of MatchStatementClause with argument call.
    - +
    1. Return HasCallInTailPosition of MatchStatementClause with argument call.
    MatchStatementClauses : - MatchStatementClauses + MatchStatementClauses ; - MatchStatementClause + MatchStatementClause -
    1. Let result be HasCallInTailPosition of MatchStatementClauses with argument call.
    2. If result is true, return true.
    3. Return HasCallInTailPosition of MatchStatementClause with argument call.
    - +
    1. Let result be HasCallInTailPosition of MatchStatementClauses with argument call.
    2. If result is true, return true.
    3. Return HasCallInTailPosition of MatchStatementClause with argument call.
    MatchStatementClauses : - MatchStatementClauses + MatchStatementClauses ; default : @@ -580,8 +663,7 @@

    15.10.2 Static Semantics: HasCallInTailPosition< -
    1. Let result be HasCallInTailPosition of MatchStatementClauses with argument call.
    2. If result is true, return true.
    3. Return HasCallInTailPosition of Statement with argument call.
    - +
    1. Let result be HasCallInTailPosition of MatchStatementClauses with argument call.
    2. If result is true, return true.
    3. Return HasCallInTailPosition of Statement with argument call.
    MatchStatementClauses : default @@ -590,110 +672,141 @@

    15.10.2 Static Semantics: HasCallInTailPosition< -
    1. Return HasCallInTailPosition of Statement with argument call.
    - +
    1. Return HasCallInTailPosition of Statement with argument call.
    MatchStatementClause : - MatchPattern + MatchPattern : Statement -
    1. Return HasCallInTailPosition of Statement with argument call.
    +
    1. Return HasCallInTailPosition of Statement with argument call.

    20 Fundamental Objects

    +

    20.1 Object Objects

    +

    20.1.2 Properties of the Object Constructor

    +

    20.1.2.24 Object [ @@customMatcher ] ( subject, hint )

    This function performs the following steps when called:

    -
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If subject is not an Object, return false.
    3. Return true.
    +
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If subject is not an Object, return false.
    3. Return true.
    +

    20.2 Function Objects

    +

    20.2.2 Properties of the Function Constructor

    +

    20.2.2.2 Function [ @@customMatcher ] ( subject, hint )

    This function performs the following steps when called:

    -
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. Return IsCallable(subject).
    +
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. Return IsCallable(subject).
    +

    20.2.3 Properties of the Function Prototype Object

    +

    20.2.3.7 Function.prototype [ @@customMatcher ] ( subject, hint, receiver )

    This function performs the following steps when called:

    -
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. Let func be the this value.
    3. If IsCallable(func) is false, throw a TypeError exception.
    4. If subject.[[ConstructedBy]] contains func, return true.
    5. If func does not have a [[IsClassConstructor]] internal slot or func.[[IsClassConstructor]] is false, return ? Call(func, receiver, « subject, hint »).
    6. Return false.
    - Note
    -
    class C {}
    -new C() is C; // true, by private-field semantics
    -
    -function f() {}
    -class F extends f {}
    -const i = new F();
    -i is F; // true, by private-field semantics
    -i is f; // true, by private-field semantics even if f is a normal function
    -
    -expr is Array.isArray; // true, by Array.isArray(expr)
    +
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. Let func be the this value.
    3. If IsCallable(func) is false, throw a TypeError exception.
    4. If subject.[[ConstructedBy]] contains func, return true.
    5. If func does not have a [[IsClassConstructor]] internal slot or func.[[IsClassConstructor]] is false, return ? Call(func, receiver, « subject, hint »).
    6. Return false.
    + Note
    // For non-class functions.
    +expr is Array.isArray; // true, by Array.isArray(expr)
    +
    +// For objects created by `new`, it uses private-field-like semantics.
    +class MyError extends Error {}
    +const myError = new C();
    +myError is MyError; // true
    +myError is Error; // true
    +Object.create(MyError.prototype) is MyError; // false
    +
    +// Also works for normal functions
    +function ES5StyleClass() {}
    +new ES5StyleClass() is ES5StyleClass; // true
    +Object.create(ES5StyleClass.prototype) is ES5StyleClass; // false
    + Editor's Note
    +

    This does not work with ES5 style class inherit.

    +
    function MyError() {
    +  Error.call(this);
    +}
    +MyError.prototype = Object.create(Error.prototype);
    +var error = new MyError();
    +error is MyError; // true
    +error is Error; // false
    Editor's Note
    - Not every champion group agrees with private-field-like brand check semantics. - There are - performance concerns, - "hackable" concerns, and - interaction with @@hasInstance concerns. - Another approach is to use the instanceof semantics. +

    Not everyone in the champion group agrees with private-field-like brand check semantics.

    +

    + There are + performance concerns, + "hackable" concerns, and + interaction with @@hasInstance concerns. +

    +

    Another approach is to use the instanceof semantics.

    +

    20.3 Boolean Objects

    +

    20.3.2 Properties of the Boolean Constructor

    +

    20.3.2.2 Boolean [ @@customMatcher ] ( subject, hint )

    This function performs the following steps when called:

    -
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. If subject is not a Boolean and does not have a [[BooleanData]] internal slot, return false.
    3. If hint is "boolean", return true.
    4. If subject is a Boolean, return CreateArrayFromListsubject »).
    5. Return CreateArrayFromListsubject.[[BooleanData]] »).
    +
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. If subject is not a Boolean and does not have a [[BooleanData]] internal slot, return false.
    3. If hint is "boolean", return true.
    4. If subject is a Boolean, return CreateArrayFromListsubject »).
    5. Return CreateArrayFromListsubject.[[BooleanData]] »).
    Editor's Note
    - Another approach is to ignore boxed primitives and only matches on primitive values. + Another approach is to ignore boxed primitives and only match primitive values.
    +

    20.4 Symbol Objects

    +

    20.4.2 Properties of the Symbol Constructor

    +

    20.4.2.17 Symbol.customMatcher

    -

    The initial value of Symbol.customMatcher is the well-known symbol @@customMatcher (Table 1).

    +

    The initial value of Symbol.customMatcher is the well-known symbol @@customMatcher (Table 1).

    This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.

    +

    20.4.2.18 Symbol [ @@customMatcher ] ( subject, hint )

    This function performs the following steps when called:

    -
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. If subject is not a Symbol and does not have a [[SymbolData]] internal slot, return false.
    3. If hint is "boolean", return true.
    4. If subject is a Symbol, return CreateArrayFromListsubject »).
    5. Return CreateArrayFromListsubject.[[SymbolData]] »).
    +
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. If subject is not a Symbol and does not have a [[SymbolData]] internal slot, return false.
    3. If hint is "boolean", return true.
    4. If subject is a Symbol, return CreateArrayFromListsubject »).
    5. Return CreateArrayFromListsubject.[[SymbolData]] »).
    Editor's Note
    - Another approach is to ignore boxed primitives and only matches on primitive values. + Another approach is to ignore boxed primitives and only match primitive values.
    +

    20.5 Error Objects

    +

    20.5.1 The Error Constructor

    +

    20.5.1.1 Error ( message [ , options ] )

    This function performs the following steps when called:

    @@ -703,29 +816,32 @@

    20.5.1.1 Error ( message [ , opt

    20.5.2 Properties of the Error Constructor

    +

    20.5.2.2 Error [ @@customMatcher ] ( subject, hint )

    This function performs the following steps when called:

    -
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If subject does not have a [[ErrorData]] internal slot, return false.
    3. Return true.
    +
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If subject does not have a [[ErrorData]] internal slot, return false.
    3. Return true.
    Editor's Note
    - It's possible to provide extractor semantics for Error custom matchers. -
    when Error(let message, { let cause? }): ...,
    + It is possible to provide extractor semantics for Error matchers. +
    if (expr is Error(let message, { let cause })) {}

    20.5.4 Properties of Error Instances

    -

    Error instances are ordinary objects that inherit properties from the Error prototype object and have an [[ErrorData]] internal slot whose value is undefined a String. The only specified uses of [[ErrorData]] is to identify Error, AggregateError, and NativeError instances as Error objects within Object.prototype.toString and their @@customMatcher methods.

    +

    Error instances are ordinary objects that inherit properties from the Error prototype object and have an [[ErrorData]] internal slot whose value is undefined a String. The only specified uses of [[ErrorData]] is to identify Error, AggregateError, and NativeError instances as Error objects within Object.prototype.toString and their @@customMatcher methods.

    Editor's Note
    - Maybe rename this internal slot to [[ErrorKind]]. + Rename this internal slot to [[ErrorKind]].

    20.5.6 NativeError Object Structure

    +

    20.5.6.1 The NativeError Constructors

    +

    20.5.6.1.1 NativeError ( message [ , options ] )

    Each NativeError function performs the following steps when called:

    @@ -735,22 +851,25 @@

    20.5.6.1.1 NativeError ( message

    20.5.6.2 Properties of the NativeError Constructors

    +

    20.5.6.2.2 NativeError [ @@customMatcher ] ( subject, hint )

    -
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If subject does not have a [[ErrorData]] internal slot or subject.[[ErrorData]] is not NativeError, return false.
    3. Return true.
    +
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If subject does not have a [[ErrorData]] internal slot or subject.[[ErrorData]] is not NativeError, return false.
    3. Return true.

    20.5.6.4 Properties of NativeError Instances

    -

    NativeError instances are ordinary objects that inherit properties from their NativeError prototype object and have an [[ErrorData]] internal slot whose value is undefined a String. The only specified use of [[ErrorData]] is by Object.prototype.toString (20.1.3.6) and their @@customMatcher methods to identify Error, AggregateError, or NativeError instances.

    +

    NativeError instances are ordinary objects that inherit properties from their NativeError prototype object and have an [[ErrorData]] internal slot whose value is undefined a String. The only specified use of [[ErrorData]] is by Object.prototype.toString (20.1.3.6) and their @@customMatcher methods to identify Error, AggregateError, or NativeError instances.

    20.5.7 AggregateError Objects

    +

    20.5.7.1 The AggregateError Constructor

    +

    20.5.7.1.1 AggregateError ( errors, message [ , options ] )

    This function performs the following steps when called:

    @@ -760,15 +879,16 @@

    20.5.7.1.1 AggregateError ( errors, <

    20.5.7.2 Properties of the AggregateError Constructor

    +

    20.5.7.2.2 AggregateError [ @@customMatcher ] ( subject, hint )

    -
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If subject does not have a [[ErrorData]] internal slot or subject.[[ErrorData]] is not "AggregateError", return false.
    3. Return true.
    +
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If subject does not have a [[ErrorData]] internal slot or subject.[[ErrorData]] is not "AggregateError", return false.
    3. Return true.

    20.5.7.4 Properties of AggregateError Instances

    -

    AggregateError instances are ordinary objects that inherit properties from their AggregateError prototype object and have an [[ErrorData]] internal slot whose value is undefined a String. The only specified use of [[ErrorData]] is by Object.prototype.toString (20.1.3.6) and their @@customMatcher methods to identify Error, AggregateError, or NativeError instances.

    +

    AggregateError instances are ordinary objects that inherit properties from their AggregateError prototype object and have an [[ErrorData]] internal slot whose value is undefined a String. The only specified use of [[ErrorData]] is by Object.prototype.toString (20.1.3.6) and their @@customMatcher methods to identify Error, AggregateError, or NativeError instances.

    @@ -776,42 +896,51 @@

    20.5.7.4 Properties of AggregateError Instances<

    21 Numbers and Dates

    +

    21.1 Number Objects

    +

    21.1.2 Properties of the Number Constructor

    +

    21.1.2.16 Number [ @@customMatcher ] ( subject, hint )

    This function performs the following steps when called:

    -
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. If subject is not a Number and does not have a [[NumberData]] internal slot, return false.
    3. If hint is "boolean", return true.
    4. If subject is a Number, return CreateArrayFromListsubject »).
    5. Return CreateArrayFromListsubject.[[NumberData]] »).
    +
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. If subject is not a Number and does not have a [[NumberData]] internal slot, return false.
    3. If hint is "boolean", return true.
    4. If subject is a Number, return CreateArrayFromListsubject »).
    5. Return CreateArrayFromListsubject.[[NumberData]] »).
    Editor's Note
    - Another approach is to ignore boxed primitives and only matches on primitive values. + Another approach is to ignore boxed primitives and only match primitive values.
    +

    21.2 BigInt Objects

    +

    21.2.2 Properties of the BigInt Constructor

    +

    21.2.2.4 BigInt [ @@customMatcher ] ( subject, hint )

    This function performs the following steps when called:

    -
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. If subject is not a BigInt and does not have a [[BigIntData]] internal slot, return false.
    3. If hint is "boolean", return true.
    4. If subject is a BigInt, return CreateArrayFromListsubject »).
    5. Return CreateArrayFromListsubject.[[BigIntData]] »).
    +
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. If subject is not a BigInt and does not have a [[BigIntData]] internal slot, return false.
    3. If hint is "boolean", return true.
    4. If subject is a BigInt, return CreateArrayFromListsubject »).
    5. Return CreateArrayFromListsubject.[[BigIntData]] »).
    Editor's Note
    - Another approach is to ignore boxed primitives and only matches on primitive values. + Another approach is to ignore boxed primitives and only match primitive values.
    +

    21.4 Date Objects

    +

    21.4.3 Properties of the Date Constructor

    +

    21.4.3.5 Date [ @@customMatcher ] ( subject, hint )

    This function performs the following steps when called:

    -
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If subject does not have a [[DateValue]] internal slot, return false.
    3. Return true.
    +
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If subject does not have a [[DateValue]] internal slot, return false.
    3. Return true.
    @@ -819,20 +948,24 @@

    21.4.3.5 Date [ @@customMatcher ] ( subject

    22 Text Processing

    +

    22.1 String Objects

    +

    22.1.2 Properties of the String Constructor

    +

    22.1.2.5 String [ @@customMatcher ] ( subject, hint )

    This function performs the following steps when called:

    -
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. If subject is not a String and does not have a [[StringData]] internal slot, return false.
    3. If hint is "boolean", return true.
    4. If subject is a String, return CreateArrayFromListsubject »).
    5. Return CreateArrayFromListsubject.[[StringData]] »).
    +
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. If subject is not a String and does not have a [[StringData]] internal slot, return false.
    3. If hint is "boolean", return true.
    4. If subject is a String, return CreateArrayFromListsubject »).
    5. Return CreateArrayFromListsubject.[[StringData]] »).
    Editor's Note
    - Another approach is to ignore boxed primitives and only matches on primitive values. + Another approach is to ignore boxed primitives and only match primitive values.
    +

    22.2 RegExp (Regular Expression) Objects

    @@ -841,17 +974,17 @@

    22.2.1 Patterns

    Syntax

    Pattern[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups, NamedCaptureGroupsBindings] :: - Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] + Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] Disjunction[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups, NamedCaptureGroupsBindings] :: - Alternative[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] + Alternative[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] - Alternative[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] + Alternative[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] | - Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] + Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] @@ -859,19 +992,19 @@

    Syntax

    [empty] - Alternative[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] - Term[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] + Alternative[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] + Term[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings]
    Term[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups, NamedCaptureGroupsBindings] :: - Assertion[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] + Assertion[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] - Atom[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] + Atom[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] - Atom[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] + Atom[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] Quantifier @@ -890,22 +1023,22 @@

    Syntax

    (?= - Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] + Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] ) (?! - Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] + Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] ) (?<= - Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] + Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] ) (?<! - Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] + Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] ) @@ -918,20 +1051,20 @@

    Syntax

    \ - AtomEscape[?UnicodeMode, ?NamedCaptureGroups] + AtomEscape[?UnicodeMode, ?NamedCaptureGroups] CharacterClass[?UnicodeMode, ?UnicodeSetsMode] ( - GroupSpecifier[?UnicodeMode, ?NamedCaptureGroupsBindings]opt - Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] + GroupSpecifier[?UnicodeMode, ?NamedCaptureGroupsBindings]opt + Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] ) (?: - Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] + Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups, ?NamedCaptureGroupsBindings] ) @@ -947,13 +1080,13 @@

    Syntax

    [+NamedCaptureGroups] k - GroupName[?UnicodeMode, ~NamedCaptureGroupsBindings] + GroupName[?UnicodeMode, ~NamedCaptureGroupsBindings] GroupSpecifier[UnicodeMode, NamedCaptureGroupsBindings] :: ? - GroupName[?UnicodeMode, ?NamedCaptureGroupsBindings] + GroupName[?UnicodeMode, ?NamedCaptureGroupsBindings] @@ -964,7 +1097,7 @@

    Syntax

    [+NamedCaptureGroupsBindings] < - VarOrLetOrConst + VarOrLetOrConst Identifier > @@ -973,13 +1106,12 @@

    Syntax

    Editor's Note

    A new syntax parameter NamedCaptureGroupsBindings has been added to the Regular Expression.

    This feature can be removed.

    -
    when /(?<let first>\d\d\d)-(?<let second>\d\d\d)/: [first, second],
    +        
    if (expr is /(?<let first>\d\d\d)-(?<let second>\d\d\d)/) {}
     // can be written as
    -when /(?<first>\d\d\d)-(?<second>\d\d\d)/({ groups: { let first, let second } }):
    -  [first, second],
    +if (expr is /(?<first>\d\d\d)-(?<second>\d\d\d)/({ groups: { let first, let second } })) {}
    Editor's Note
    -

    For simplicity, Identifier intead of BindingIdentifier is used. It's also possible to add [Yield, Await] to Pattern.

    +

    For simplicity, Identifier instead of BindingIdentifier is used. It is also possible to add [Yield, Await] to Pattern.

    @@ -987,7 +1119,7 @@

    22.2.1.1 Static Semantics: Early Errors

    GroupName : < - VarOrLetOrConst + VarOrLetOrConst Identifier > @@ -995,7 +1127,7 @@

    22.2.1.1 Static Semantics: Early Errors

    @@ -1015,13 +1147,13 @@

    22.2.1.9 Static Semantics: CapturingGroupName GroupName :: < - VarOrLetOrConst + VarOrLetOrConst Identifier > -
    1. Let idTextUnescaped be the first element of BoundNames of Identifier.
    2. Return CodePointsToString(idTextUnescaped).
    +
    1. Let idTextUnescaped be the first element of BoundNames of Identifier.
    2. Return CodePointsToString(idTextUnescaped).
    @@ -1030,24 +1162,23 @@

    22.2.3 Abstract Operations for RegExp Creation

    22.2.3.1 RegExpCreate ( P, F )

    -

    The abstract operation RegExpCreate takes arguments P (an ECMAScript language value) and F (a String or undefined) and returns either a normal completion containing an Object or a throw completion. It performs the following steps when called:

    -
    1. Let obj be ! RegExpAlloc(%RegExp%).
    2. Return ? RegExpInitialize(obj, P, F, false).
    +

    The abstract operation RegExpCreate takes arguments P (an ECMAScript language value) and F (a String or undefined) and returns either a normal completion containing an Object or a throw completion. It performs the following steps when called:

    +
    1. Let obj be ! RegExpAlloc(%RegExp%).
    2. Return ? RegExpInitialize(obj, P, F, false).

    22.2.3.3 RegExpInitialize ( obj, pattern, flags, canCreateBinding )

    -

    The abstract operation RegExpInitialize takes arguments obj (an Object), pattern (an ECMAScript language value), flags (an ECMAScript language value), and canCreateBinding (a Boolean) and returns either a normal completion containing an Object or a throw completion. It performs the following steps when called:

    -
    1. If pattern is undefined, let P be the empty String.
    2. Else, let P be ? ToString(pattern).
    3. If flags is undefined, let F be the empty String.
    4. Else, let F be ? ToString(flags).
    5. If F contains any code unit other than "d", "g", "i", "m", "s", "u", "v", or "y", or if F contains any code unit more than once, throw a SyntaxError exception.
    6. If F contains "i", let i be true; else let i be false.
    7. If F contains "m", let m be true; else let m be false.
    8. If F contains "s", let s be true; else let s be false.
    9. If F contains "u", let u be true; else let u be false.
    10. If F contains "v", let v be true; else let v be false.
    11. If u is true or v is true, then
      1. Let patternText be StringToCodePoints(P).
    12. Else,
      1. Let patternText be the result of interpreting each of P's 16-bit elements as a Unicode BMP code point. UTF-16 decoding is not applied to the elements.
    13. Let parseResult be ParsePattern(patternText, u, v, canCreateBinding).
    14. If parseResult is a non-empty List of SyntaxError objects, throw a SyntaxError exception.
    15. Assert: parseResult is a Pattern Parse Node.
    16. Set obj.[[OriginalSource]] to P.
    17. Set obj.[[OriginalFlags]] to F.
    18. Let capturingGroupsCount be CountLeftCapturingParensWithin(parseResult).
    19. Let rer be the RegExp Record { [[IgnoreCase]]: i, [[Multiline]]: m, [[DotAll]]: s, [[Unicode]]: u, [[UnicodeSets]]: v, [[CapturingGroupsCount]]: capturingGroupsCount }.
    20. Set obj.[[RegExpRecord]] to rer.
    21. Set obj.[[RegExpMatcher]] to CompilePattern of parseResult with argument rer.
    22. Perform ? Set(obj, "lastIndex", +0𝔽, true).
    23. Return obj.
    +

    The abstract operation RegExpInitialize takes arguments obj (an Object), pattern (an ECMAScript language value), flags (an ECMAScript language value), and canCreateBinding (a Boolean) and returns either a normal completion containing an Object or a throw completion. It performs the following steps when called:

    +
    1. If pattern is undefined, let P be the empty String.
    2. Else, let P be ? ToString(pattern).
    3. If flags is undefined, let F be the empty String.
    4. Else, let F be ? ToString(flags).
    5. If F contains any code unit other than "d", "g", "i", "m", "s", "u", "v", or "y", or if F contains any code unit more than once, throw a SyntaxError exception.
    6. If F contains "i", let i be true; else let i be false.
    7. If F contains "m", let m be true; else let m be false.
    8. If F contains "s", let s be true; else let s be false.
    9. If F contains "u", let u be true; else let u be false.
    10. If F contains "v", let v be true; else let v be false.
    11. If u is true or v is true, then
      1. Let patternText be StringToCodePoints(P).
    12. Else,
      1. Let patternText be the result of interpreting each of P's 16-bit elements as a Unicode BMP code point. UTF-16 decoding is not applied to the elements.
    13. Let parseResult be ParsePattern(patternText, u, v, canCreateBinding).
    14. If parseResult is a non-empty List of SyntaxError objects, throw a SyntaxError exception.
    15. Assert: parseResult is a Pattern Parse Node.
    16. Set obj.[[OriginalSource]] to P.
    17. Set obj.[[OriginalFlags]] to F.
    18. Let capturingGroupsCount be CountLeftCapturingParensWithin(parseResult).
    19. Let rer be the RegExp Record { [[IgnoreCase]]: i, [[Multiline]]: m, [[DotAll]]: s, [[Unicode]]: u, [[UnicodeSets]]: v, [[CapturingGroupsCount]]: capturingGroupsCount }.
    20. Set obj.[[RegExpRecord]] to rer.
    21. Set obj.[[RegExpMatcher]] to CompilePattern of parseResult with argument rer.
    22. Perform ? Set(obj, "lastIndex", +0𝔽, true).
    23. Return obj.

    22.2.3.4 Static Semantics: ParsePattern ( patternText, u, v, canCreateBinding )

    The abstract operation ParsePattern takes arguments patternText (a sequence of Unicode code points), u (a Boolean), v (a Boolean), and canCreateBinding (a Boolean) and returns a Parse Node or a non-empty List of SyntaxError objects. It performs the following steps when called:

    -
    1. If v is true and u is true, then
      1. Let parseResult be a List containing one or more SyntaxError objects.
    2. Else if v is true, then
      1. If canCreateBinding is true, let parseResult be ParseText(patternText, Pattern[+UnicodeMode, +UnicodeSetsMode, +NamedCaptureGroups, +NamedCaptureGroupsBindings]).
      2. Else, Let parseResult be ParseText(patternText, Pattern[+UnicodeMode, +UnicodeSetsMode, +NamedCaptureGroups, ~NamedCaptureGroupsBindings]).
    3. Else if u is true, then
      1. If canCreateBinding is true, let parseResult be ParseText(patternText, Pattern[+UnicodeMode, ~UnicodeSetsMode, +NamedCaptureGroups, +NamedCaptureGroupsBindings]).
      2. Else, Let parseResult be ParseText(patternText, Pattern[+UnicodeMode, ~UnicodeSetsMode, +NamedCaptureGroups, ~NamedCaptureGroupsBindings]).
    4. Else,
      1. If canCreateBinding is true, let parseResult be ParseText(patternText, Pattern[~UnicodeMode, ~UnicodeSetsMode, +NamedCaptureGroups, +NamedCaptureGroupsBindings]).
      2. Else, Let parseResult be ParseText(patternText, Pattern[~UnicodeMode, ~UnicodeSetsMode, +NamedCaptureGroups, ~NamedCaptureGroupsBindings]).
    5. Return parseResult.
    +
    1. If v is true and u is true, then
      1. Let parseResult be a List containing one or more SyntaxError objects.
    2. Else if v is true, then
      1. If canCreateBinding is true, let parseResult be ParseText(patternText, Pattern[+UnicodeMode, +UnicodeSetsMode, +NamedCaptureGroups, +NamedCaptureGroupsBindings]).
      2. Else, Let parseResult be ParseText(patternText, Pattern[+UnicodeMode, +UnicodeSetsMode, +NamedCaptureGroups, ~NamedCaptureGroupsBindings]).
    3. Else if u is true, then
      1. If canCreateBinding is true, let parseResult be ParseText(patternText, Pattern[+UnicodeMode, ~UnicodeSetsMode, +NamedCaptureGroups, +NamedCaptureGroupsBindings]).
      2. Else, Let parseResult be ParseText(patternText, Pattern[+UnicodeMode, ~UnicodeSetsMode, +NamedCaptureGroups, ~NamedCaptureGroupsBindings]).
    4. Else,
      1. If canCreateBinding is true, let parseResult be ParseText(patternText, Pattern[~UnicodeMode, ~UnicodeSetsMode, +NamedCaptureGroups, +NamedCaptureGroupsBindings]).
      2. Else, Let parseResult be ParseText(patternText, Pattern[~UnicodeMode, ~UnicodeSetsMode, +NamedCaptureGroups, ~NamedCaptureGroupsBindings]).
    5. Return parseResult.
    - -
    1. NOTE: Ignore ecmarkup warning: every call site of RegExpCreate asserts the return value is a normal completion; it should be refactored to not return a completion record at all.
    2. Return ? RegExpCreate("", "").
    +
    1. NOTE: Ignore ecmarkup warning: every call site of RegExpCreate asserts the return value is a normal completion; it should be refactored to not return a completion record at all.
    2. Return ? RegExpCreate("", "").

    22.2.4 The RegExp Constructor

    @@ -1055,42 +1186,51 @@

    22.2.4 The RegExp Constructor

    22.2.4.1 RegExp ( pattern, flags )

    This function performs the following steps when called:

    -
    1. Let patternIsRegExp be ? IsRegExp(pattern).
    2. If NewTarget is undefined, then
      1. Let newTarget be the active function object.
      2. If patternIsRegExp is true and flags is undefined, then
        1. Let patternConstructor be ? Get(pattern, "constructor").
        2. If SameValue(newTarget, patternConstructor) is true, return pattern.
    3. Else,
      1. Let newTarget be NewTarget.
    4. If pattern is an Object and pattern has a [[RegExpMatcher]] internal slot, then
      1. Let P be pattern.[[OriginalSource]].
      2. If flags is undefined, let F be pattern.[[OriginalFlags]].
      3. Else, let F be flags.
    5. Else if patternIsRegExp is true, then
      1. Let P be ? Get(pattern, "source").
      2. If flags is undefined, then
        1. Let F be ? Get(pattern, "flags").
      3. Else,
        1. Let F be flags.
    6. Else,
      1. Let P be pattern.
      2. Let F be flags.
    7. Let O be ? RegExpAlloc(newTarget).
    8. Return ? RegExpInitialize(O, P, F, false).
    +
    1. Let patternIsRegExp be ? IsRegExp(pattern).
    2. If NewTarget is undefined, then
      1. Let newTarget be the active function object.
      2. If patternIsRegExp is true and flags is undefined, then
        1. Let patternConstructor be ? Get(pattern, "constructor").
        2. If SameValue(newTarget, patternConstructor) is true, return pattern.
    3. Else,
      1. Let newTarget be NewTarget.
    4. If pattern is an Object and pattern has a [[RegExpMatcher]] internal slot, then
      1. Let P be pattern.[[OriginalSource]].
      2. If flags is undefined, let F be pattern.[[OriginalFlags]].
      3. Else, let F be flags.
    5. Else if patternIsRegExp is true, then
      1. Let P be ? Get(pattern, "source").
      2. If flags is undefined, then
        1. Let F be ? Get(pattern, "flags").
      3. Else,
        1. Let F be flags.
    6. Else,
      1. Let P be pattern.
      2. Let F be flags.
    7. Let O be ? RegExpAlloc(newTarget).
    8. Return ? RegExpInitialize(O, P, F, false).

    22.2.5 Properties of the RegExp Constructor

    +

    22.2.5.3 RegExp [ @@customMatcher ] ( subject, hint )

    This function performs the following steps when called:

    -
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If ? IsRegExp(subject) is false, return false.
    3. Return true.
    +
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If ? IsRegExp(subject) is false, return false.
    3. Return true.
    Note
    - IsRegExp returns true for objects that have a truthy @@match property. Do we want that? + IsRegExp returns true for objects that have a truthy @@match property. Do we want this?
    +

    22.2.6 Properties of the RegExp Prototype Object

    +

    22.2.6.20 RegExp.prototype [ @@customMatcher ] ( subject, hint )

    This function performs the following steps when called:

    -
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. Let regexp be this value.
    3. If hint is "boolean", return ? Call(? Get(regexp, "test"), regexp, « subject »).
    4. Let isRegExp be ? IsRegExp(regexp).
    5. If isRegExp is true, then
      1. Let flags be ? Get(regexp, "flags").
      2. Perform ? RequireObjectCoercible(flags).
      3. If ? ToString(flags) contains g, then
        1. Let iterator be ? Call(? Get(regexp, @@matchAll), regexp, « subject »).
        2. Let array be ? Call(%Array.from%, %Array%, « iterator »).
        3. If ! LengthOfArrayLike(array) is 0, return false.
        4. Return array.
    6. Let result be ? Call(? Get(regexp, @@match), regexp, « subject »).
    7. If result is null, return false.
    8. Return CreateArrayFromListresult »).
    +
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. Let regexp be this value.
    3. If hint is "boolean", return ? Call(? Get(regexp, "test"), regexp, « subject »).
    4. Let isRegExp be ? IsRegExp(regexp).
    5. If isRegExp is true, then
      1. Let flags be ? Get(regexp, "flags").
      2. Perform ? RequireObjectCoercible(flags).
      3. If ? ToString(flags) contains g, then
        1. Let iterator be ? Call(? Get(regexp, @@matchAll), regexp, « subject »).
        2. Let array be ? Call(%Array.from%, %Array%, « iterator »).
        3. If ! LengthOfArrayLike(array) is 0, return false.
        4. Return array.
    6. Let result be ? Call(? Get(regexp, @@match), regexp, « subject »).
    7. If result is null, return false.
    8. Return CreateArrayFromListresult »).
    Note
    let regex = /(?<id>\d+)-?/g
     '012-345' is regex(["012-", "012"], { groups: { id: "345" } });
    -// true, match with matchAll
    +// true, match with @@matchAll
     
     let regex2 = /(?<id>\d+)-?/
     '012-345' is regex({ groups: { id: "012" } });
    -// true, match with match
    +// true, match with @@match

    Editor's Note
    The "flags" property in this algorithm is accessed twice, this is not ideal. - Another access is in RegExp.prototype [ @@matchAll ] ( string ) or RegExp.prototype [ @@match ] ( string ) depends on if the regexp has the g flag. + Another access is + in RegExp.prototype [ @@matchAll ] ( string ) + or RegExp.prototype [ @@match ] ( string ) + depends on if the regexp has the g flag.
    Editor's Note
    - When matching with an RegExp that "flags" contains "g", both %RegExpStringIteratorPrototype%.next ( ) and %ArrayIteratorPrototype%.next ( ) is called, this is not ideal. + When matching with a RegExp that "flags" contains "g", + both %RegExpStringIteratorPrototype%.next ( ) + and %ArrayIteratorPrototype%.next ( ) + are called, this is not ideal.
    @@ -1099,34 +1239,36 @@

    22.2.6.20 RegExp.prototype [ @@customMatcher ] (

    23 Indexed Collections

    +

    23.1 Array Objects

    +

    23.1.2 Properties of the Array Constructor

    +

    23.1.2.6 Array [ @@customMatcher ] ( subject, hint )

    This function performs the following steps when called:

    -
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. If ? IsArray(subject) is false, return false.
    3. If hint is "boolean", return true.
    4. Return subject.
    - Note
    -
    expr is Array(1, 2, 3, 4);
    -
    +
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. If ? IsArray(subject) is false, return false.
    3. If hint is "boolean", return true.
    4. Return subject.
    + Note
    if (expr is Array(1, 2, 3, 4)) {}
    +

    23.2 TypedArray Objects

    +

    23.2.6 Properties of the TypedArray Constructors

    +

    23.2.6.3 TypedArray [ @@customMatcher ] ( subject, hint )

    This function performs the following steps when called:

    -
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. If subject does not have a [[TypedArrayName]] internal slot or subject.[[TypedArrayName]] is not TypedArray, return false.
    3. If hint is "boolean", return true.
    4. Return subject.
    - Note
    -
    const isPNG = binary is Uint8Array(
    +        
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. If subject does not have a [[TypedArrayName]] internal slot or subject.[[TypedArrayName]] is not TypedArray, return false.
    3. If hint is "boolean", return true.
    4. Return subject.
    + Note
    const isPNG = binary is Uint8Array(
       0x89, 0x50, 0x4E, 0x47,
       0x0D, 0x0A, 0x1A, 0x0A, ...
    -); // the ... is necessary otherwise it will only match a length-8 binary.
    -
    +); // the ... is necessary otherwise it will only match a length-8 binary.
    @@ -1134,65 +1276,71 @@

    23.2.6.3 TypedArray [ @@customMatcher

    24 Keyed Collections

    +

    24.1 Map Objects

    +

    24.1.2 Properties of the Map Constructor

    +

    24.1.2.3 Map [ @@customMatcher ] ( subject, hint )

    This function performs the following steps when called:

    -
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. If subject does not have a [[MapData]] internal slot, return false.
    3. If hint is "boolean", return true.
    4. Return CreateArrayFromListsubject »).
    - Note
    -
    expr is Map([[1, 2], [3, 4]]);
    +        
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. If subject does not have a [[MapData]] internal slot, return false.
    3. If hint is "boolean", return true.
    4. Return CreateArrayFromListsubject »).
    + Note
    expr is Map([[1, 2], [3, 4]]);
     // matches new Map([[1, 2], [3, 4]])
    -// but not new Map([[3, 4], [1, 2]])
    -
    +// but not new Map([[3, 4], [1, 2]])
    Editor's Note
    A Map can be iterated, but is it meaningful to do so in pattern matching? - Because
    x is Map([[a, b], [c, d]])
    is an ordered match.
    +

    24.2 Set Objects

    +

    24.2.2 Properties of the Set Constructor

    +

    24.2.2.3 Set [ @@customMatcher ] ( subject, hint )

    This function performs the following steps when called:

    -
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. If subject does not have a [[SetData]] internal slot, return false.
    3. If hint is "boolean", return true.
    4. Return CreateArrayFromListsubject »).
    - Note
    -
    expr is Set([1, 2, 3]);
    +        
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. If subject does not have a [[SetData]] internal slot, return false.
    3. If hint is "boolean", return true.
    4. Return CreateArrayFromListsubject »).
    + Note
    expr is Set([1, 2, 3]);
     // matches new Set([1, 2, 3])
    -// but not new Set([3, 2, 1])
    -
    +// but not new Set([3, 2, 1])
    Editor's Note
    A Set can be iterated, but is it meaningful to do so in pattern matching? - Because
    x is Set(a, b, c, d)
    is an ordered match.
    +

    24.3 WeakMap Objects

    +

    24.3.2 Properties of the WeakMap Constructor

    +

    24.3.2.2 WeakMap [ @@customMatcher ] ( subject, hint )

    This function performs the following steps when called:

    -
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If subject does not have a [[WeakMapData]] internal slot, return false.
    3. Return true.
    +
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If subject does not have a [[WeakMapData]] internal slot, return false.
    3. Return true.
    +

    24.4 WeakSet Objects

    +

    24.4.2 Properties of the WeakSet Constructor

    +

    24.4.2.2 WeakSet [ @@customMatcher ] ( subject, hint )

    This function performs the following steps when called:

    -
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If subject does not have a [[WeakSetData]] internal slot, return false.
    3. Return true.
    +
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If subject does not have a [[WeakSetData]] internal slot, return false.
    3. Return true.
    @@ -1200,36 +1348,45 @@

    24.4.2.2 WeakSet [ @@customMatcher ] ( subj

    25 Structured Data

    +

    25.1 ArrayBuffer Objects

    +

    25.1.5 Properties of the ArrayBuffer Constructor

    +

    25.1.5.4 ArrayBuffer [ @@customMatcher ] ( subject, hint )

    This function performs the following steps when called:

    -
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If subject has a [[ArrayBufferData]] internal slot, return true.
    3. Return false.
    +
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If subject has a [[ArrayBufferData]] internal slot, return true.
    3. Return false.
    +

    25.2 SharedArrayBuffer Objects

    +

    25.2.4 Properties of the SharedArrayBuffer Constructor

    +

    25.2.4.3 SharedArrayBuffer [ @@customMatcher ] ( subject, hint )

    This function performs the following steps when called:

    -
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If subject does not have a [[ArrayBufferData]] internal slot, return false.
    3. Return IsSharedArrayBuffer(subject).
    +
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If subject does not have a [[ArrayBufferData]] internal slot, return false.
    3. Return IsSharedArrayBuffer(subject).
    +

    25.3 DataView Objects

    +

    25.3.3 Properties of the DataView Constructor

    +

    25.3.3.2 DataView [ @@customMatcher ] ( subject, hint )

    This function performs the following steps when called:

    -
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If subject does not have a [[DataView]] internal slot, return false.
    3. Return true.
    +
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If subject does not have a [[DataView]] internal slot, return false.
    3. Return true.
    @@ -1237,28 +1394,32 @@

    25.3.3.2 DataView [ @@customMatcher ] ( sub

    26 Managing Memory

    +

    26.1 WeakRef Objects

    +

    26.1.2 Properties of the WeakRef Constructor

    +

    26.1.2.2 WeakRef [ @@customMatcher ] ( subject, hint )

    This function performs the following steps when called:

    -
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. If subject does not have a [[WeakRefTarget]] internal slot, return false.
    3. If hint is "boolean", return true.
    4. Return CreateArrayFromListWeakRefDeref(subject) »).
    - Note
    -
    expr is WeakRef({ type: 1 });
    -
    +
    1. Perform ? ValidateCustomMatcherHint(hint).
    2. If subject does not have a [[WeakRefTarget]] internal slot, return false.
    3. If hint is "boolean", return true.
    4. Return CreateArrayFromListWeakRefDeref(subject) »).
    + Note
    if (expr is WeakRef(let object)) {}
    +

    26.2 FinalizationRegistry Objects

    +

    26.2.2 Properties of the FinalizationRegistry Constructor

    +

    26.2.2.2 FinalizationRegistry [ @@customMatcher ] ( subject, hint )

    This function performs the following steps when called:

    -
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If subject does not have a [[CleanupCallback]] internal slot, return false.
    3. Return true.
    +
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. If subject does not have a [[CleanupCallback]] internal slot, return false.
    3. Return true.
    @@ -1266,14 +1427,17 @@

    26.2.2.2 FinalizationRegistry [ @@customMatcher

    27 Control Abstraction Objects

    +

    27.2 Promise Objects

    +

    27.2.4 Properties of the Promise Constructor

    +

    27.2.4.9 Promise [ @@customMatcher ] ( subject, hint )

    This function performs the following steps when called:

    -
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. Return IsPromise(subject).
    +
    1. Perform ? ValidateCustomMatcherHint(hint, boolean).
    2. Return IsPromise(subject).
    @@ -1281,18 +1445,21 @@

    27.2.4.9 Promise [ @@customMatcher ] ( subj

    28 Reflection

    +

    28.2 Proxy Objects

    +

    28.2.1 The Proxy Constructor

    +

    28.2.1.2 Proxy [ @@customMatcher ] ( )

    This function performs the following steps when called:

    1. Throw a TypeError exception.
    Editor's Note
    - All built-in constructors have a @@customMatcher method. This one is for design consistency.
    - This is not a consensus in the champion group. +

    All built-in constructors have a @@customMatcher method. This one is for design consistency.

    +

    This is not a consensus in the champion group.

    @@ -1310,50 +1477,51 @@

    Syntax

    ( - MatchPattern[?Yield, ?Await] + MatchPattern[?Yield, ?Await] ) - PrimitivePattern + PrimitivePattern - BindingPattern[?Yield, ?Await] + BindingPattern[?Yield, ?Await] - RegularExpressionPattern[?Yield, ?Await] + RegularExpressionPattern[?Yield, ?Await] - MemberExpressionPattern[?Yield, ?Await] + MemberExpressionPattern[?Yield, ?Await] - ObjectPattern[?Yield, ?Await] + ObjectPattern[?Yield, ?Await] - ArrayPattern[?Yield, ?Await] + ArrayPattern[?Yield, ?Await] - UnaryAlgebraicPattern[?Yield, ?Await] + UnaryAlgebraicPattern[?Yield, ?Await] - RelationalPattern[?Yield, ?Await] + RelationalPattern[?Yield, ?Await] - IfPattern[?Yield, ?Await] + IfPattern[?Yield, ?Await] - CombinedMatchPattern[?Yield, ?Await] + CombinedMatchPattern[?Yield, ?Await] - Editor's Note
    - The production void can be removed. The consensus is to add void for both using declaration and deconstruction. It might be a follow-on proposal. -
    expr is [void, void, 1];
    +      The production void can be removed.
    +      The consensus is to add void for both using declaration and deconstruction.
    +      It might be a follow-on proposal.
    +      
    if (expr is [let x, void, void]) {}
     // can be written as:
    -expr is [,, 1];
    -expr is [let _unused1, let _unused2, 1];
    +if (expr is [let x,,,]) {} +// or +if (expr is [let x, let _y, let _z,]) {}
    - PrimitivePattern : @@ -1365,24 +1533,27 @@

    Syntax

    Note 1
    -
    value is null;
    -value is true;
    -value is 1_000_000;
    -value is "string";
    -value is `line 1
    -line 2`;
    +
    if (value is null) {};
    +if (value is true) {};
    +if (value is 1_000_000) {};
    +if (value is "string") {};
    +if (value is `line 1
    +line 2`) {};
    Editor's Note
    - Preserve the interpolation syntax for (1) concerns about arbitrary expression interpolation and (2) intuitive string matching. - For example, match "com.example:method()" by -
    when `${isPackageName and let pkg}:${isIdentifier and let method}()`: ...,
    +

    + Preserve the interpolation syntax for + (1) concerns about arbitrary expression interpolation and + (2) intuitive string matching. +

    +

    For example, match "com.example:method()" by

    +
    if (qualifiedName is `${isPackageName and let pkg}:${isIdentifier and let method}()`) {}
    - BindingPattern[Yield, Await] : - VarOrLetOrConst + VarOrLetOrConst BindingIdentifier[?Yield, ?Await] @@ -1395,13 +1566,11 @@

    Syntax

    - Note 2
    -
    when { kind: let type }: ...,
    -

    Outside of match expression:

    -
    if (expr is [let left, let op, let right]) ...
    -
    + Note 2
    if (expr is { kind: let kind }) {}
    +return match (expr) {
    +  [let left, let op, let right]: evaluate(op, left, right);
    +};
    - RegularExpressionPattern[Yield, Await] : @@ -1410,32 +1579,27 @@

    Syntax

    RegularExpressionLiteral ( - MatchList[?Yield, ?Await] + MatchList[?Yield, ?Await] )
    - Note 3
    -
    value is /^starts/;
    -
    + Note 3
    if (value is /^starts/) {}
    Editor's Note
    - This production can be removed. -
    value is /^starts/;
    -// can be written as:
    -const regex = /^starts/;
    -value is regex;
    + This production can be removed. The code example above can be written as: +
    const regex = /^starts/;
    +if (value is regex) {}
    - MemberExpressionPattern[Yield, Await] : - PatternMatchingMemberExpression[?Yield, ?Await] + PatternMatchingMemberExpression[?Yield, ?Await] - PatternMatchingMemberExpression[?Yield, ?Await] + PatternMatchingMemberExpression[?Yield, ?Await] ( - MatchList[?Yield, ?Await] + MatchList[?Yield, ?Await] ) @@ -1455,44 +1619,44 @@

    Syntax

    IdentifierName - PatternMatchingMemberExpression[?Yield, ?Await] + PatternMatchingMemberExpression[?Yield, ?Await] . IdentifierName - PatternMatchingMemberExpression[?Yield, ?Await] + PatternMatchingMemberExpression[?Yield, ?Await] ?. IdentifierName - PatternMatchingMemberExpression[?Yield, ?Await] + PatternMatchingMemberExpression[?Yield, ?Await] . PrivateIdentifier - PatternMatchingMemberExpression[?Yield, ?Await] + PatternMatchingMemberExpression[?Yield, ?Await] ?. PrivateIdentifier
    - Note 4
    -
    value is undefined; value is Math.PI;
    -value is this; value is obj.#priv;
    -value is super.foo; value is import.meta.data?.value;
    -value is WeakRef({ type: 1 });
    -
    + Note 4
    if (expr is { x: undefined, y: undefined }) {}
    +if (expr is { angle: Math.PI, let length }) {}
    +if (expr is { ok: true, value: this.#lastValue }) {}
    +if (expr is { data: import.meta?.hot?.data }) {}
    +if (expr is WeakRef(let object)) {}
    Editor's Note
    - All productions except IdentifierReference in PatternMatchingMemberExpression can be removed. -
    value is Math.PI;
    +      All productions except IdentifierReference in PatternMatchingMemberExpression can be removed.
    +      
    if (value is Math.PI) {};
     // can be written as:
     const { PI } = Math;
    -value is PI;
    - It is similar to the DecoratorMemberExpression.
    - Should we allow MemberExpressionPattern[expr] to match with computed property names? +if (expr is PI) {}
    +

    + It is similar to the DecoratorMemberExpression. +

    +

    Should we allow MemberExpressionPattern[expr] to match with computed property names?

    - ObjectPattern[Yield, Await] : @@ -1501,75 +1665,75 @@

    Syntax

    { - MatchRestProperty[?Yield, ?Await] + MatchRestProperty[?Yield, ?Await] } { - MatchPropertyList[?Yield, ?Await] + MatchPropertyList[?Yield, ?Await] ,opt } { - MatchPropertyList[?Yield, ?Await] + MatchPropertyList[?Yield, ?Await] , - MatchRestProperty[?Yield, ?Await] + MatchRestProperty[?Yield, ?Await] }
    ArrayPattern[Yield, Await] : [ - MatchList[?Yield, ?Await]opt + MatchList[?Yield, ?Await]opt ] MatchList[Yield, Await] : Elisionopt - MatchRestElement[?Yield, ?Await]opt + MatchRestElement[?Yield, ?Await]opt - MatchElementList[?Yield, ?Await] + MatchElementList[?Yield, ?Await] - MatchElementList[?Yield, ?Await] + MatchElementList[?Yield, ?Await] , Elisionopt - MatchRestElement[?Yield, ?Await]opt + MatchRestElement[?Yield, ?Await]opt MatchRestProperty[Yield, Await] : ... - MatchPattern[?Yield, ?Await] + MatchPattern[?Yield, ?Await] MatchPropertyList[Yield, Await] : - MatchProperty[?Yield, ?Await] + MatchProperty[?Yield, ?Await] - MatchPropertyList[?Yield, ?Await] + MatchPropertyList[?Yield, ?Await] , - MatchProperty[?Yield, ?Await] + MatchProperty[?Yield, ?Await] MatchElementList[Yield, Await] : - MatchElisionElement[?Yield, ?Await] + MatchElisionElement[?Yield, ?Await] - MatchElementList[?Yield, ?Await] + MatchElementList[?Yield, ?Await] , - MatchElisionElement[?Yield, ?Await] + MatchElisionElement[?Yield, ?Await] MatchElisionElement[Yield, Await] : Elisionopt - MatchElement[?Yield, ?Await] + MatchElement[?Yield, ?Await] @@ -1581,24 +1745,24 @@

    Syntax

    PropertyName[?Yield, ?Await] ?opt : - MatchPattern[?Yield, ?Await] + MatchPattern[?Yield, ?Await] - VarOrLetOrConst + VarOrLetOrConst BindingIdentifier[?Yield, ?Await] ?opt - VarOrLetOrConst + VarOrLetOrConst BindingIdentifier[?Yield, ?Await] ?opt : - MatchPattern[?Yield, ?Await] + MatchPattern[?Yield, ?Await]
    MatchElement[Yield, Await] : - MatchPattern[?Yield, ?Await] + MatchPattern[?Yield, ?Await] ?opt @@ -1608,55 +1772,67 @@

    Syntax

    ... - MatchPattern[?Yield, ?Await] + MatchPattern[?Yield, ?Await]
    Note 5

    Object matchers

    -
    when { version: 2 or 3, type: String, value? }: rhs,
    -when { [Symbol.iterator]?: Function }: rhs,
    +      
    if (expr is { version: 2, type: String, value?: void }) {}
     // test if subject[Symbol.iterator] is present.
    -when { [Symbol.iterator] }: rhs,
    -when { 0: String }: rhs,
    +if (expr is { [Symbol.iterator]?: Function }) {} +if (expr is { 0: String }) {}

    Array matchers

    -
    when ["request", let method, ...let params]: rhs,
    +      
    if (expr is ["request", let method, ...let params]) {}
     // match an iterable that first 2 values match a and b and no more values.
    -when [a, b]: rhs,
    +if (expr is [a, b]) {}
     // match an iterable that first 2 values match a and b.
    -when [a, b, ...]: rhs,
    +if (expr is [a, b, ...]) {}
    +
    + Editor's Note
    + It is possible to add PrivateIdentifier to MatchProperty. +
    class MyClass {
    +  #field;
    +  test(data) {
    +    if (data is { value: { #field: let field } }) {}
    +    // can be written as
    +    if (data is { let value: MyClass }) {
    +      let field = value.#field;
    +    }
    +  }
    +}
    Editor's Note
    - It's possible to add Initializer to object property matcher and array element matcher. -
    when { let key = Symbol.for("missing") }: reportKey(key),
    +      It is possible to add Initializer to MatchProperty and MatchElement.
    +      
    if (expr is { type: "report", let key }) { reportKey(key); }
    +else { reportKey(Symbol.for("missing")) };
     // can be written as
    -when { let key }: reportKey(key)
    -when { }: reportKey(Symbol.for("missing"))
    +if (expr is { type: "report", let key = Symbol.for("missing") }) { reportKey(key); }
    Editor's Note
    -

    The ? in the production MatchProperty or MatchElement can be removed.

    +

    The ? in the production MatchProperty or MatchElement can be removed.

    The feature is not a consensus in the champion group yet.

    -
    when { x, y? }: ...,
    +      
    if (expr is { let x, let y? }) {}
     // can be written as
    -when { x }: ...,
    -when { x, y }: ...,
    +if (expr is { let x }) {}
    +else if (expr is { let x, let y }) {}
     
    -when [x, y?]: ...,
    +if (expr is [x, y?]) {}
     // can be written as
    -when [x]: ...,
    -when [x, y]: ...,
    +if (expr is [x]) {} +else if (expr is [x, y]) {}
    Editor's Note
    MatchProperty : - VarOrLetOrConst + VarOrLetOrConst BindingIdentifier ?opt : - MatchPattern + MatchPattern - VarOrLetOrConst + VarOrLetOrConst BindingIdentifier ?opt @@ -1664,9 +1840,9 @@

    Syntax

    These productions can be removed.

    This feature is not a consensus in the champion group yet.

    -
    when { let y: String }: ...,
    +      
    if (expr is { version: 2, let y: String }) {}
     // can be written as
    -when { y: String and let y }: ...,
    +if (expr is { version: 2, y: String and let y }) {}
    Editor's Note
    @@ -1677,29 +1853,26 @@

    Syntax

    Computed properties can be removed from this production, but it will be harder to match computed properties.

    -
    when { [Symbol.iterator] }: ...,
    +      
    if (expr is { let length, [Symbol.iterator]: Function }) {}
     // can be written as
    -function isIterable(value) { return Symbol.iterator in value }
    -match (subject) {
    -  when isIterable: ...,
    -}
    +function isIterable(value) { return typeof value[Symbol.iterator] === "function"; } +if (expr is { let length } and isIterable) {}
    - UnaryAlgebraicPattern[Yield, Await] : - PatternMatchingUnaryAlgebraicExpression[?Yield, ?Await] + PatternMatchingUnaryAlgebraicExpression[?Yield, ?Await] PatternMatchingUnaryAlgebraicExpression[Yield, Await] : + - PatternMatchingMemberExpression[?Yield, ?Await] + PatternMatchingMemberExpression[?Yield, ?Await] - - PatternMatchingMemberExpression[?Yield, ?Await] + PatternMatchingMemberExpression[?Yield, ?Await] + @@ -1712,48 +1885,48 @@

    Syntax

    Note 6
    -
    value is -0; // not matching `+0` and vice versa
    -value is -Infinity;
    -value is -Math.PI;
    +
    if (expr is -0) {} // not matching `+0` and vice versa
    +if (expr is { x: -Infinity, y: -Infinity }) {}
    +if (expr is { angle: -Math.PI, let length }) {}
    Editor's Note
    This production can be removed, but it will be harder to handle with +0 and -0. -
    value is -Infinity;
    -// can be written as:
    -const negInf = -Infinity;
    -value is negInf;
    + The code example above can be written as: +
    const negPi = -Math.PI;
    +if (Object.is(expr, -0)) {} // not matching `+0` and vice versa
    +if (expr is { x: Number.NEGATIVE_INFINITY, y: Number.NEGATIVE_INFINITY }) {}
    +if (expr is { angle: negPi, let length }) {}
    - RelationalPattern[Yield, Await] : < - PatternMatchingOrderExpression[?Yield, ?Await] + PatternMatchingOrderExpression[?Yield, ?Await] > - PatternMatchingOrderExpression[?Yield, ?Await] + PatternMatchingOrderExpression[?Yield, ?Await] <= - PatternMatchingOrderExpression[?Yield, ?Await] + PatternMatchingOrderExpression[?Yield, ?Await] >= - PatternMatchingOrderExpression[?Yield, ?Await] + PatternMatchingOrderExpression[?Yield, ?Await] instanceof - PatternMatchingMemberExpression[?Yield, ?Await] + PatternMatchingMemberExpression[?Yield, ?Await] in - PatternMatchingMemberExpression[?Yield, ?Await] + PatternMatchingMemberExpression[?Yield, ?Await] has - PatternMatchingStringLikeExpression[?Yield, ?Await] + PatternMatchingStringLikeExpression[?Yield, ?Await] has @@ -1761,19 +1934,19 @@

    Syntax

    == - PatternMatchingEqualExpression[?Yield, ?Await] + PatternMatchingEqualExpression[?Yield, ?Await] != - PatternMatchingEqualExpression[?Yield, ?Await] + PatternMatchingEqualExpression[?Yield, ?Await] === - PatternMatchingEqualExpression[?Yield, ?Await] + PatternMatchingEqualExpression[?Yield, ?Await] !== - PatternMatchingEqualExpression[?Yield, ?Await] + PatternMatchingEqualExpression[?Yield, ?Await]
    @@ -1781,10 +1954,10 @@

    Syntax

    NumericLiteral - PatternMatchingMemberExpression[?Yield, ?Await] + PatternMatchingMemberExpression[?Yield, ?Await] - PatternMatchingUnaryAlgebraicExpression[?Yield, ?Await] + PatternMatchingUnaryAlgebraicExpression[?Yield, ?Await]
    @@ -1795,7 +1968,7 @@

    Syntax

    NoSubstitutionTemplate - PatternMatchingMemberExpression[?Yield, ?Await] + PatternMatchingMemberExpression[?Yield, ?Await]
    @@ -1806,103 +1979,112 @@

    Syntax

    NoSubstitutionTemplate - PatternMatchingMemberExpression[?Yield, ?Await] + PatternMatchingMemberExpression[?Yield, ?Await] - PatternMatchingUnaryAlgebraicExpression[?Yield, ?Await] + PatternMatchingUnaryAlgebraicExpression[?Yield, ?Await]
    Note 7
    -
    expr is > -10 and < 10;
    -expr is { value: instanceof Map }; // expr.value instanceof Map
    -expr is { value: has #priv }; // #priv in expr.value
    -expr is [=== Array, === Object];
    +
    if (expr is > -10 and < 10) {}
    +if (expr is { value: instanceof Error and { let message } }) {}
    +if (expr is { type: "object", value: has #field }) {}
    +if (expr is [=== Array, === Object]) {}
    Editor's Note
    -

    It's possible to add the following production.

    +

    It is possible to add the following production.

    RelationalPattern[Yield, Await] : typeof == - PatternMatchingStringLikeExpression[?Yield, ?Await] + PatternMatchingStringLikeExpression[?Yield, ?Await] typeof != - PatternMatchingStringLikeExpression[?Yield, ?Await] + PatternMatchingStringLikeExpression[?Yield, ?Await] typeof === - PatternMatchingStringLikeExpression[?Yield, ?Await] + PatternMatchingStringLikeExpression[?Yield, ?Await] typeof !== - PatternMatchingStringLikeExpression[?Yield, ?Await] + PatternMatchingStringLikeExpression[?Yield, ?Await] -

    The recommend way to match a String is to use the String [ @@customMatcher ] ( subject, hint ), but it can be replaced. This production adds the ability to do the unforgable typeof test.

    -
    value is { value: String };
    +      

    + The recommended way to match a String is to use the String [ @@customMatcher ] ( subject, hint ), + but it can be replaced. This production adds the ability to do the unforgeable typeof test. +

    +
    if (expr is { value: String }) {}
     // can be written as this if built-ins might be replaced:
    -const isString = { [Symbol.customMatcher](val) {
    -  return typeof val === "string";
    -} };
    -value is { value: isString };
    +const isString = { + [Symbol.customMatcher](val) { + return typeof val === "string"; + } +}; +if (expr is { value: isString }) {}
    Editor's Note

    The instanceof production can be removed, but it will be harder to match by instanceof semantics.

    This feature is not a consensus in the champion group.

    -
    expr is Map;
    -

    The class matchers match by private-field semantics, the instanceof match is an escape hatch to match with the instanceof semantics.

    -
    value is instanceof Map;
    +      

    + The class matchers match by private-field semantics, + the instanceof match is an escape hatch to match with the instanceof semantics. +

    +
    if (expr is { type: "array", elements: [instanceof Map] }) {}
     // can be written as:
     function isInstanceOfMap(val) { return val instanceof Map; }
    -value is isInstanceOfMap;
    +if (expr is { type: "array", elements: [isInstanceOfMap] }) {}
    Editor's Note
    -

    The ==, !=, === and !== production can be removed, but it will be harder to match by === semantics when the PatternMatchingEqualExpression is a custom matcher.

    +

    + The ==, !=, ===, and !== production can be removed, + but it will be harder to match by === semantics when the PatternMatchingEqualExpression is a custom matcher. +

    This feature is not a consensus in the champion group.

    -
    expr is x;
    -

    The code above will try to use x as a custom matcher when possible, then do the === check as a fallback. This feature is an opt-out of the custom matcher, to always do the === check.

    -
    expr is { value: === x };
    +      
    if (expr is { type: "create", initializers: [createX] }) {}
    +

    + The code above will try to call createX as a custom matcher. + This feature is an opt-out of the custom matcher, to always do the === check. +

    +
    if (expr is { type: "create", initializers: [createX] }) {}
     // can be written as:
    -function isEqToX(val) { return val === x; }
    -value is { value: isEqToX };
    +function isCreateX(val) { return val === createX; } +if (expr is { type: "create", initializers: [isCreateX] }) {}
    Editor's Note

    The has production can be removed, but it will be harder to match by in semantics.

    This feature is not a consensus in the champion group.

    -

    It's also possible to use HasOwnProperty semantics for the has production.

    -
    value is { value: has #priv };
    +      
    if (expr is { type: "object", value: has #field }) {}
     // can be written as:
    -function hasPrivateField(val) { return #priv in val; }
    -value is { value: hasPrivateField };
    -
    - Editor's Note
    -

    The has production can be a proposal on it's own, to be the in operator reversed.

    -
    if (object has key) { ... }
    +function hasPrivateField(val) { return #field in val; } +if (expr is { type: "object", value: hasPrivateField }) {}

    +

    It is also possible to use HasOwnProperty semantics for the has production.

    +

    The has production can be a proposal on its own, to be the in operator reversed.

    +
    if (expr has #field) { }
    Editor's Note

    The in production can be removed, but it will be harder to match by in semantics.

    This feature is not a consensus in the champion group.

    -
    expr is { value: in obj };
    +      
    if (expr is { type: "key", key: in object }) {}
     // can be written as:
    -function asAKeyInObj(val) { return val in obj; }
    -value is { value: asAKeyInObj };
    +function isInObj(key) { return key in object; } +if (expr is { type: "key", key: isInObj }) {}
    Editor's Note

    The >, <, >= and <= production can be removed, but it will be harder to match numbers.

    This feature is not a consensus in the champion group.

    -
    value is > -10 and < 10;
    +      
    if (expr is [> -Math.PI and < Math.PI, > 0]) {}
     // can be written as:
    -function isInRangeMinus10To10(val) { return val > 10 && val < 10; }
    -value is isInRangeMinus10To10;
    +if (expr[0] > -Math.PI && expr[0] < Math.PI && expr[1] > 0) {}
    - IfPattern[Yield, Await] : @@ -1914,40 +2096,43 @@

    Syntax

    Note 8
    -
    value is { prop: MyClass and if (value.someTest("foo")) };
    +
    return match (expr) {
    +  { let x, let y, let z } and if (norm(x, y, z) < maxLength): [x, y];
    +  { let x, let y } and if (norm(x, y) < maxLength): [x, y];
    +  Number and < maxLength let length: [length];
    +}
    Editor's Note
    This production can be removed, but this is designed as an escape hatch. + No alternative is available for this feature.
    - CombinedMatchPattern[Yield, Await] : - MatchPattern[?Yield, ?Await] + MatchPattern[?Yield, ?Await] and - MatchPattern[?Yield, ?Await] + MatchPattern[?Yield, ?Await] - MatchPattern[?Yield, ?Await] + MatchPattern[?Yield, ?Await] or - MatchPattern[?Yield, ?Await] + MatchPattern[?Yield, ?Await] not - MatchPattern[?Yield, ?Await] + MatchPattern[?Yield, ?Await] Note 9
    -
    value is not 0;
    -value is "true" or "yes";
    +
    if (expr is { version: 2 or 3 }) {}
    +if (expr is { version: Number and not 1 }) {}

    30.1.1 Static Semantics: Early Errors

    - PrimitivePattern : NoSubstitutionTemplate @@ -1957,20 +2142,18 @@

    30.1.1 Static Semantics: Early Errors

  • It is a Syntax Error NoSubstitutionTemplate Contains NotEscapeSequence.
  • - BindingPattern : - VarOrLetOrConst + VarOrLetOrConst BindingIdentifier - MatchProperty : @@ -1981,35 +2164,36 @@

    30.1.1 Static Semantics: Early Errors

    PropertyName ?opt : - MatchPattern + MatchPattern
    - Note 1
    value is { __proto__: null }; // Syntax Error
    -value is { "__proto__": null }; // Syntax Error
    -value is { ["__proto__"]: null }; // no Syntax Error
    + Note 1
    if (expr is { __proto__: null, property?: void }) {} // Syntax Error
    +if (expr is { "__proto__": null, property?: void }) {} // Syntax Error
    +if (expr is { ["__proto__"]: null, property?: void }) {} // no Syntax Error
    MatchRestElement : ... - MatchPattern + MatchPattern MatchRestElement : ... - MatchPattern + MatchPattern - Note 2
    when { x: 1, y: 2, ...rest }: ..., // Syntax Error
    -when { x: 1, y: 2, ...(isEmpty) }: ..., // no Syntax Error, call isEmpty with the rest object
    + Note 2
    if (expr is { x: 0, y: 0, ...rest }) {} // Syntax Error
    +if (expr is { x: 0, y: 0, ...let rest }) {} // no Syntax Error, bind rest properties to _rest_
    +if (expr is { x: 0, y: 0, ...(isEmpty) }) {} // no Syntax Error, call isEmpty with the rest object
    MatchProperty : PropertyName[?Yield, ?Await] @@ -2019,7 +2203,7 @@

    30.1.1 Static Semantics: Early Errors

    PropertyName[?Yield, ?Await] ?opt : - MatchPattern[?Yield, ?Await] + MatchPattern[?Yield, ?Await]
    @@ -2027,32 +2211,33 @@

    30.1.1 Static Semantics: Early Errors

  • It is a Syntax Error if PropertyName can be covered by BindingIdentifier.
  • This is not a consensus in the champion group.
  • - Note 3
    when { x }: ..., // Syntax Error
    -when { x: void }: ..., // no Syntax Error
    +      Note 3
    if (expr is { x, y, z }) {} // Syntax Error
    +if (expr is { x: void, y: void, z: void }) {} // no Syntax Error
    +if (expr is { let x, let y, let z }) {} // no Syntax Error
     
    -when { if }: ..., // no Syntax Error
    +if (expr is { if }) {} // no Syntax Error
    MatchList : - MatchElementList + MatchElementList , Elisionopt - MatchRestElementopt + MatchRestElementopt MatchElementList : - MatchElementList + MatchElementList , - MatchElisionElement + MatchElisionElement Note 4
    value is [1, 2?, 3]; // Syntax Error
     value is [1, 2?, 3?]; // no Syntax Error
    @@ -2062,7 +2247,6 @@ 

    30.1.1 Static Semantics: Early Errors

    value is [1, 2?, ...]; // no Syntax Error
    - RegularExpressionPattern : @@ -2071,50 +2255,55 @@

    30.1.1 Static Semantics: Early Errors

    RegularExpressionLiteral ( - MatchList + MatchList )
    - CombinedMatchPattern : - MatchPattern + MatchPattern and - MatchPattern + MatchPattern CombinedMatchPattern : - MatchPattern + MatchPattern or - MatchPattern + MatchPattern CombinedMatchPattern : not - MatchPattern + MatchPattern Note 5
    value is a and b and c; // no Syntax Error
     value is a or b or c; // no Syntax Error
    @@ -2135,30 +2324,30 @@ 

    30.1.1 Static Semantics: Early Errors

    30.1.2 Static Semantics: IsOptionalPattern

    The syntax-directed operation IsOptionalPattern takes no arguments and returns a Boolean.. It is defined piecewise over the following productions:

    - MatchElementList : MatchElisionElement + MatchElementList : MatchElisionElement -
    1. Return IsOptionalPattern of MatchElisionElement.
    +
    1. Return IsOptionalPattern of MatchElisionElement.
    MatchElementList : - MatchElementList + MatchElementList , - MatchElisionElement + MatchElisionElement -
    1. If IsOptionalPattern of MatchElementList is true, return true.
    2. Return IsOptionalPattern of MatchElisionElement.
    +
    1. If IsOptionalPattern of MatchElementList is true, return true.
    2. Return IsOptionalPattern of MatchElisionElement.
    MatchElisionElement : Elisionopt - MatchElement + MatchElement -
    1. If Elision is present, return false.
    2. Return IsOptionalPattern of MatchElement.
    +
    1. If Elision is present, return false.
    2. Return IsOptionalPattern of MatchElement.
    MatchElement : - MatchPattern + MatchPattern ?opt @@ -2168,7 +2357,7 @@

    30.1.2 Static Semantics: IsOptionalPattern

    30.1.3 Runtime Semantics: MatchPatternMatches

    -

    The syntax-directed operation MatchPatternMatches takes arguments subject (an ECMAScript language value) and cacheGroup (a %Map%) and returns either a normal completion containing a Boolean or an abrupt completion. It is defined piecewise over the following productions:

    +

    The syntax-directed operation MatchPatternMatches takes arguments subject (an ECMAScript language value) and cacheGroup (a %Map%) and returns either a normal completion containing a Boolean or an abrupt completion. It is defined piecewise over the following productions:

    MatchPattern : void @@ -2177,67 +2366,67 @@

    30.1.3 Runtime Semantics: MatchPatternMatches MatchPattern : ( - MatchPattern + MatchPattern ) -
    1. Return ? MatchPatternMatches of MatchPattern with arguments subject and cacheGroup.
    +
    1. Return ? MatchPatternMatches of MatchPattern with arguments subject and cacheGroup.
    - MatchPattern : PrimitivePattern + MatchPattern : PrimitivePattern -
    1. Return PrimitivePatternMatches of PrimitivePattern with arguments subject.
    +
    1. Return PrimitivePatternMatches of PrimitivePattern with arguments subject.
    - MatchPattern : BindingPattern + MatchPattern : BindingPattern -
    1. Return BindingPatternMatches of BindingPattern with arguments subject.
    +
    1. Return BindingPatternMatches of BindingPattern with arguments subject.
    - MatchPattern : RegularExpressionPattern + MatchPattern : RegularExpressionPattern -
    1. Return ? RegularExpressionPatternMatches of RegularExpressionPattern with arguments subject and cacheGroup.
    +
    1. Return ? RegularExpressionPatternMatches of RegularExpressionPattern with arguments subject and cacheGroup.
    - MatchPattern : MemberExpressionPattern + MatchPattern : MemberExpressionPattern -
    1. Return ? MemberExpressionPatternMatches of MemberExpressionPattern with arguments subject and cacheGroup.
    +
    1. Return ? MemberExpressionPatternMatches of MemberExpressionPattern with arguments subject and cacheGroup.
    - MatchPattern : ObjectPattern + MatchPattern : ObjectPattern -
    1. Return ? ObjectPatternMatches of ObjectPattern with arguments subject and cacheGroup.
    +
    1. Return ? ObjectPatternMatches of ObjectPattern with arguments subject and cacheGroup.
    - MatchPattern : ArrayPattern + MatchPattern : ArrayPattern -
    1. Return ? ArrayPatternMatches of ArrayPattern with arguments subject and cacheGroup.
    +
    1. Return ? ArrayPatternMatches of ArrayPattern with arguments subject and cacheGroup.
    - MatchPattern : UnaryAlgebraicPattern + MatchPattern : UnaryAlgebraicPattern -
    1. Return ? UnaryAlgebraicPatternMatches of UnaryAlgebraicPattern with arguments subject.
    +
    1. Return ? UnaryAlgebraicPatternMatches of UnaryAlgebraicPattern with arguments subject.
    - MatchPattern : RelationalPattern + MatchPattern : RelationalPattern -
    1. Return ? RelationalPatternMatches of RelationalPattern with arguments subject.
    +
    1. Return ? RelationalPatternMatches of RelationalPattern with arguments subject.
    - MatchPattern : IfPattern + MatchPattern : IfPattern -
    1. Return ? IfPatternMatches of IfPattern.
    +
    1. Return ? IfPatternMatches of IfPattern.
    - MatchPattern : CombinedMatchPattern + MatchPattern : CombinedMatchPattern -
    1. Return ? CombinedMatchPatternMatches of CombinedMatchPattern with arguments subject and cacheGroup.
    +
    1. Return ? CombinedMatchPatternMatches of CombinedMatchPattern with arguments subject and cacheGroup.

    30.1.4 Runtime Semantics: PrimitivePatternMatches

    -

    The syntax-directed operation PrimitivePatternMatches takes argument subject (an ECMAScript language value) and returns a Boolean. It is defined piecewise over the following productions:

    +

    The syntax-directed operation PrimitivePatternMatches takes argument subject (an ECMAScript language value) and returns a Boolean. It is defined piecewise over the following productions:

    PrimitivePattern : Literal @@ -2252,20 +2441,20 @@

    30.1.4 Runtime Semantics: PrimitivePatternMatche

    30.1.5 Runtime Semantics: BindingPatternMatches

    -

    The syntax-directed operation BindingPatternMatches takes argument subject (an ECMAScript language value) and returns a Boolean. It is defined piecewise over the following productions:

    +

    The syntax-directed operation BindingPatternMatches takes argument subject (an ECMAScript language value) and returns a Boolean. It is defined piecewise over the following productions:

    BindingPattern : - VarOrLetOrConst + VarOrLetOrConst BindingIdentifier -
    1. TODO: This section is not written in the spec language yet.
    2. Let name be StringValue of BindingIdentifier.
    3. Initialize variable name with subject with the semantics of var, let or const based on VarOrLetOrConst.
    4. Return true.
    +
    1. TODO: This section is not written in the spec language yet.
    2. Let name be StringValue of BindingIdentifier.
    3. Initialize variable name with subject with the semantics of var, let or const based on VarOrLetOrConst.
    4. Return true.

    30.1.6 Runtime Semantics: RegularExpressionPatternMatches

    -

    The syntax-directed operation RegularExpressionPatternMatches takes arguments subject (an ECMAScript language value) and cacheGroup (a %Map%) and returns either a normal completion containing a Boolean or an abrupt completion. It is defined piecewise over the following productions:

    +

    The syntax-directed operation RegularExpressionPatternMatches takes arguments subject (an ECMAScript language value) and cacheGroup (a %Map%) and returns either a normal completion containing a Boolean or an abrupt completion. It is defined piecewise over the following productions:

    RegularExpressionPattern : RegularExpressionLiteral @@ -2273,29 +2462,29 @@

    30.1.6 Runtime Semantics: RegularExpressionPatte RegularExpressionLiteral ( - MatchListopt + MatchListopt ) -
    1. Assert: The following steps will not trigger any user code.
    2. If subject is not a String, return false.
    3. Let pattern be CodePointsToString(BodyText of RegularExpressionLiteral).
    4. Let flags be CodePointsToString(FlagText of RegularExpressionLiteral).
    5. Let regexp be ! RegExpAlloc(%RegExp%).
    6. Perform ! RegExpInitialize(regexp, pattern, flags, true).
    7. Perform ! CreateDataPropertyOrThrow(regexp, "exec", %RegExp.prototype.exec%).
    8. NOTE: This is to prevent the "exec" method on the prototype to be replaced. RegExpExec will call it.
    9. Let match be ! RegExpExec(regexp, subject).
    10. If match is null, return false.
    11. Let result be an empty List of ECMAScript language values.
    12. If flags contains "u" or flags contains "v", let fullUnicode be true.
    13. Else, let fullUnicode be false.
    14. Repeat, until match is null,
      1. Let matchStr be ! ToString(! Get(match, "0")).
      2. If matchStr is the empty String, then
        1. Let thisIndex be (! ToLength(! Get(regexp, "lastIndex"))).
        2. Let nextIndex be AdvanceStringIndex(subject, thisIndex, fullUnicode).
        3. Perform ! Set(regexp, "lastIndex", 𝔽(nextIndex), true).
      3. Append match to result.
      4. TODO: This section is not written in the spec language yet.
      5. Let groups be ! Get(match, "groups").
      6. Let namedGroups be ! GetOwnPropertyKeys(groups, string).
      7. For each String s of namedGroups, do
        1. Let parseNode be the Parse Node within the RegularExpressionLiteral that CapturingGroupName of this Parse Node is s.
        2. Assert: parseNode is present and is a GroupSpecifier.
        3. If GroupName of GroupSpecifier is +
          1. Assert: The following steps will not trigger any user code.
          2. If subject is not a String, return false.
          3. Let pattern be CodePointsToString(BodyText of RegularExpressionLiteral).
          4. Let flags be CodePointsToString(FlagText of RegularExpressionLiteral).
          5. Let regexp be ! RegExpAlloc(%RegExp%).
          6. Perform ! RegExpInitialize(regexp, pattern, flags, true).
          7. Perform ! CreateDataPropertyOrThrow(regexp, "exec", %RegExp.prototype.exec%).
          8. NOTE: This is to prevent the "exec" method on the prototype to be replaced. RegExpExec will call it.
          9. Let match be ! RegExpExec(regexp, subject).
          10. If match is null, return false.
          11. Let result be an empty List of ECMAScript language values.
          12. If flags contains "u" or flags contains "v", let fullUnicode be true.
          13. Else, let fullUnicode be false.
          14. Repeat, until match is null,
            1. Let matchStr be ! ToString(! Get(match, "0")).
            2. If matchStr is the empty String, then
              1. Let thisIndex be (! ToLength(! Get(regexp, "lastIndex"))).
              2. Let nextIndex be AdvanceStringIndex(subject, thisIndex, fullUnicode).
              3. Perform ! Set(regexp, "lastIndex", 𝔽(nextIndex), true).
            3. Append match to result.
            4. TODO: This section is not written in the spec language yet.
            5. Let groups be ! Get(match, "groups").
            6. Let namedGroups be ! GetOwnPropertyKeys(groups, string).
            7. For each String s of namedGroups, do
              1. Let parseNode be the Parse Node within the RegularExpressionLiteral that CapturingGroupName of this Parse Node is s.
              2. Assert: parseNode is present and is a GroupSpecifier.
              3. If GroupName of GroupSpecifier is GroupName : < VarOrLetOrConst Identifier > -, then
                1. Initialize variable s with subject with the semantics of var, let or const based on VarOrLetOrConst.
            8. Set match to ! RegExpExec(regexp, subject).
          15. Let resultArray be CreateArrayFromList(result).
          16. NOTE: "The following steps will not trigger any user code" ends here.
          17. If RegularExpressionPattern is +, then
            1. Initialize variable s with subject with the semantics of var, let or const based on VarOrLetOrConst.
        4. Set match to ! RegExpExec(regexp, subject).
      8. Let resultArray be CreateArrayFromList(result).
      9. NOTE: "The following steps will not trigger any user code" ends here.
      10. If RegularExpressionPattern is RegularExpressionPattern : RegularExpressionLiteral ( - MatchList + MatchList ) -, then
        1. Return ? ListPatternMatches of MatchList with arguments resultArray and cacheGroup.
      11. Return true.
      +, then
      1. Return ? ListPatternMatches of MatchList with arguments resultArray and cacheGroup.
    15. Return true.
    Editor's Note
    -

    In order to create binding without triggering user code, we're not calling RegExp.prototype [ @@customMatcher ] ( subject, hint ) and making the behaviour unforgeable.

    -

    Contrast to call RegExp.prototype [ @@customMatcher ] ( subject, hint ) directly, this syntax-directed operation skipped the following user code:

    +

    In order to create binding without triggering user code, we're not calling RegExp.prototype [ @@customMatcher ] ( subject, hint ) and making the behaviour unforgeable.

    +

    Contrast to call RegExp.prototype [ @@customMatcher ] ( subject, hint ) directly, this syntax-directed operation skipped the following user code:

    • - get and call RegExp.prototype [ @@customMatcher ] ( subject, hint ) + get and call RegExp.prototype [ @@customMatcher ] ( subject, hint )
      • get and call RegExp.prototype.test ( S ) @@ -2332,7 +2521,7 @@

        30.1.6 Runtime Semantics: RegularExpressionPatte

      • get get RegExp.prototype.flags
      • - Call The RegExp Constructor + Call The RegExp Constructor
        • IsRegExp
          • @@ -2356,27 +2545,27 @@

            30.1.6 Runtime Semantics: RegularExpressionPatte

            30.1.7 Runtime Semantics: MemberExpressionPatternMatches

            -

            The syntax-directed operation MemberExpressionPatternMatches takes arguments subject (an ECMAScript language value) and cacheGroup (a %Map%) and returns either a normal completion containing a Boolean or an abrupt completion. It is defined piecewise over the following productions:

            +

            The syntax-directed operation MemberExpressionPatternMatches takes arguments subject (an ECMAScript language value) and cacheGroup (a %Map%) and returns either a normal completion containing a Boolean or an abrupt completion. It is defined piecewise over the following productions:

            - MemberExpressionPattern : PatternMatchingMemberExpression + MemberExpressionPattern : PatternMatchingMemberExpression -
            1. Let expr be the LeftHandSideExpression that is covered by PatternMatchingMemberExpression.
            2. Let ref be ? Evaluation of expr.
            3. Let value be ? GetValue(ref).
            4. If ref is a Reference Record and IsPropertyReference(ref) is true, let receiver be GetThisValue(ref).
            5. Else, let receiver be null.
            6. Let result be ? InvokeCustomMatcher(value, subject, cacheGroup, boolean, receiver).
            7. Assert: result is a Boolean.
            8. Return result.
            +
            1. Let expr be the LeftHandSideExpression that is covered by PatternMatchingMemberExpression.
            2. Let ref be ? Evaluation of expr.
            3. Let value be ? GetValue(ref).
            4. If ref is a Reference Record and IsPropertyReference(ref) is true, let receiver be GetThisValue(ref).
            5. Else, let receiver be null.
            6. Let result be ? InvokeCustomMatcher(value, subject, cacheGroup, boolean, receiver).
            7. Assert: result is a Boolean.
            8. Return result.
            MemberExpressionPattern : - PatternMatchingMemberExpression + PatternMatchingMemberExpression ( - MatchListopt + MatchListopt ) -
            1. Let expr be the LeftHandSideExpression that is covered by PatternMatchingMemberExpression.
            2. Let ref be ? Evaluation of expr.
            3. Let value be ? GetValue(ref).
            4. If ref is a Reference Record and IsPropertyReference(ref) is true, let receiver be GetThisValue(ref).
            5. Else, let receiver be null.
            6. Let listSubject be ? InvokeCustomMatcher(value, subject, cacheGroup, list, receiver).
            7. Assert: listSubject is an Object.
            8. If MatchList is not present, then
              1. Return ? FinishListMatch(listSubject, cacheGroup, 0).
            9. Return ? ListPatternMatches of MatchList with arguments listSubject and cacheGroup.
            +
            1. Let expr be the LeftHandSideExpression that is covered by PatternMatchingMemberExpression.
            2. Let ref be ? Evaluation of expr.
            3. Let value be ? GetValue(ref).
            4. If ref is a Reference Record and IsPropertyReference(ref) is true, let receiver be GetThisValue(ref).
            5. Else, let receiver be null.
            6. Let listSubject be ? InvokeCustomMatcher(value, subject, cacheGroup, list, receiver).
            7. Assert: listSubject is an Object.
            8. If MatchList is not present, then
              1. Return ? FinishListMatch(listSubject, cacheGroup, 0).
            9. Return ? ListPatternMatches of MatchList with arguments listSubject and cacheGroup.

            30.1.8 Runtime Semantics: ObjectPatternMatches

            -

            The syntax-directed operation ObjectPatternMatches takes arguments subject (an ECMAScript language value) and cacheGroup (a %Map%) and returns either a normal completion containing a Boolean or an abrupt completion. It is defined piecewise over the following productions:

            +

            The syntax-directed operation ObjectPatternMatches takes arguments subject (an ECMAScript language value) and cacheGroup (a %Map%) and returns either a normal completion containing a Boolean or an abrupt completion. It is defined piecewise over the following productions:

            ObjectPattern : { @@ -2388,33 +2577,33 @@

            30.1.8 Runtime Semantics: ObjectPatternMatches ObjectPattern : { - MatchRestProperty + MatchRestProperty } -
            1. If subject is not an Object, return false.
            2. Let matches be ? ObjectPatternInnerMatches of MatchRestProperty with arguments subject, cacheGroup and a new empty List.
            3. If matches is not-matched, return false.
            4. Return true.
            +
            1. If subject is not an Object, return false.
            2. Let matches be ? ObjectPatternInnerMatches of MatchRestProperty with arguments subject, cacheGroup and a new empty List.
            3. If matches is not-matched, return false.
            4. Return true.
            ObjectPattern : { - MatchPropertyList + MatchPropertyList ,opt } -
            1. If subject is not an Object, return false.
            2. Let matches be ? ObjectPatternInnerMatches of MatchPropertyList with arguments subject, cacheGroup and a new empty List.
            3. If matches is not-matched, return false.
            4. Return true.
            +
            1. If subject is not an Object, return false.
            2. Let matches be ? ObjectPatternInnerMatches of MatchPropertyList with arguments subject, cacheGroup and a new empty List.
            3. If matches is not-matched, return false.
            4. Return true.
            ObjectPattern : { - MatchPropertyList + MatchPropertyList , - MatchRestProperty + MatchRestProperty } -
            1. If subject is not an Object, return false.
            2. Let matches be ? ObjectPatternInnerMatches of MatchPropertyList with arguments subject, cacheGroup and a new empty List.
            3. If matches is not-matched, return false.
            4. If MatchRestProperty is not present, return true.
            5. Let restMatches be ? ObjectPatternInnerMatches of MatchRestProperty with arguments subject, cacheGroup and matches.
            6. If restMatches is not-matched, return false.
            7. Return true.
            +
            1. If subject is not an Object, return false.
            2. Let matches be ? ObjectPatternInnerMatches of MatchPropertyList with arguments subject, cacheGroup and a new empty List.
            3. If matches is not-matched, return false.
            4. If MatchRestProperty is not present, return true.
            5. Let restMatches be ? ObjectPatternInnerMatches of MatchRestProperty with arguments subject, cacheGroup and matches.
            6. If restMatches is not-matched, return false.
            7. Return true.
            @@ -2423,25 +2612,25 @@

            30.1.9 Runtime Semantics: ObjectPatternInnerMatc MatchRestProperty : ... - MatchPattern + MatchPattern -
            1. Let restObj be OrdinaryObjectCreate(%Object.prototype%).
            2. Perform ? CopyDataProperties(restObj, subject, excludedNames).
            3. Let matches be ? MatchPatternMatches of MatchPattern with arguments restObj and cacheGroup.
            4. If matches is false, return not-matched.
            5. Return « ».
            +
            1. Let restObj be OrdinaryObjectCreate(%Object.prototype%).
            2. Perform ? CopyDataProperties(restObj, subject, excludedNames).
            3. Let matches be ? MatchPatternMatches of MatchPattern with arguments restObj and cacheGroup.
            4. If matches is false, return not-matched.
            5. Return « ».
            - MatchPropertyList : MatchProperty + MatchPropertyList : MatchProperty -
            1. Return ? ObjectPatternInnerMatches of MatchProperty with arguments subject, cacheGroup and excludedNames.
            +
            1. Return ? ObjectPatternInnerMatches of MatchProperty with arguments subject, cacheGroup and excludedNames.
            MatchPropertyList : - MatchPropertyList + MatchPropertyList , - MatchProperty + MatchProperty -
            1. Let matches be ? ObjectPatternInnerMatches of MatchProperty with arguments subject, cacheGroup and excludedNames.
            2. If matches is not-matched, return not-matched.
            3. Let propMatches be ? ObjectPatternInnerMatches of MatchPropertyList with arguments subject, cacheGroup and matches.
            4. If propMatches is not-matched, return not-matched.
            5. Assert: matches and propMatches are Lists of String.
            6. Return the list-concatenation of matches and propMatches.
            +
            1. Let matches be ? ObjectPatternInnerMatches of MatchProperty with arguments subject, cacheGroup and excludedNames.
            2. If matches is not-matched, return not-matched.
            3. Let propMatches be ? ObjectPatternInnerMatches of MatchPropertyList with arguments subject, cacheGroup and matches.
            4. If propMatches is not-matched, return not-matched.
            5. Assert: matches and propMatches are Lists of String.
            6. Return the list-concatenation of matches and propMatches.
            MatchProperty : PropertyName @@ -2449,51 +2638,51 @@

            30.1.9 Runtime Semantics: ObjectPatternInnerMatc -
            1. Let propertyName be ? Evaluation of PropertyName.
            2. If ? HasPropertyCached(subject, cacheGroup, propertyName) is false, then
              1. If ? is present, return « ».
              2. Return not-matched.
            3. Return « propertyName ».
            +
            1. Let propertyName be ? Evaluation of PropertyName.
            2. If ? HasPropertyCached(subject, cacheGroup, propertyName) is false, then
              1. If ? is present, return « ».
              2. Return not-matched.
            3. Return « propertyName ».
            MatchProperty : PropertyName ?opt : - MatchPattern + MatchPattern -
            1. Let propertyName be ? Evaluation of PropertyName.
            2. If ? HasPropertyCached(subject, cacheGroup, propertyName) is false, then
              1. If ? is present, return « ».
              2. Return not-matched.
            3. Let value be ? GetCached(subject, cacheGroup, propertyName).
            4. Let matches be ? MatchPatternMatches of MatchPattern with arguments value and cacheGroup.
            5. If matches is false, return not-matched.
            6. Return « propertyName ».
            +
            1. Let propertyName be ? Evaluation of PropertyName.
            2. If ? HasPropertyCached(subject, cacheGroup, propertyName) is false, then
              1. If ? is present, return « ».
              2. Return not-matched.
            3. Let value be ? GetCached(subject, cacheGroup, propertyName).
            4. Let matches be ? MatchPatternMatches of MatchPattern with arguments value and cacheGroup.
            5. If matches is false, return not-matched.
            6. Return « propertyName ».
            MatchProperty : - VarOrLetOrConst + VarOrLetOrConst BindingIdentifier ?opt -
            1. TODO: This section is not written in the spec language yet.
            2. Let propertyName be StringValue of BindingIdentifier.
            3. If ? HasPropertyCached(subject, cacheGroup, propertyName) is false, then
              1. If ? is present, return « ».
              2. Return not-matched.
            4. Let value be ? GetCached(subject, cacheGroup, propertyName).
            5. Initialize variable propertyName with value with the semantics of var, let or const based on VarOrLetOrConst.
            6. Return « propertyName ».
            +
            1. TODO: This section is not written in the spec language yet.
            2. Let propertyName be StringValue of BindingIdentifier.
            3. If ? HasPropertyCached(subject, cacheGroup, propertyName) is false, then
              1. If ? is present, return « ».
              2. Return not-matched.
            4. Let value be ? GetCached(subject, cacheGroup, propertyName).
            5. Initialize variable propertyName with value with the semantics of var, let or const based on VarOrLetOrConst.
            6. Return « propertyName ».
            MatchProperty : - VarOrLetOrConst + VarOrLetOrConst BindingIdentifier ?opt : - MatchPattern + MatchPattern -
            1. TODO: This section is not written in the spec language yet.
            2. Let propertyName be StringValue of BindingIdentifier.
            3. If ? HasPropertyCached(subject, cacheGroup, propertyName) is false, then
              1. If ? is present, return « ».
              2. Return not-matched.
            4. Let value be ? GetCached(subject, cacheGroup, propertyName).
            5. Let matches be ? MatchPatternMatches of MatchPattern with arguments value and cacheGroup.
            6. If matches is false, return not-matched.
            7. Initialize variable propertyName with value with the semantics of var, let or const based on VarOrLetOrConst.
            8. Return « propertyName ».
            +
            1. TODO: This section is not written in the spec language yet.
            2. Let propertyName be StringValue of BindingIdentifier.
            3. If ? HasPropertyCached(subject, cacheGroup, propertyName) is false, then
              1. If ? is present, return « ».
              2. Return not-matched.
            4. Let value be ? GetCached(subject, cacheGroup, propertyName).
            5. Let matches be ? MatchPatternMatches of MatchPattern with arguments value and cacheGroup.
            6. If matches is false, return not-matched.
            7. Initialize variable propertyName with value with the semantics of var, let or const based on VarOrLetOrConst.
            8. Return « propertyName ».

            30.1.10 Runtime Semantics: ArrayPatternMatches

            -

            The syntax-directed operation ArrayPatternMatches takes arguments subject (an ECMAScript language value) and cacheGroup (a %Map%) and returns either a normal completion containing a Boolean or an abrupt completion. It is defined piecewise over the following productions:

            +

            The syntax-directed operation ArrayPatternMatches takes arguments subject (an ECMAScript language value) and cacheGroup (a %Map%) and returns either a normal completion containing a Boolean or an abrupt completion. It is defined piecewise over the following productions:

            ArrayPattern : [ - MatchListopt + MatchListopt ] -
            1. If IsCallable(? GetCached(subject, cacheGroup, @@iterator)) is false, return false.
            2. Let iteratorRecord be ? GetIteratorCached(subject, cacheGroup).
            3. If MatchList is not present, then
              1. Return ? FinishListMatch(subject, cacheGroup, 0).
            4. Return ? ListPatternMatches of MatchList with arguments iteratorRecord and cacheGroup.
            +
            1. If IsCallable(? GetCached(subject, cacheGroup, @@iterator)) is false, return false.
            2. Let iteratorRecord be ? GetIteratorCached(subject, cacheGroup).
            3. If MatchList is not present, then
              1. Return ? FinishListMatch(subject, cacheGroup, 0).
            4. Return ? ListPatternMatches of MatchList with arguments iteratorRecord and cacheGroup.
            @@ -2502,61 +2691,61 @@

            30.1.11 Runtime Semantics: ListPatternMatches MatchList : Elisionopt - MatchRestElementopt + MatchRestElementopt -
            1. Let visitedCount be 0.
            2. If Elision is present, then
              1. If ? GetIteratorNthValueCached(subject, cacheGroup, 0) is not-matched, return false.
              2. Set visitedCount to 1.
            3. If MatchRestElement is present, then
              1. Let matches be ? ListPatternInnerMatches of MatchRestElement with arguments subject, cacheGroup and visitedCount.
              2. Return ? FinishListMatch(subject, cacheGroup, matches).
            4. Return ? FinishListMatch(subject, cacheGroup, visitedCount).
            +
            1. Let visitedCount be 0.
            2. If Elision is present, then
              1. If ? GetIteratorNthValueCached(subject, cacheGroup, 0) is not-matched, return false.
              2. Set visitedCount to 1.
            3. If MatchRestElement is present, then
              1. Let matches be ? ListPatternInnerMatches of MatchRestElement with arguments subject, cacheGroup and visitedCount.
              2. Return ? FinishListMatch(subject, cacheGroup, matches).
            4. Return ? FinishListMatch(subject, cacheGroup, visitedCount).
            - MatchList : MatchElementList + MatchList : MatchElementList -
            1. Let matches be ? ListPatternInnerMatches of MatchElementList with arguments subject, cacheGroup and 0.
            2. Return ? FinishListMatch(subject, cacheGroup, matches).
            +
            1. Let matches be ? ListPatternInnerMatches of MatchElementList with arguments subject, cacheGroup and 0.
            2. Return ? FinishListMatch(subject, cacheGroup, matches).
            MatchList : - MatchElementList + MatchElementList , Elisionopt - MatchRestElementopt + MatchRestElementopt -
            1. Let visitedCount be ? ListPatternInnerMatches of MatchElementList with arguments subject, cacheGroup and 0.
            2. If visitedCount is not-matched, return false.
            3. Assert: visitedCount is a non-negative integer.
            4. If Elision is present, then
              1. If ? GetIteratorNthValueCached(subject, cacheGroup, visitedCount) is not-matched, return false.
              2. Set visitedCount to visitedCount + 1.
            5. If MatchRestElement is present, then
              1. Let matches be ? ListPatternInnerMatches of MatchRestElement with arguments subject, cacheGroup and visitedCount.
              2. Return ? FinishListMatch(subject, cacheGroup, matches).
            6. Return ? FinishListMatch(subject, cacheGroup, visitedCount).
            +
            1. Let visitedCount be ? ListPatternInnerMatches of MatchElementList with arguments subject, cacheGroup and 0.
            2. If visitedCount is not-matched, return false.
            3. Assert: visitedCount is a non-negative integer.
            4. If Elision is present, then
              1. If ? GetIteratorNthValueCached(subject, cacheGroup, visitedCount) is not-matched, return false.
              2. Set visitedCount to visitedCount + 1.
            5. If MatchRestElement is present, then
              1. Let matches be ? ListPatternInnerMatches of MatchRestElement with arguments subject, cacheGroup and visitedCount.
              2. Return ? FinishListMatch(subject, cacheGroup, matches).
            6. Return ? FinishListMatch(subject, cacheGroup, visitedCount).

            30.1.12 Runtime Semantics: ListPatternInnerMatches

            The syntax-directed operation ListPatternInnerMatches takes arguments subject (an Iterator Record), cacheGroup (a %Map%), and startIndex (a non-negative integer) and returns either a normal completion containing either a non-negative integer, unlimited or not-matched, or an abrupt completion. It is defined piecewise over the following productions:

            - MatchElementList : MatchElisionElement + MatchElementList : MatchElisionElement -
            1. Return ? ListPatternInnerMatches of MatchElisionElement with arguments subject, cacheGroup and startIndex.
            +
            1. Return ? ListPatternInnerMatches of MatchElisionElement with arguments subject, cacheGroup and startIndex.
            MatchElementList : - MatchElementList + MatchElementList , - MatchElisionElement + MatchElisionElement -
            1. Let visitedCount be ? ListPatternInnerMatches of MatchElementList with arguments subject, cacheGroup and startIndex.
            2. If visitedCount is not-matched, return not-matched.
            3. Assert: visitedCount is a non-negative integer.
            4. Let matches be ? ListPatternInnerMatches of MatchElisionElement with arguments subject, cacheGroup and startIndex + visitedCount.
            5. If matches is not-matched, return not-matched.
            6. Assert: matches is a non-negative integer.
            7. Return visitedCount + matches.
            +
            1. Let visitedCount be ? ListPatternInnerMatches of MatchElementList with arguments subject, cacheGroup and startIndex.
            2. If visitedCount is not-matched, return not-matched.
            3. Assert: visitedCount is a non-negative integer.
            4. Let matches be ? ListPatternInnerMatches of MatchElisionElement with arguments subject, cacheGroup and startIndex + visitedCount.
            5. If matches is not-matched, return not-matched.
            6. Assert: matches is a non-negative integer.
            7. Return visitedCount + matches.
            MatchElisionElement : Elisionopt - MatchElement + MatchElement -
            1. Let visitedCount be 0.
            2. If Elision is present, then
              1. If ? GetIteratorNthValueCached(subject, cacheGroup, startIndex) is not-matched, return not-matched.
              2. Set visitedCount to visitedCount + 1.
            3. Let matches be ? ListPatternInnerMatches of MatchElement with arguments subject, cacheGroup and startIndex + visitedCount.
            4. If matches is not-matched, return not-matched.
            5. Assert: matches is a non-negative integer.
            6. Return visitedCount + matches.
            +
            1. Let visitedCount be 0.
            2. If Elision is present, then
              1. If ? GetIteratorNthValueCached(subject, cacheGroup, startIndex) is not-matched, return not-matched.
              2. Set visitedCount to visitedCount + 1.
            3. Let matches be ? ListPatternInnerMatches of MatchElement with arguments subject, cacheGroup and startIndex + visitedCount.
            4. If matches is not-matched, return not-matched.
            5. Assert: matches is a non-negative integer.
            6. Return visitedCount + matches.
            MatchElement : - MatchPattern + MatchPattern ?opt -
            1. Let value be ? GetIteratorNthValueCached(subject, cacheGroup, startIndex).
            2. If value is not-matched, then
              1. If ? is present, return 1.
              2. Return not-matched.
            3. Let matches be ? MatchPatternMatches of MatchPattern with arguments value and cacheGroup.
            4. If matches is false, return not-matched.
            5. Return 1.
            +
            1. Let value be ? GetIteratorNthValueCached(subject, cacheGroup, startIndex).
            2. If value is not-matched, then
              1. If ? is present, return 1.
              2. Return not-matched.
            3. Let matches be ? MatchPatternMatches of MatchPattern with arguments value and cacheGroup.
            4. If matches is false, return not-matched.
            5. Return 1.
            MatchRestElement : ... @@ -2565,85 +2754,85 @@

            30.1.12 Runtime Semantics: ListPatternInnerMatch MatchRestElement : ... - MatchPattern + MatchPattern -
            1. Let elements be a new empty List.
            2. Let i be startIndex.
            3. Let next be unused.
            4. Repeat, while next is not not-matched,
              1. Set next to ? GetIteratorNthValueCached(subject, cacheGroup, i).
              2. If next is not not-matched, append next to elements.
              3. Set i to i + 1.
            5. Let rest be CreateArrayFromList(elements).
            6. Let matches be ? MatchPatternMatches of MatchPattern with arguments rest and cacheGroup.
            7. If matches is false, return not-matched.
            8. Return unlimited.
            +
            1. Let elements be a new empty List.
            2. Let i be startIndex.
            3. Let next be unused.
            4. Repeat, while next is not not-matched,
              1. Set next to ? GetIteratorNthValueCached(subject, cacheGroup, i).
              2. If next is not not-matched, append next to elements.
              3. Set i to i + 1.
            5. Let rest be CreateArrayFromList(elements).
            6. Let matches be ? MatchPatternMatches of MatchPattern with arguments rest and cacheGroup.
            7. If matches is false, return not-matched.
            8. Return unlimited.

            30.1.13 Runtime Semantics: UnaryAlgebraicPatternMatches

            -

            The syntax-directed operation UnaryAlgebraicPatternMatches takes argument subject (an ECMAScript language value) and returns either a normal completion containing a Boolean or an abrupt completion. It is defined piecewise over the following productions:

            +

            The syntax-directed operation UnaryAlgebraicPatternMatches takes argument subject (an ECMAScript language value) and returns either a normal completion containing a Boolean or an abrupt completion. It is defined piecewise over the following productions:

            - UnaryAlgebraicPattern : PatternMatchingUnaryAlgebraicExpression + UnaryAlgebraicPattern : PatternMatchingUnaryAlgebraicExpression -
            1. Let expr be the Expression that is covered by PatternMatchingUnaryAlgebraicExpression.
            2. Let ref be ? Evaluation of expr.
            3. Let value be ? GetValue(ref).
            4. Return SameValue(subject, value).
            +
            1. Let expr be the Expression that is covered by PatternMatchingUnaryAlgebraicExpression.
            2. Let ref be ? Evaluation of expr.
            3. Let value be ? GetValue(ref).
            4. Return SameValue(subject, value).

            30.1.14 Runtime Semantics: RelationalPatternMatches

            -

            The syntax-directed operation RelationalPatternMatches takes argument subject (an ECMAScript language value) and returns either a normal completion containing a Boolean or an abrupt completion. It is defined piecewise over the following productions:

            +

            The syntax-directed operation RelationalPatternMatches takes argument subject (an ECMAScript language value) and returns either a normal completion containing a Boolean or an abrupt completion. It is defined piecewise over the following productions:

            RelationalPattern : < - PatternMatchingOrderExpression + PatternMatchingOrderExpression -
            1. Let expr be the Expression that is covered by PatternMatchingOrderExpression.
            2. Let ref be ? Evaluation of expr.
            3. Let value be ? GetValue(ref).
            4. Let r be ? IsLessThan(subject, value, true).
            5. If r is undefined, return false. Otherwise, return r.
            +
            1. Let expr be the Expression that is covered by PatternMatchingOrderExpression.
            2. Let ref be ? Evaluation of expr.
            3. Let value be ? GetValue(ref).
            4. Let r be ? IsLessThan(subject, value, true).
            5. If r is undefined, return false. Otherwise, return r.
            RelationalPattern : > - PatternMatchingOrderExpression + PatternMatchingOrderExpression -
            1. Let expr be the Expression that is covered by PatternMatchingOrderExpression.
            2. Let ref be ? Evaluation of expr.
            3. Let value be ? GetValue(ref).
            4. Let r be ? IsLessThan(value, subject, false).
            5. If r is undefined, return false. Otherwise, return r.
            +
            1. Let expr be the Expression that is covered by PatternMatchingOrderExpression.
            2. Let ref be ? Evaluation of expr.
            3. Let value be ? GetValue(ref).
            4. Let r be ? IsLessThan(value, subject, false).
            5. If r is undefined, return false. Otherwise, return r.
            RelationalPattern : <= - PatternMatchingOrderExpression + PatternMatchingOrderExpression -
            1. Let expr be the Expression that is covered by PatternMatchingOrderExpression.
            2. Let ref be ? Evaluation of expr.
            3. Let value be ? GetValue(ref).
            4. Let r be ? IsLessThan(subject, value, true).
            5. If r is either true or undefined, return false. Otherwise, return true.
            +
            1. Let expr be the Expression that is covered by PatternMatchingOrderExpression.
            2. Let ref be ? Evaluation of expr.
            3. Let value be ? GetValue(ref).
            4. Let r be ? IsLessThan(subject, value, true).
            5. If r is either true or undefined, return false. Otherwise, return true.
            RelationalPattern : >= - PatternMatchingOrderExpression + PatternMatchingOrderExpression -
            1. Let expr be the Expression that is covered by PatternMatchingOrderExpression.
            2. Let ref be ? Evaluation of expr.
            3. Let value be ? GetValue(ref).
            4. Let r be ? IsLessThan(value, subject, false).
            5. If r is either true or undefined, return false. Otherwise, return true.
            +
            1. Let expr be the Expression that is covered by PatternMatchingOrderExpression.
            2. Let ref be ? Evaluation of expr.
            3. Let value be ? GetValue(ref).
            4. Let r be ? IsLessThan(value, subject, false).
            5. If r is either true or undefined, return false. Otherwise, return true.
            RelationalPattern : instanceof - PatternMatchingMemberExpression + PatternMatchingMemberExpression -
            1. Let expr be the Expression that is covered by PatternMatchingMemberExpression.
            2. Let ref be ? Evaluation of expr.
            3. Let value be ? GetValue(ref).
            4. Return ? InstanceofOperator(subject, value).
            +
            1. Let expr be the Expression that is covered by PatternMatchingMemberExpression.
            2. Let ref be ? Evaluation of expr.
            3. Let value be ? GetValue(ref).
            4. Return ? InstanceofOperator(subject, value).
            RelationalPattern : in - PatternMatchingMemberExpression + PatternMatchingMemberExpression -
            1. Let key be ? ToPropertyKey(subject).
            2. Let expr be the Expression that is covered by PatternMatchingMemberExpression.
            3. Let ref be ? Evaluation of expr.
            4. Let value be ? GetValue(ref).
            5. If value is not an Object, return false.
            6. Return ? HasProperty(value, key).
            +
            1. Let key be ? ToPropertyKey(subject).
            2. Let expr be the Expression that is covered by PatternMatchingMemberExpression.
            3. Let ref be ? Evaluation of expr.
            4. Let value be ? GetValue(ref).
            5. If value is not an Object, return false.
            6. Return ? HasProperty(value, key).
            Editor's Note
            - The current proposal caches all operations on subject except this. Should we cache the result of ToPropertyKey? + The current proposal caches all operations on the subject except this. Should we cache the result of ToPropertyKey?
            RelationalPattern : has - PatternMatchingStringLikeExpression + PatternMatchingStringLikeExpression -
            1. If subject is not an Object, return false.
            2. Let expr be the Expression that is covered by PatternMatchingStringLikeExpression.
            3. Let ref be ? Evaluation of expr.
            4. Let value be ? GetValue(ref).
            5. Return ? HasProperty(subject, ? ToPropertyKey(value)).
            +
            1. If subject is not an Object, return false.
            2. Let expr be the Expression that is covered by PatternMatchingStringLikeExpression.
            3. Let ref be ? Evaluation of expr.
            4. Let value be ? GetValue(ref).
            5. Return ? HasProperty(subject, ? ToPropertyKey(value)).
            RelationalPattern : has @@ -2655,35 +2844,35 @@

            30.1.14 Runtime Semantics: RelationalPatternMatc RelationalPattern : == - PatternMatchingEqualExpression + PatternMatchingEqualExpression -
            1. Let expr be the Expression that is covered by PatternMatchingEqualExpression.
            2. Let ref be ? Evaluation of expr.
            3. Let value be ? GetValue(ref).
            4. Return ? IsLooselyEqual(subject, value).
            +
            1. Let expr be the Expression that is covered by PatternMatchingEqualExpression.
            2. Let ref be ? Evaluation of expr.
            3. Let value be ? GetValue(ref).
            4. Return ? IsLooselyEqual(subject, value).
            RelationalPattern : != - PatternMatchingEqualExpression + PatternMatchingEqualExpression -
            1. Let expr be the Expression that is covered by PatternMatchingEqualExpression.
            2. Let ref be ? Evaluation of expr.
            3. Let value be ? GetValue(ref).
            4. Let r be ? IsLooselyEqual(subject, value).
            5. If r is true, return false. Otherwise, return true.
            +
            1. Let expr be the Expression that is covered by PatternMatchingEqualExpression.
            2. Let ref be ? Evaluation of expr.
            3. Let value be ? GetValue(ref).
            4. Let r be ? IsLooselyEqual(subject, value).
            5. If r is true, return false. Otherwise, return true.
            RelationalPattern : === - PatternMatchingEqualExpression + PatternMatchingEqualExpression -
            1. Let expr be the Expression that is covered by PatternMatchingEqualExpression.
            2. Let ref be ? Evaluation of expr.
            3. Let value be ? GetValue(ref).
            4. Return IsStrictlyEqual(subject, value).
            +
            1. Let expr be the Expression that is covered by PatternMatchingEqualExpression.
            2. Let ref be ? Evaluation of expr.
            3. Let value be ? GetValue(ref).
            4. Return IsStrictlyEqual(subject, value).
            RelationalPattern : !== - PatternMatchingEqualExpression + PatternMatchingEqualExpression -
            1. Let expr be the Expression that is covered by PatternMatchingEqualExpression.
            2. Let ref be ? Evaluation of expr.
            3. Let value be ? GetValue(ref).
            4. Let r be IsStrictlyEqual(subject, value).
            5. If r is true, return false. Otherwise, return true.
            +
            1. Let expr be the Expression that is covered by PatternMatchingEqualExpression.
            2. Let ref be ? Evaluation of expr.
            3. Let value be ? GetValue(ref).
            4. Let r be IsStrictlyEqual(subject, value).
            5. If r is true, return false. Otherwise, return true.
            @@ -2703,33 +2892,33 @@

            30.1.15 Runtime Semantics: IfPatternMatches

            30.1.16 Runtime Semantics: CombinedMatchPatternMatches

            -

            The syntax-directed operation CombinedMatchPatternMatches takes arguments subject (an ECMAScript language value) and cacheGroup (a %Map%) and returns either a normal completion containing a Boolean or an abrupt completion. It is defined piecewise over the following productions:

            +

            The syntax-directed operation CombinedMatchPatternMatches takes arguments subject (an ECMAScript language value) and cacheGroup (a %Map%) and returns either a normal completion containing a Boolean or an abrupt completion. It is defined piecewise over the following productions:

            CombinedMatchPattern : - MatchPattern + MatchPattern and - MatchPattern + MatchPattern -
            1. Let leftMatches be ? MatchPatternMatches of the first MatchPattern with arguments subject and cacheGroup.
            2. If leftMatches is false, return false.
            3. Return ? MatchPatternMatches of the second MatchPattern with arguments subject and cacheGroup.
            +
            1. Let leftMatches be ? MatchPatternMatches of the first MatchPattern with arguments subject and cacheGroup.
            2. If leftMatches is false, return false.
            3. Return ? MatchPatternMatches of the second MatchPattern with arguments subject and cacheGroup.
            CombinedMatchPattern : - MatchPattern + MatchPattern or - MatchPattern + MatchPattern -
            1. Let leftMatches be ? MatchPatternMatches of the first MatchPattern with arguments subject and cacheGroup.
            2. If leftMatches is true, return true.
            3. Return ? MatchPatternMatches of the second MatchPattern with arguments subject and cacheGroup.
            +
            1. Let leftMatches be ? MatchPatternMatches of the first MatchPattern with arguments subject and cacheGroup.
            2. If leftMatches is true, return true.
            3. Return ? MatchPatternMatches of the second MatchPattern with arguments subject and cacheGroup.
            CombinedMatchPattern : not - MatchPattern + MatchPattern -
            1. Let matches be ? MatchPatternMatches of MatchPattern with arguments subject and cacheGroup.
            2. If matches is true, return false.
            3. Return true.
            +
            1. Let matches be ? MatchPatternMatches of MatchPattern with arguments subject and cacheGroup.
            2. If matches is true, return false.
            3. Return true.
            @@ -2741,22 +2930,22 @@

            Syntax

            CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] [no LineTerminator here] { - MatchStatementClauses[?Yield, ?Await] + MatchStatementClauses[?Yield, ?Await] ; }
            MatchStatementClauses[Yield, Await] : - MatchStatementClause[?Yield, ?Await] + MatchStatementClause[?Yield, ?Await] - MatchStatementClauses[?Yield, ?Await] + MatchStatementClauses[?Yield, ?Await] ; - MatchStatementClause[?Yield, ?Await] + MatchStatementClause[?Yield, ?Await] - MatchStatementClauses[?Yield, ?Await] + MatchStatementClauses[?Yield, ?Await] ; default : @@ -2770,35 +2959,35 @@

            Syntax

            MatchStatementClause[Yield, Await] : - MatchPattern[?Yield, ?Await] + MatchPattern[?Yield, ?Await] : Statement[?Yield, ?Await]
            - Note
            -
            match (value) {
            +      
            match (expr) {
               { type: "return", let value }: return value;
               { type: "throw", let error }: throw error;
               default: {
            -    console.error("unknown value", value);
            -    process.exit();
            +    console.error("unknown completion value", expr);
            +    process.exit(1);
               },
             }
            - Editor's Note

            This feature is not a consensus in the champion group.

            -

            This production can be replaced by the is expression. The code example above can be written as:

            -
            if (value is { type: "return", let value }) return value;
            -else if (value is { type: "throw", let error }) throw error;
            +      

            + This production can be replaced by the is expression. + The code example above can be written as: +

            +
            if (expr is { type: "return", let value }) return value;
            +else if (expr is { type: "throw", let error }) throw error;
             else {
            -  console.error("unknown value", value);
            -  process.exit();
            +  console.error("unknown completion value", expr);
            +  process.exit(1);
             }
            - Editor's Note
            It is syntactically impossible to have a match statement that
              @@ -2814,18 +3003,18 @@

              30.2.1 Static Semantics: Early Errors

              MatchStatement : CoverCallExpressionAndAsyncArrowHead { - MatchStatementClauses + MatchStatementClauses ; } MatchStatementClauses : - MatchStatementClauses + MatchStatementClauses ; default : @@ -2841,7 +3030,7 @@

              30.2.1 Static Semantics: Early Errors

              MatchStatementClause : - MatchPattern + MatchPattern : Statement @@ -2858,35 +3047,35 @@

              30.2.2 Runtime Semantics: Evaluation

              MatchStatement : CoverCallExpressionAndAsyncArrowHead { - MatchStatementClauses + MatchStatementClauses ; }
              -
              1. Let head be the MatchHead that is covered by CoverCallExpressionAndAsyncArrowHead.
              2. Let subjectParseNode be the Expression of head.
              3. Let subjectRef be the ? Evaluation of subjectParseNode.
              4. Let subject be ? GetValue(subjectRef).
              5. Let cacheGroup be CreateMatchCache().
              6. Let matchCompletion be Completion(MatchStatementClausesEvaluation of MatchStatementClauses with arguments subject and cacheGroup).
              7. Perform ? UpdateEmpty(matchCompletion, undefined).
              8. Return Completion(FinishMatch(matchCompletion, cacheGroup)).
              +
              1. Let head be the MatchHead that is covered by CoverCallExpressionAndAsyncArrowHead.
              2. Let subjectParseNode be the Expression of head.
              3. Let subjectRef be the ? Evaluation of subjectParseNode.
              4. Let subject be ? GetValue(subjectRef).
              5. Let cacheGroup be CreateMatchCache().
              6. Let matchCompletion be Completion(MatchStatementClausesEvaluation of MatchStatementClauses with arguments subject and cacheGroup).
              7. Perform ? UpdateEmpty(matchCompletion, undefined).
              8. Return Completion(FinishMatch(matchCompletion, cacheGroup)).

              30.2.3 Runtime Semantics: MatchStatementClausesEvaluation

              -

              The syntax-directed operation MatchStatementClausesEvaluation takes arguments subject (an ECMAScript language value) and cacheGroup (a %Map%) and returns either a normal completion containing either an ECMAScript language value, empty or not-matched, or an abrupt completion. It is defined piecewise over the following productions:

              +

              The syntax-directed operation MatchStatementClausesEvaluation takes arguments subject (an ECMAScript language value) and cacheGroup (a %Map%) and returns either a normal completion containing either an ECMAScript language value, empty or not-matched, or an abrupt completion. It is defined piecewise over the following productions:

              - MatchStatementClauses : MatchStatementClause + MatchStatementClauses : MatchStatementClause -
              1. Return ? MatchStatementClauseEvaluation of MatchStatementClause with arguments subject and cacheGroup.
              +
              1. Return ? MatchStatementClauseEvaluation of MatchStatementClause with arguments subject and cacheGroup.
              MatchStatementClauses : - MatchStatementClauses + MatchStatementClauses ; - MatchStatementClause + MatchStatementClause -
              1. Let result be ? MatchStatementClausesEvaluation of MatchStatementClauses with arguments subject and cacheGroup.
              2. If result is not not-matched, return result.
              3. Return ? MatchStatementClauseEvaluation of MatchStatementClause with arguments subject and cacheGroup.
              +
              1. Let result be ? MatchStatementClausesEvaluation of MatchStatementClauses with arguments subject and cacheGroup.
              2. If result is not not-matched, return result.
              3. Return ? MatchStatementClauseEvaluation of MatchStatementClause with arguments subject and cacheGroup.
              MatchStatementClauses : - MatchStatementClauses + MatchStatementClauses ; default : @@ -2894,7 +3083,7 @@

              30.2.3 Runtime Semantics: MatchStatementClausesE -
              1. Let result be ? MatchStatementClausesEvaluation of MatchStatementClauses with arguments subject and cacheGroup.
              2. If result is not not-matched, return result.
              3. Return ? Evaluation of Statement.
              +
              1. Let result be ? MatchStatementClausesEvaluation of MatchStatementClauses with arguments subject and cacheGroup.
              2. If result is not not-matched, return result.
              3. Return ? Evaluation of Statement.
              MatchStatementClauses : default @@ -2905,45 +3094,46 @@

              30.2.3 Runtime Semantics: MatchStatementClausesE
              1. Return ? Evaluation of Statement.
              +

              30.2.4 Runtime Semantics: MatchStatementClauseEvaluation

              -

              The syntax-directed operation MatchStatementClauseEvaluation takes arguments subject (an ECMAScript language value) and cacheGroup (a %Map%) and returns either a normal completion containing either an ECMAScript language value, empty or not-matched, or an abrupt completion. It is defined piecewise over the following productions:

              +

              The syntax-directed operation MatchStatementClauseEvaluation takes arguments subject (an ECMAScript language value) and cacheGroup (a %Map%) and returns either a normal completion containing either an ECMAScript language value, empty or not-matched, or an abrupt completion. It is defined piecewise over the following productions:

              MatchStatementClause : - MatchPattern + MatchPattern : Statement -
              1. Let matches be ? MatchPatternMatches of MatchPattern with arguments subject and cacheGroup.
              2. If matches is true, return ? Evaluation of Statement.
              3. Return not-matched.
              +
              1. Let matches be ? MatchPatternMatches of MatchPattern with arguments subject and cacheGroup.
              2. If matches is true, return ? Evaluation of Statement.
              3. Return not-matched.
              -

              30.3 Match Expression

              +

              30.3 The match Expression

              Syntax

              MatchExpression[Yield, Await] : CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] [no LineTerminator here] { - MatchExpressionClauses[?Yield, ?Await] + MatchExpressionClauses[?Yield, ?Await] ; } MatchExpressionClauses[Yield, Await] : - MatchExpressionClause[?Yield, ?Await] + MatchExpressionClause[?Yield, ?Await] - MatchExpressionClauses[?Yield, ?Await] + MatchExpressionClauses[?Yield, ?Await] ; - MatchExpressionClause[?Yield, ?Await] + MatchExpressionClause[?Yield, ?Await] - MatchExpressionClauses[?Yield, ?Await] + MatchExpressionClauses[?Yield, ?Await] ; default : @@ -2957,13 +3147,12 @@

              Syntax

              MatchExpressionClause[Yield, Await] : - MatchPattern[?Yield, ?Await] + MatchPattern[?Yield, ?Await] : Expression[+In, ?Yield, ?Await]
              -

              Supplemental Syntax

              When processing an instance of the production
              @@ -2971,7 +3160,7 @@

              Supplemental Syntax

              MatchExpression : CoverCallExpressionAndAsyncArrowHead { - MatchExpressionClauses + MatchExpressionClauses ; } @@ -2989,7 +3178,6 @@

              Supplemental Syntax

              - Note
              const result = match (value) {
                 { type: "add", let lhs, let rhs }: lhs + rhs,
              @@ -2999,7 +3187,7 @@ 

              Supplemental Syntax

              }
              Editor's Note
              - This production can be replaced by the is expression. + This production can be replaced by the is expression. The code example above can be written as:
              const result =
                 value is { type: "add", var lhs, var rhs } ? lhs + rhs :
              @@ -3026,14 +3214,14 @@ 

              30.3.1 Static Semantics: Early Errors

              MatchExpression : CoverCallExpressionAndAsyncArrowHead { - MatchExpressionClauses + MatchExpressionClauses ; } @@ -3043,35 +3231,35 @@

              30.3.2 Runtime Semantics: Evaluation

              MatchExpression : CoverCallExpressionAndAsyncArrowHead { - MatchExpressionClauses + MatchExpressionClauses ; } -
              1. Let head be the MatchHead that is covered by CoverCallExpressionAndAsyncArrowHead.
              2. Let subjectParseNode be the Expression of head.
              3. Let subjectRef be the ? Evaluation of subjectParseNode.
              4. Let subject be ? GetValue(subjectRef).
              5. Let cacheGroup be CreateMatchCache().
              6. Let matchCompletion be Completion(MatchExpressionClausesEvaluation of MatchExpressionClauses with arguments subject and cacheGroup).
              7. Let result be Completion(FinishMatch(matchCompletion, cacheGroup)).
              8. Assert: result is a normal completion or an abrupt completion.
              9. Return result.
              +
              1. Let head be the MatchHead that is covered by CoverCallExpressionAndAsyncArrowHead.
              2. Let subjectParseNode be the Expression of head.
              3. Let subjectRef be the ? Evaluation of subjectParseNode.
              4. Let subject be ? GetValue(subjectRef).
              5. Let cacheGroup be CreateMatchCache().
              6. Let matchCompletion be Completion(MatchExpressionClausesEvaluation of MatchExpressionClauses with arguments subject and cacheGroup).
              7. Let result be Completion(FinishMatch(matchCompletion, cacheGroup)).
              8. Assert: result is a normal completion or an abrupt completion.
              9. Return result.

              30.3.3 Runtime Semantics: MatchExpressionClausesEvaluation

              -

              The syntax-directed operation MatchExpressionClausesEvaluation takes arguments subject (an ECMAScript language value) and cacheGroup (a %Map%) and returns either a normal completion containing either an ECMAScript language value or not-matched, or an abrupt completion. It is defined piecewise over the following productions:

              +

              The syntax-directed operation MatchExpressionClausesEvaluation takes arguments subject (an ECMAScript language value) and cacheGroup (a %Map%) and returns either a normal completion containing either an ECMAScript language value or not-matched, or an abrupt completion. It is defined piecewise over the following productions:

              - MatchExpressionClauses : MatchExpressionClause + MatchExpressionClauses : MatchExpressionClause -
              1. Return ? MatchExpressionClauseEvaluation of MatchExpressionClause with arguments subject and cacheGroup.
              +
              1. Return ? MatchExpressionClauseEvaluation of MatchExpressionClause with arguments subject and cacheGroup.
              MatchExpressionClauses : - MatchExpressionClauses + MatchExpressionClauses ; - MatchExpressionClause + MatchExpressionClause -
              1. Let result be ? MatchExpressionClausesEvaluation of MatchExpressionClauses with arguments subject and cacheGroup.
              2. If result is an ECMAScript language value, return result.
              3. Return ? MatchExpressionClauseEvaluation of MatchExpressionClause with arguments subject and cacheGroup.
              +
              1. Let result be ? MatchExpressionClausesEvaluation of MatchExpressionClauses with arguments subject and cacheGroup.
              2. If result is an ECMAScript language value, return result.
              3. Return ? MatchExpressionClauseEvaluation of MatchExpressionClause with arguments subject and cacheGroup.
              MatchExpressionClauses : - MatchExpressionClauses + MatchExpressionClauses ; default : @@ -3079,7 +3267,7 @@

              30.3.3 Runtime Semantics: MatchExpressionClauses -
              1. Let result be ? MatchExpressionClausesEvaluation of MatchExpressionClauses with arguments subject and cacheGroup.
              2. If result is an ECMAScript language value, return result.
              3. Return ? Evaluation of Expression.
              +
              1. Let result be ? MatchExpressionClausesEvaluation of MatchExpressionClauses with arguments subject and cacheGroup.
              2. If result is an ECMAScript language value, return result.
              3. Return ? Evaluation of Expression.
              MatchExpressionClauses : default @@ -3093,16 +3281,16 @@

              30.3.3 Runtime Semantics: MatchExpressionClauses

              30.3.4 Runtime Semantics: MatchExpressionClauseEvaluation

              -

              The syntax-directed operation MatchExpressionClauseEvaluation takes arguments subject (an ECMAScript language value) and cacheGroup (a %Map%) and returns either a normal completion containing either an ECMAScript language value or not-matched, or an abrupt completion. It is defined piecewise over the following productions:

              +

              The syntax-directed operation MatchExpressionClauseEvaluation takes arguments subject (an ECMAScript language value) and cacheGroup (a %Map%) and returns either a normal completion containing either an ECMAScript language value or not-matched, or an abrupt completion. It is defined piecewise over the following productions:

              MatchExpressionClause : - MatchPattern + MatchPattern : Expression -
              1. Let matches be ? MatchPatternMatches of MatchPattern with arguments subject and cacheGroup.
              2. If matches is true, return ? Evaluation of Expression.
              3. Return not-matched.
              +
              1. Let matches be ? MatchPatternMatches of MatchPattern with arguments subject and cacheGroup.
              2. If matches is true, return ? Evaluation of Expression.
              3. Return not-matched.
              @@ -3111,22 +3299,21 @@

              30.4 Abstract Operations for Pattern Matching

              30.4.1 InvokeCustomMatcher ( matcher, subject, cacheGroup, kind, receiver )

              -

              The abstract operation InvokeCustomMatcher takes arguments matcher (an ECMAScript language value), subject (an ECMAScript language value), cacheGroup (a %Map%), kind (boolean or list), and receiver (an ECMAScript language value) and returns either a normal completion containing either a Boolean or an Object, or an abrupt completion. It performs the following steps when called:

              -
              1. If matcher is not an Object, return SameValueZero(matcher, subject).
              2. Let f be ? Get(matcher, @@customMatcher).
              3. If f is undefined, return SameValueNonNumber(matcher, subject).
              4. If kind is boolean, let hint be "boolean".
              5. Else, let hint be "list".
              6. Let result be ? Call(f, matcher, « subject, hint, receiver »).
              7. If result is false, return false.
              8. If result is true and kind is boolean, return true.
              9. If result is not an Object, throw a TypeError exception.
              10. Perform ? GetIteratorCached(result, cacheGroup).
              11. If kind is boolean, return true.
              12. Return result.
              +

              The abstract operation InvokeCustomMatcher takes arguments matcher (an ECMAScript language value), subject (an ECMAScript language value), cacheGroup (a %Map%), kind (boolean or list), and receiver (an ECMAScript language value) and returns either a normal completion containing either a Boolean or an Object, or an abrupt completion. It performs the following steps when called:

              +
              1. If matcher is not an Object, return SameValueZero(matcher, subject).
              2. Let f be ? Get(matcher, @@customMatcher).
              3. If f is undefined, return SameValueNonNumber(matcher, subject).
              4. If kind is boolean, let hint be "boolean".
              5. Else, let hint be "list".
              6. Let result be ? Call(f, matcher, « subject, hint, receiver »).
              7. If result is false, return false.
              8. If result is true and kind is boolean, return true.
              9. If result is not an Object, throw a TypeError exception.
              10. Perform ? GetIteratorCached(result, cacheGroup).
              11. If kind is boolean, return true.
              12. Return result.
              Editor's Note
              - The hint parameter is not a consensus in the champion group yet. This design is to solve runtime performance concerns about custom matchers. The extractor proposal may add a new hint object for the following syntax. + The hint parameter is not a consensus in the champion group yet. This design is to solve runtime performance concerns about custom matchers. The extractor proposal may add a new hint object for the following syntax.
              const Point{ x, y } = expr;

              30.4.2 ValidateCustomMatcherHint ( hint [ , kind ] )

              -

              The abstract operation ValidateCustomMatcherHint takes argument hint (an ECMAScript language value) and optional argument kind (boolean or list) and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:

              +

              The abstract operation ValidateCustomMatcherHint takes argument hint (an ECMAScript language value) and optional argument kind (boolean or list) and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:

              1. If hint is not "boolean" or "list", throw a TypeError exception.
              2. If kind is not present, return unused.
              3. If hint is "boolean" and kind is list, throw a TypeError exception.
              4. If hint is "list" and kind is boolean, throw a TypeError exception.
              - - Editor's Note
              - The following sections describe how pattern matching match the subject with a cache. Those sections use %Map%, %Set% and %Array% internally. This is for the convenience. Implementations don't have to actually create those data structures behind the scene. + Editor's Note
              + The following sections describe how pattern matching matches the subject with a cache. Those sections use %Map%, %Set% and %Array% internally. This is for the convenience. Implementations don't have to actually create those data structures behind the scenes. It is a spec bug if operations on cache objects trigger any user code.
              @@ -3138,46 +3325,46 @@

              30.4.3 CreateMatchCache ( )

              30.4.4 GetMatchCache ( subject, cacheGroup )

              -

              The abstract operation GetMatchCache takes arguments subject (an ECMAScript language value) and cacheGroup (a %Map%) and returns an ECMAScript language value. It performs the following steps when called:

              -
              1. Assert: cacheGroup is created by CreateMatchCache and used internally for pattern-matching.
              2. If ! Call(%Map.prototype.has%, cacheGroup, « subject ») is true, then
                1. Return ! Call(%Map.prototype.get%, cacheGroup, « subject »).
              3. Let cache be OrdinaryObjectCreate(null).
              4. Perform ! CreateDataPropertyOrThrow(cache, "Has", ! Construct(%Map%)).
              5. Perform ! CreateDataPropertyOrThrow(cache, "Get", ! Construct(%Map%)).
              6. Perform ! CreateDataPropertyOrThrow(cache, "Iterator", undefined).
              7. Perform ! CreateDataPropertyOrThrow(cache, "IteratedValues", ! ArrayCreate(0, null)).
              8. Perform ! Call(%Map.prototype.set%, cacheGroup, « subject, cache »).
              9. Return cache.
              +

              The abstract operation GetMatchCache takes arguments subject (an ECMAScript language value) and cacheGroup (a %Map%) and returns an ECMAScript language value. It performs the following steps when called:

              +
              1. Assert: cacheGroup is created by CreateMatchCache and used internally for pattern-matching.
              2. If ! Call(%Map.prototype.has%, cacheGroup, « subject ») is true, then
                1. Return ! Call(%Map.prototype.get%, cacheGroup, « subject »).
              3. Let cache be OrdinaryObjectCreate(null).
              4. Perform ! CreateDataPropertyOrThrow(cache, "Has", ! Construct(%Map%)).
              5. Perform ! CreateDataPropertyOrThrow(cache, "Get", ! Construct(%Map%)).
              6. Perform ! CreateDataPropertyOrThrow(cache, "Iterator", undefined).
              7. Perform ! CreateDataPropertyOrThrow(cache, "IteratedValues", ! ArrayCreate(0, null)).
              8. Perform ! Call(%Map.prototype.set%, cacheGroup, « subject, cache »).
              9. Return cache.

              30.4.5 HasPropertyCached ( subject, cacheGroup, propertyName )

              -

              The abstract operation HasPropertyCached takes arguments subject (an ECMAScript language value), cacheGroup (a %Map%), and propertyName (a property key) and returns either a normal completion containing a Boolean or an abrupt completion. It performs the following steps when called:

              -
              1. Assert: cacheGroup is created by CreateMatchCache and used internally for pattern-matching.
              2. Let cache be ! Get(GetMatchCache(subject, cacheGroup), "Has").
              3. Let hasCache be ! Call(%Map.prototype.has%, cache, « propertyName »).
              4. If hasCache is true, return ! Call(%Map.prototype.get%, cache, « propertyName »).
              5. Let result be ? HasProperty(subject, propertyName).
              6. Perform ! Call(%Map.prototype.set%, cache, « propertyName, result »).
              7. Return result.
              +

              The abstract operation HasPropertyCached takes arguments subject (an ECMAScript language value), cacheGroup (a %Map%), and propertyName (a property key) and returns either a normal completion containing a Boolean or an abrupt completion. It performs the following steps when called:

              +
              1. Assert: cacheGroup is created by CreateMatchCache and used internally for pattern-matching.
              2. Let cache be ! Get(GetMatchCache(subject, cacheGroup), "Has").
              3. Let hasCache be ! Call(%Map.prototype.has%, cache, « propertyName »).
              4. If hasCache is true, return ! Call(%Map.prototype.get%, cache, « propertyName »).
              5. Let result be ? HasProperty(subject, propertyName).
              6. Perform ! Call(%Map.prototype.set%, cache, « propertyName, result »).
              7. Return result.

              30.4.6 GetCached ( subject, cacheGroup, propertyName )

              -

              The abstract operation GetCached takes arguments subject (an ECMAScript language value), cacheGroup (a %Map%), and propertyName (a property key) and returns either a normal completion containing an ECMAScript language value or an abrupt completion. It performs the following steps when called:

              -
              1. Assert: cacheGroup is created by CreateMatchCache and used internally for pattern-matching.
              2. Let cache be ! Get(GetMatchCache(subject, cacheGroup), "Get").
              3. Let hasCache be ! Call(%Map.prototype.has%, cache, « propertyName »).
              4. If hasCache is true, return ! Call(%Map.prototype.get%, cache, « propertyName »).
              5. Let result be ? Get(subject, propertyName).
              6. Perform ! Call(%Map.prototype.set%, cache, « propertyName, result »).
              7. Return result.
              +

              The abstract operation GetCached takes arguments subject (an ECMAScript language value), cacheGroup (a %Map%), and propertyName (a property key) and returns either a normal completion containing an ECMAScript language value or an abrupt completion. It performs the following steps when called:

              +
              1. Assert: cacheGroup is created by CreateMatchCache and used internally for pattern-matching.
              2. Let cache be ! Get(GetMatchCache(subject, cacheGroup), "Get").
              3. Let hasCache be ! Call(%Map.prototype.has%, cache, « propertyName »).
              4. If hasCache is true, return ! Call(%Map.prototype.get%, cache, « propertyName »).
              5. Let result be ? Get(subject, propertyName).
              6. Perform ! Call(%Map.prototype.set%, cache, « propertyName, result »).
              7. Return result.

              30.4.7 GetIteratorCached ( subject, cacheGroup )

              -

              The abstract operation GetIteratorCached takes arguments subject (an ECMAScript language value) and cacheGroup (a %Map%) and returns either a normal completion containing an Iterator Record or an abrupt completion. It performs the following steps when called:

              -
              1. Assert: cacheGroup is created by CreateMatchCache and used internally for pattern-matching.
              2. Let cache be GetMatchCache(subject, cacheGroup).
              3. Let iteratorRecordObject be ! Get(cache, "Iterator").
              4. If iteratorRecordObject is not undefined, return iteratorRecordObject.[[CachedIterator]].
              5. Let f be ? GetCached(subject, cacheGroup, @@iterator).
              6. Let iteratorRecord be ? GetIteratorFromMethod(subject, f).
              7. Set iteratorRecordObject to OrdinaryObjectCreate(null, « [[CachedIterator]] »).
              8. Set iteratorRecordObject.[[CachedIterator]] to iteratorRecord.
              9. Perform ! Set(cache, "Iterator", iteratorRecordObject, true).
              10. Perform ! Call(%Set.prototype.add%, ! Get(cacheGroup, "IteratorsToClose"), « iteratorRecordObject »).
              11. Return iteratorRecordObject.[[CachedIterator]].
              +

              The abstract operation GetIteratorCached takes arguments subject (an ECMAScript language value) and cacheGroup (a %Map%) and returns either a normal completion containing an Iterator Record or an abrupt completion. It performs the following steps when called:

              +
              1. Assert: cacheGroup is created by CreateMatchCache and used internally for pattern-matching.
              2. Let cache be GetMatchCache(subject, cacheGroup).
              3. Let iteratorRecordObject be ! Get(cache, "Iterator").
              4. If iteratorRecordObject is not undefined, return iteratorRecordObject.[[CachedIterator]].
              5. Let f be ? GetCached(subject, cacheGroup, @@iterator).
              6. Let iteratorRecord be ? GetIteratorFromMethod(subject, f).
              7. Set iteratorRecordObject to OrdinaryObjectCreate(null, « [[CachedIterator]] »).
              8. Set iteratorRecordObject.[[CachedIterator]] to iteratorRecord.
              9. Perform ! Set(cache, "Iterator", iteratorRecordObject, true).
              10. Perform ! Call(%Set.prototype.add%, ! Get(cacheGroup, "IteratorsToClose"), « iteratorRecordObject »).
              11. Return iteratorRecordObject.[[CachedIterator]].
              Editor's Note
              - The [[CachedIterator]] field only used in GetIteratorCached and CloseCachedIterators. Iterator Records are not ECMAScript language values and cannot be Set on an object, therefore an object is created to wrap the Iterator Record. + The [[CachedIterator]] field is only used in GetIteratorCached and CloseCachedIterators. Iterator Records are not ECMAScript language values and cannot be Set on an object, therefore an object is created to wrap the Iterator Record.

              30.4.8 IteratorStepCached ( iterator, cacheGroup )

              -

              The abstract operation IteratorStepCached takes arguments iterator (an Iterator Record) and cacheGroup (a %Map%) and returns either a normal completion containing either an ECMAScript language value or not-matched, or an abrupt completion. It performs the following steps when called:

              -
              1. Assert: cacheGroup is created by CreateMatchCache and used internally for pattern-matching.
              2. If iterator.[[Done]] is true, return not-matched.
              3. Let cache be GetMatchCache(iterator, cacheGroup).
              4. Let iteratedValues be ! Get(cache, "IteratedValues").
              5. Let iteratorResult be Completion(IteratorStep(iterator)).
              6. If iteratorResult is an abrupt completion, set iterator.[[Done]] to true.
              7. ReturnIfAbrupt(iteratorResult).
              8. If iteratorResult is false, then
                1. Set iterator.[[Done]] to true.
                2. Return not-matched.
              9. Let value be Completion(IteratorValue(iteratorResult)).
              10. If value is an abrupt completion, set iterator.[[Done]] to true.
              11. ReturnIfAbrupt(value).
              12. Perform ! Call(%Array.prototype.push%, iteratedValues, « value »).
              13. Return value.
              +

              The abstract operation IteratorStepCached takes arguments iterator (an Iterator Record) and cacheGroup (a %Map%) and returns either a normal completion containing either an ECMAScript language value or not-matched, or an abrupt completion. It performs the following steps when called:

              +
              1. Assert: cacheGroup is created by CreateMatchCache and used internally for pattern-matching.
              2. If iterator.[[Done]] is true, return not-matched.
              3. Let cache be GetMatchCache(iterator, cacheGroup).
              4. Let iteratedValues be ! Get(cache, "IteratedValues").
              5. Let iteratorResult be Completion(IteratorStep(iterator)).
              6. If iteratorResult is an abrupt completion, set iterator.[[Done]] to true.
              7. ReturnIfAbrupt(iteratorResult).
              8. If iteratorResult is false, then
                1. Set iterator.[[Done]] to true.
                2. Return not-matched.
              9. Let value be Completion(IteratorValue(iteratorResult)).
              10. If value is an abrupt completion, set iterator.[[Done]] to true.
              11. ReturnIfAbrupt(value).
              12. Perform ! Call(%Array.prototype.push%, iteratedValues, « value »).
              13. Return value.

              30.4.9 GetIteratorNthValueCached ( iterator, cacheGroup, n )

              -

              The abstract operation GetIteratorNthValueCached takes arguments iterator (an Iterator Record), cacheGroup (a %Map%), and n (a non-negative integer) and returns either a normal completion containing either an ECMAScript language value or not-matched, or an abrupt completion. It performs the following steps when called:

              -
              1. NOTE: 0th is the first value.
              2. Assert: cacheGroup is created by CreateMatchCache and used internally for pattern-matching.
              3. Let iteratedValues be ! Get(GetMatchCache(iterator, cacheGroup), "IteratedValues").
              4. Let nthItem be ! iteratedValues.[[GetOwnProperty]](n).
              5. If nthItem is not undefined, return nthItem.[[Value]].
              6. Assert: ! LengthOfArrayLike(iteratedValues) is n. For example, iteratedValues has 0 values, n should be 0 to get the first value from the iterator.
              7. Return ? IteratorStepCached(iterator, cacheGroup).
              +

              The abstract operation GetIteratorNthValueCached takes arguments iterator (an Iterator Record), cacheGroup (a %Map%), and n (a non-negative integer) and returns either a normal completion containing either an ECMAScript language value or not-matched, or an abrupt completion. It performs the following steps when called:

              +
              1. NOTE: 0th is the first value.
              2. Assert: cacheGroup is created by CreateMatchCache and used internally for pattern-matching.
              3. Let iteratedValues be ! Get(GetMatchCache(iterator, cacheGroup), "IteratedValues").
              4. Let nthItem be ! iteratedValues.[[GetOwnProperty]](n).
              5. If nthItem is not undefined, return nthItem.[[Value]].
              6. Assert: ! LengthOfArrayLike(iteratedValues) is n. For example, iteratedValues has 0 values, n should be 0 to get the first value from the iterator.
              7. Return ? IteratorStepCached(iterator, cacheGroup).
              Editor's Note
              - This abstract operation get the nth (start from 0) value of the iterator, and run IteratorStepCached if it is not cached in the cacheGroup. - For all n > 1, this abstract operation expect this invariant: + This abstract operation gets the nth (start from 0) value of the iterator, and runs IteratorStepCached if it is not cached in the cacheGroup. + For all n > 1, this abstract operation expects these invariants:
                -
              • The evaluation of MatchList always evaluate the n-1th value before evaluate the nth.
              • +
              • The evaluation of MatchList always evaluates the n-1th value before evaluating the nth.
              • If the nth value is exists ([[GetOwnProperty]](n) returns a Property Descriptor), the n-1th value also exists.
              • If the nth value does not exist and the iterator.[[Done]] is true, there is no further call with a bigger n parameter with the same cacheGroup and iterator.
              @@ -3186,23 +3373,23 @@

              30.4.9 GetIteratorNthValueCached ( iterator

              30.4.10 FinishListMatch ( subject, cacheGroup, expectedLength )

              -

              The abstract operation FinishListMatch takes arguments subject (an ECMAScript language value), cacheGroup (a %Map%), and expectedLength (either a non-negative integer, not-matched or unlimited) and returns either a normal completion containing a Boolean or an abrupt completion. It performs the following steps when called:

              -
              1. If expectedLength is not-matched, return false.
              2. If expectedLength is unlimited, return true.
              3. Let iterator be ? GetIteratorCached(subject, cacheGroup).
              4. Let cache be GetMatchCache(iterator, cacheGroup).
              5. Let cachedLength be ! LengthOfArrayLike(! Get(cache, "IteratedValues")).
              6. If cachedLength > expectedLength, return false.
              7. Assert: cachedLength is expectedLength.
              8. If iterator.[[Done]] is true, return true.
              9. Let iteratorResult be ? GetIteratorNthValueCached(iterator, cacheGroup, expectedLength).
              10. If iteratorResult is not-matched, return true.
              11. Return false.
              +

              The abstract operation FinishListMatch takes arguments subject (an ECMAScript language value), cacheGroup (a %Map%), and expectedLength (either a non-negative integer, not-matched or unlimited) and returns either a normal completion containing a Boolean or an abrupt completion. It performs the following steps when called:

              +
              1. If expectedLength is not-matched, return false.
              2. If expectedLength is unlimited, return true.
              3. Let iterator be ? GetIteratorCached(subject, cacheGroup).
              4. Let cache be GetMatchCache(iterator, cacheGroup).
              5. Let cachedLength be ! LengthOfArrayLike(! Get(cache, "IteratedValues")).
              6. If cachedLength > expectedLength, return false.
              7. Assert: cachedLength is expectedLength.
              8. If iterator.[[Done]] is true, return true.
              9. Let iteratorResult be ? GetIteratorNthValueCached(iterator, cacheGroup, expectedLength).
              10. If iteratorResult is not-matched, return true.
              11. Return false.
              Editor's Note
              -

              This abstract operation is called at the final step of the evaluation of MatchList.

              +

              This abstract operation is called the final step of the evaluation of MatchList.

              - For example, when match with [], the expectedLength is 0. - This abstract operation check if cachedLength is 0. + For example, when matching with [], the expectedLength is 0. + This abstract operation checks if cachedLength is 0. If the iterator is done, the match succeeds. If the iterator is not done, it will try to get the 0th value from the iterator. If there is a 0th value, the match fails.

              - Another example, when match with [1, 2, 3], the expectedLength is 3. - This abstract operation check if cachedLength is 3. + Another example is when matching with [1, 2, 3], the expectedLength is 3. + This abstract operation checks if cachedLength is 3. If the iterator is done, the match succeeds. - If the iterator is not done, it will try to get the 3th (remeber we start from the 0th) value from the iterator. - If there is a 3th (which means the cachedLength is now 4) value, the match fails. + If the iterator is not done, it will try to get the 3th (remember we start from the 0th) value from the iterator. + If there is a 3rd (which means the cachedLength is now 4) value, the match fails.

              @@ -3210,15 +3397,25 @@

              30.4.10 FinishListMatch ( subject,

              30.4.11 FinishMatch ( matchCompletion, cacheGroup )

              The abstract operation FinishMatch takes arguments matchCompletion (a Completion Record) and cacheGroup (a %Map%) and returns a Completion Record. It performs the following steps when called:

              -
              1. Assert: cacheGroup is created by CreateMatchCache and used internally for pattern-matching.
              2. If matchCompletion is a normal completion and matchCompletion.[[Value]] is not-matched, then
                1. Set matchCompletion to ThrowCompletion(a newly created TypeError).
              3. Let iterators be a new empty List.
              4. For each element value of ! Get(cacheGroup, "IteratorsToClose").[[SetData]], do
                1. Assert: value.[[Value]] is not empty.
                2. Let iteratorRecordObject be ! Get(value.[[Value]], "IteratorsToClose").
                3. Append iteratorRecordObject.[[CachedIterator]] to iterators.
              5. Let errors be a new empty List.
              6. If matchCompletion is an abrupt completion, append matchCompletion.[[Value]] to errors.
              7. For each element iterator of iterators, do
                1. If iterator.[[Done]] is false, then
                  1. Let closeResult be Completion(IteratorClose(iterator, Completion(undefined))).
                  2. If closeResult is an abrupt completion, append closeResult.[[Value]] to errors.
              8. If errors is not empty, then
                1. If length of errors is 1, return ThrowCompletion(errors[0]).
                2. Let error be a newly created AggregateError object.
                3. Perform ! DefinePropertyOrThrow(error, "errors", PropertyDescriptor { [[Configurable]]: true, [[Enumerable]]: false, [[Writable]]: true, [[Value]]: CreateArrayFromList(errors) }).
                4. Return ThrowCompletion(error).
              9. Return matchCompletion.
              +
              1. Assert: cacheGroup is created by CreateMatchCache and used internally for pattern-matching.
              2. If matchCompletion is a normal completion and matchCompletion.[[Value]] is not-matched, then
                1. Set matchCompletion to ThrowCompletion(a newly created TypeError).
              3. Let iterators be a new empty List.
              4. For each element value of ! Get(cacheGroup, "IteratorsToClose").[[SetData]], do
                1. Assert: value.[[Value]] is not empty.
                2. Let iteratorRecordObject be ! Get(value.[[Value]], "IteratorsToClose").
                3. Append iteratorRecordObject.[[CachedIterator]] to iterators.
              5. Let errors be a new empty List.
              6. If matchCompletion is an abrupt completion, append matchCompletion.[[Value]] to errors.
              7. For each element iterator of iterators, do
                1. If iterator.[[Done]] is false, then
                  1. Let closeResult be Completion(IteratorClose(iterator, Completion(undefined))).
                  2. If closeResult is an abrupt completion, append closeResult.[[Value]] to errors.
              8. If errors is not empty, then
                1. If length of errors is 1, return ThrowCompletion(errors[0]).
                2. Let error be a newly created AggregateError object.
                3. Perform ! DefinePropertyOrThrow(error, "errors", PropertyDescriptor { [[Configurable]]: true, [[Enumerable]]: false, [[Writable]]: true, [[Value]]: CreateArrayFromList(errors) }).
                4. Return ThrowCompletion(error).
              9. Return matchCompletion.
              Editor's Note
              -

              If any error occurs when closing iterators, this abstract operation ignores the matchCompletion and return an abrupt completion. This might be problematic when the matchCompletion is a Return Completion, Continue Completion or a Break Completion.

              -
              for (const value of iter) {
              -  match (value) {
              -    [...]: continue
              +        

              If any error occurs when closing iterators, this abstract operation ignores the matchCompletion and returns an abrupt completion. This might be problematic when the matchCompletion is a Return Completion, Continue Completion, or a Break Completion.

              +
              for (const iterator of iterators) {
              +  try {
              +    match(iterator) {
              +      [String, ...] and [...let list]: callback(list);
              +      [...]: continue;
              +    }
              +  } catch {
                 }
               }
              -

              In the code example above, if the only branch of the MatchStatement matches, but IteratorClose throws, the Continue Completion will be dropped and throw the error.

              +

              + In the code example above, + if the second branch matches (and returns a continue completion), + but the iterator throws an error when closing, + the continue will be ignored, + and the catch block will be evaluated. +

              @@ -3755,7 +3952,7 @@

              B.1.2 Regular Expressions Patterns

              B.1.2.9 Static Semantics: ParsePattern ( patternText, u, v, canCreateBinding )

              -

              Add support of NamedCaptureGroupsBindings parameter like 22.2.3.4.

              +

              Add support of NamedCaptureGroupsBindings parameter like 22.2.3.4.

              @@ -3769,59 +3966,12 @@

              B.2.4 Additional Properties of the RegExp.protot

              B.2.4.1 RegExp.prototype.compile ( pattern, flags )

              This method performs the following steps when called:

              -
              1. Let O be the this value.
              2. Perform ? RequireInternalSlot(O, [[RegExpMatcher]]).
              3. If pattern is an Object and pattern has a [[RegExpMatcher]] internal slot, then
                1. If flags is not undefined, throw a TypeError exception.
                2. Let P be pattern.[[OriginalSource]].
                3. Let F be pattern.[[OriginalFlags]].
              4. Else,
                1. Let P be pattern.
                2. Let F be flags.
              5. Return ? RegExpInitialize(O, P, F, false).
              +
              1. Let O be the this value.
              2. Perform ? RequireInternalSlot(O, [[RegExpMatcher]]).
              3. If pattern is an Object and pattern has a [[RegExpMatcher]] internal slot, then
                1. If flags is not undefined, throw a TypeError exception.
                2. Let P be pattern.[[OriginalSource]].
                3. Let F be pattern.[[OriginalFlags]].
              4. Else,
                1. Let P be pattern.
                2. Let F be flags.
              5. Return ? RegExpInitialize(O, P, F, false).
              - - - -

              C Editor's notes

              - - -

              C.1 Layering

              -

              The pattern-matching champion group designed this proposal with a layering approach. It does not mean the proposal is an MVP. The champion group wishes to ship the proposal as a whole when possible, but we can drop some features if there is strong pushback from the committee.

              -

              This approach allows the champion group to consider how all features combine and also how the proposal should behave if any of the features are missing.

              -

              A feature will have a note if

              -
                -
              • it is a convenient feature instead of a necessary feature.
              • -
              • not all champion group members represent the hope to include it.
              • -
              -
              - - -

              C.2 Code example

              -

              The code example in the patterns section will be in one of the forms:

              -
              value is <pattern>;
              -when <pattern>: ...,
              -

              The first form is an expression that can be used in any expression position.

              -
              const isOk = response is { ok: true, status: > 100 and < 400 };
              -

              The second form is a clause of the match expression that is only available inside a match expression.

              -
              const type = match(expr) {
              -  { ok: true, status: > 100 and < 400 }: "ok",
              -  { ok: false, status: 404 }: "not found",
              -  default: "unknown",
              -};
              -

              The "when" keyword was removed, but for the readability of code examples, "when" is kept.

              -

              This document prefers the is form unless the declaration pattern (let x) appears.

              -
              - - -

              C.3 Other TODOs:

              -

              TODOs that not in the specification.

              - -
              -

              D Copyright & Software License

              +

              C Copyright & Software License

              Copyright Notice

              © 2023 Daniel Rosenwasser,Jack Works,Jordan Harband,Mark Cohen,Ross Kirsling,Tab Atkins

              diff --git a/spec.emu b/spec.emu index fc3a587..0120335 100644 --- a/spec.emu +++ b/spec.emu @@ -1,8 +1,5 @@ - - -

            - MatchProperty : @@ -1963,9 +2150,9 @@ contributors:
          • It is a Syntax Error if |PropertyName| is a |LiteralPropertyName| and PropName of |LiteralPropertyName| is *"__proto__"*.
          
          -        value is { __proto__: null }; // Syntax Error
          -        value is { "__proto__": null }; // Syntax Error
          -        value is { ["__proto__"]: null }; // no Syntax Error
          +        if (expr is { __proto__: null, property?: void }) {} // Syntax Error
          +        if (expr is { "__proto__": null, property?: void }) {} // Syntax Error
          +        if (expr is { ["__proto__"]: null, property?: void }) {} // no Syntax Error
                 
          MatchRestElement : @@ -1979,8 +2166,9 @@ contributors:
        • This is not a consensus in the champion group.
        
        -        when { x: 1, y: 2, ...rest }: ..., // Syntax Error
        -        when { x: 1, y: 2, ...(isEmpty) }: ..., // no Syntax Error, call isEmpty with the rest object
        +        if (expr is { x: 0, y: 0, ...rest }) {} // Syntax Error
        +        if (expr is { x: 0, y: 0, ...let rest }) {} // no Syntax Error, bind rest properties to _rest_
        +        if (expr is { x: 0, y: 0, ...(isEmpty) }) {} // no Syntax Error, call isEmpty with the rest object
               
        MatchProperty : @@ -1992,10 +2180,11 @@ contributors:
      • This is not a consensus in the champion group.
      
      -        when { x }: ..., // Syntax Error
      -        when { x: void }: ..., // no Syntax Error
      +        if (expr is { x, y, z }) {} // Syntax Error
      +        if (expr is { x: void, y: void, z: void }) {} // no Syntax Error
      +        if (expr is { let x, let y, let z }) {} // no Syntax Error
       
      -        when { if }: ..., // no Syntax Error
      +        if (expr is { if }) {} // no Syntax Error
             
      MatchList : @@ -2021,7 +2210,6 @@ contributors: value is [1, 2?, ...]; // no Syntax Error

    - RegularExpressionPattern : @@ -2030,25 +2218,30 @@ contributors:
    • It is a Syntax Error if IsValidRegularExpressionLiteral(|RegularExpressionLiteral|, *true*) is *false*.
    • -
    • It is a Syntax Error if RegularExpressionLiteral of |RegularExpressionLiteral| does not contain *"g"*.
    • -
    • This early error should be added after Normative: allow duplicate named capture groups lands:
      It is a Syntax Error if for any name _x_, some of the |GroupSpecifier| are using the production that has |VarOrLetOrConst| and some of the |GroupSpecifier| don't.
    • +
    • It is a Syntax Error if FlagText of |RegularExpressionLiteral| does not contain *"g"*.
    • +
    • + This early error should be added after + Normative: allow duplicate named capture groups + lands: +
      + It is a Syntax Error if, for any name _x_, some of the |GroupSpecifier|s are using the production that has |VarOrLetOrConst| and some of the |GroupSpecifier|s don't. +
    - CombinedMatchPattern : MatchPattern `and` MatchPattern
      -
    • It is a Syntax Error if either of |MatchPattern| is |CombinedMatchPattern| and does not match this production.
    • +
    • It is a Syntax Error if either of |MatchPattern|s is |CombinedMatchPattern| and does not match this production.
    CombinedMatchPattern : MatchPattern `or` MatchPattern
      -
    • It is a Syntax Error if either of |MatchPattern| is |CombinedMatchPattern| and does not match this production.
    • +
    • It is a Syntax Error if either of |MatchPattern|s is |CombinedMatchPattern| and does not match this production.
    CombinedMatchPattern : @@ -2756,7 +2949,7 @@ contributors: 1. Return ? HasProperty(_value_, _key_). - The current proposal caches all operations on _subject_ except this. Should we cache the result of ToPropertyKey? + The current proposal caches all operations on the _subject_ except this. Should we cache the result of ToPropertyKey? RelationalPattern : `has` PatternMatchingStringLikeExpression @@ -2886,33 +3079,33 @@ contributors: MatchStatementClause[Yield, Await] : MatchPattern[?Yield, ?Await] `:` Statement[?Yield, ?Await] -
    
    -        match (value) {
    +        match (expr) {
               { type: "return", let value }: return value;
               { type: "throw", let error }: throw error;
               default: {
    -            console.error("unknown value", value);
    -            process.exit();
    +            console.error("unknown completion value", expr);
    +            process.exit(1);
               },
             }
           
    -

    This feature is not a consensus in the champion group.

    -

    This production can be replaced by the `is` expression. The code example above can be written as:

    +

    + This production can be replaced by the `is` expression. + The code example above can be written as: +

    
    -        if (value is { type: "return", let value }) return value;
    -        else if (value is { type: "throw", let error }) throw error;
    +        if (expr is { type: "return", let value }) return value;
    +        else if (expr is { type: "throw", let error }) throw error;
             else {
    -          console.error("unknown value", value);
    -          process.exit();
    +          console.error("unknown completion value", expr);
    +          process.exit(1);
             }
           
    - It is syntactically impossible to have a match statement that
      @@ -2995,6 +3188,7 @@ contributors: 1. Return ? Evaluation of |Statement|. +

      Runtime Semantics: MatchStatementClauseEvaluation ( @@ -3016,7 +3210,7 @@ contributors: -

      Match Expression

      +

      The `match` Expression

      Syntax

      MatchExpression[Yield, Await] : @@ -3031,7 +3225,6 @@ contributors: MatchExpressionClause[Yield, Await] : MatchPattern[?Yield, ?Await] `:` Expression[+In, ?Yield, ?Await] -

      Supplemental Syntax

      When processing an instance of the production
      @@ -3042,7 +3235,6 @@ contributors: MatchHead : `match` [no LineTerminator here] `(` Expression `)` -

      
               const result = match (value) {
      @@ -3194,7 +3386,7 @@ contributors:
               1. Return _result_.
             
             
      -        The hint parameter is not a consensus in the champion group yet. This design is to solve runtime performance concerns about custom matchers. The extractor proposal may add a new hint ~object~ for the following syntax.
      +        The _hint_ parameter is not a consensus in the champion group yet. This design is to solve runtime performance concerns about custom matchers. The extractor proposal may add a new hint ~object~ for the following syntax.
               
      
                 const Point{ x, y } = expr;
               
      @@ -3217,9 +3409,8 @@ contributors: 1. If _hint_ is *"list"* and _kind_ is ~boolean~, throw a *TypeError* exception. - - - The following sections describe how pattern matching match the _subject_ with a cache. Those sections use %Map%, %Set% and %Array% internally. This is for the convenience. Implementations don't have to actually create those data structures behind the scene. + + The following sections describe how pattern matching matches the _subject_ with a cache. Those sections use %Map%, %Set% and %Array% internally. This is for the convenience. Implementations don't have to actually create those data structures behind the scenes. It is a spec bug if operations on cache objects trigger any user code. @@ -3323,7 +3514,7 @@ contributors: 1. Return _iteratorRecordObject_.[[CachedIterator]]. - The [[CachedIterator]] field only used in GetIteratorCached and CloseCachedIterators. Iterator Records are not ECMAScript language values and cannot be Set on an object, therefore an object is created to wrap the Iterator Record. + The [[CachedIterator]] field is only used in GetIteratorCached and CloseCachedIterators. Iterator Records are not ECMAScript language values and cannot be Set on an object, therefore an object is created to wrap the Iterator Record. @@ -3375,10 +3566,10 @@ contributors: 1. Return ? IteratorStepCached(_iterator_, _cacheGroup_). - This abstract operation get the nth (start from 0) value of the _iterator_, and run IteratorStepCached if it is not cached in the _cacheGroup_. - For all _n_ > 1, this abstract operation expect this invariant: + This abstract operation gets the nth (start from 0) value of the _iterator_, and runs IteratorStepCached if it is not cached in the _cacheGroup_. + For all _n_ > 1, this abstract operation expects these invariants:
        -
      • The evaluation of |MatchList| always evaluate the _n_-1th value before evaluate the _n_th.
      • +
      • The evaluation of |MatchList| always evaluates the _n_-1th value before evaluating the _n_th.
      • If the _n_th value is exists ([[GetOwnProperty]](_n_) returns a Property Descriptor), the _n_-1th value also exists.
      • If the _n_th value does not exist and the _iterator_.[[Done]] is *true*, there is no further call with a bigger _n_ parameter with the same _cacheGroup_ and _iterator_.
      @@ -3409,20 +3600,20 @@ contributors: 1. Return *false*. -

      This abstract operation is called at the final step of the evaluation of |MatchList|.

      +

      This abstract operation is called the final step of the evaluation of |MatchList|.

      - For example, when match with `[]`, the _expectedLength_ is 0. - This abstract operation check if _cachedLength_ is 0. + For example, when matching with `[]`, the _expectedLength_ is 0. + This abstract operation checks if _cachedLength_ is 0. If the _iterator_ is done, the match succeeds. If the _iterator_ is not done, it will try to get the 0th value from the iterator. If there is a 0th value, the match fails.

      - Another example, when match with `[1, 2, 3]`, the _expectedLength_ is 3. - This abstract operation check if _cachedLength_ is 3. + Another example is when matching with `[1, 2, 3]`, the _expectedLength_ is 3. + This abstract operation checks if _cachedLength_ is 3. If the _iterator_ is done, the match succeeds. - If the _iterator_ is not done, it will try to get the 3th (remeber we start from the 0th) value from the iterator. - If there is a 3th (which means the _cachedLength_ is now 4) value, the match fails. + If the _iterator_ is not done, it will try to get the 3th (remember we start from the 0th) value from the iterator. + If there is a 3rd (which means the _cachedLength_ is now 4) value, the match fails.

      @@ -3459,15 +3650,25 @@ contributors: 1. Return _matchCompletion_. -

      If any error occurs when closing iterators, this abstract operation ignores the _matchCompletion_ and return an abrupt completion. This might be problematic when the _matchCompletion_ is a Return Completion, Continue Completion or a Break Completion.

      +

      If any error occurs when closing iterators, this abstract operation ignores the _matchCompletion_ and returns an abrupt completion. This might be problematic when the _matchCompletion_ is a Return Completion, Continue Completion, or a Break Completion.

      
      -          for (const value of iter) {
      -            match (value) {
      -              [...]: continue
      +          for (const iterator of iterators) {
      +            try {
      +              match(iterator) {
      +                [String, ...] and [...let list]: callback(list);
      +                [...]: continue;
      +              }
      +            } catch {
                   }
                 }
               
      -

      In the code example above, if the only branch of the |MatchStatement| matches, but IteratorClose throws, the Continue Completion will be dropped and throw the error.

      +

      + In the code example above, + if the second branch matches (and returns a continue completion), + but the iterator throws an error when closing, + the `continue` will be ignored, + and the `catch` block will be evaluated. +

      @@ -3574,56 +3775,3 @@ contributors: - - -

      Editor's notes

      - - -

      Layering

      -

      The pattern-matching champion group designed this proposal with a layering approach. It does not mean the proposal is an MVP. The champion group wishes to ship the proposal as a whole when possible, but we can drop some features if there is strong pushback from the committee.

      -

      This approach allows the champion group to consider how all features combine and also how the proposal should behave if any of the features are missing.

      -

      A feature will have a note if

      -
        -
      • it is a convenient feature instead of a necessary feature.
      • -
      • not all champion group members represent the hope to include it.
      • -
      -
      - - -

      Code example

      -

      The code example in the patterns section will be in one of the forms:

      -
      
      -      value is <pattern>;
      -      when <pattern>: ...,
      -    
      -

      The first form is an expression that can be used in any expression position.

      -
      
      -      const isOk = response is { ok: true, status: > 100 and < 400 };
      -    
      -

      The second form is a clause of the match expression that is only available inside a match expression.

      -
      
      -      const type = match(expr) {
      -        { ok: true, status: > 100 and < 400 }: "ok",
      -        { ok: false, status: 404 }: "not found",
      -        default: "unknown",
      -      };
      -    
      -

      The "when" keyword was removed, but for the readability of code examples, "when" is kept.

      -

      This document prefers the `is` form unless the declaration pattern (`let x`) appears.

      -
      - - -

      Other TODOs:

      -

      TODOs that not in the specification.

      -
        -
      • - Scope and bindings -
          -
        • Basic case.
        • -
        • Work with `for` loop (CreatePerIterationEnvironment).
        • -
        • Work with function parameter.
        • -
        -
      • -
      -
      -
      From b007e43ccec5e8de4d4153494e3898afbd57e5ef Mon Sep 17 00:00:00 2001 From: Jack Works Date: Mon, 20 Nov 2023 23:50:46 +0800 Subject: [PATCH 50/71] fix: typo --- spec.emu | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/spec.emu b/spec.emu index 0120335..1060da5 100644 --- a/spec.emu +++ b/spec.emu @@ -497,7 +497,7 @@ contributors:
      - This feature can be replaced by the . + This feature can be replaced by . The code example above can be written as:
      
               const isOk = match (response) {
      @@ -1694,7 +1694,7 @@ contributors:
           
           
             The production `void` can be removed.
      -      The consensus is to add `void` for both `using` declaration and deconstruction.
      +      The consensus is to add `void` for both `using` declaration and destructuring.
             It might be a follow-on proposal.
             
      
               if (expr is [let x, void, void]) {}
      @@ -2009,14 +2009,14 @@ contributors:
               but it can be replaced. This production adds the ability to do the unforgeable `typeof` test.
             

      
      -        if (expr is { value: String }) {}
      +        if (expr is { version: 2 or 3, value: String }) {}
               // can be written as this if built-ins might be replaced:
               const isString = {
                 [Symbol.customMatcher](val) {
                   return typeof val === "string";
                 }
               };
      -        if (expr is { value: isString }) {}
      +        if (expr is { version: 2 or 3, value: isString }) {}
             
      @@ -2047,7 +2047,7 @@ contributors: This feature is an opt-out of the custom matcher, to always do the `===` check.

      
      -        if (expr is { type: "create", initializers: [createX] }) {}
      +        if (expr is { type: "create", initializers: [=== createX] }) {}
               // can be written as:
               function isCreateX(val) { return val === createX; }
               if (expr is { type: "create", initializers: [isCreateX] }) {}
      
      From 60b1c4e974145ed9ad41a1f0ac1cb9ceebb532b2 Mon Sep 17 00:00:00 2001
      From: Jack-Works 
      Date: Mon, 20 Nov 2023 15:51:19 +0000
      Subject: [PATCH 51/71] fixup: [spec] `npm run build`
      
      ---
       assets/ecmarkup.css | 69 +++++++++++++++++++++++++++++++++++++--------
       assets/ecmarkup.js  | 37 ++++++++++++++++++++----
       index.html          | 16 ++++++-----
       3 files changed, 98 insertions(+), 24 deletions(-)
      
      diff --git a/assets/ecmarkup.css b/assets/ecmarkup.css
      index 630a302..2bd77c0 100644
      --- a/assets/ecmarkup.css
      +++ b/assets/ecmarkup.css
      @@ -894,26 +894,68 @@ tr.del > td {
         display: block;
       }
       
      +#menu-pins .unpin-all {
      +  border: none;
      +  background: #ccc;
      +  border-radius: 4px;
      +  height: 18px;
      +  font-size: 12px;
      +  margin: 0 5px 0 10px;
      +  font-family: IBM Plex Sans;
      +}
      +#menu-pins .unpin-all:hover {
      +  background: #ddd;
      +}
      +
       #menu-pins-list {
         margin: 0;
         padding: 0;
         counter-reset: pins-counter;
       }
       
      +#menu-pins-list > li {
      +  display: flex;
      +  align-items: stretch;
      +  gap: 4px;
      +  margin: 3px 1px;
      +  border-radius: 4px;
      +}
      +
      +#menu-pins-list > li > a {
      +  flex-grow: 1;
      +  align-self: center;
      +}
      +
      +#menu-pins-list > li:before,
      +#menu-pins-list > li > .unpin {
      +  flex-shrink: 0;
      +  flex-grow: 0;
      +  text-align: center;
      +  padding: 1px 3px;
      +  border-radius: 4px;
      +  background: none;
      +  border: none;
      +}
      +#menu-pins-list > li:before,
      +#menu-pins-list > li > .unpin:hover {
      +  background: #ccc;
      +}
      +
      +#menu-pins-list > li > .unpin,
      +#menu-pins .unpin-all {
      +  cursor: pointer;
      +}
      +#menu-pins-list > li > .unpin:hover,
      +#menu-pins .unpin-all:hover {
      +  color: #bb1212;
      +}
      +
       #menu-pins-list > li:before {
         content: counter(pins-counter);
         counter-increment: pins-counter;
      -  display: inline-block;
      -  width: 25px;
      -  text-align: center;
      -  border: 1px solid #bbb;
      -  padding: 2px;
      -  margin: 4px;
      -  box-sizing: border-box;
      -  line-height: 1em;
      -  background-color: #ccc;
      -  border-radius: 4px;
      +  font-size: 16px;
       }
      +
       #menu-toc > ol {
         padding: 0;
         flex-grow: 1;
      @@ -1010,7 +1052,6 @@ tr.del > td {
         flex-grow: 0;
         flex-shrink: 0;
         font-size: 80%;
      -  cursor: row-resize;
         user-select: none;
       }
       
      @@ -1285,12 +1326,16 @@ li.menu-search-result-term:before {
         flex-direction: column;
       }
       
      +#references-pane > .menu-pane-header {
      +  cursor: row-resize;
      +}
      +
       #references-pane-container.active {
         display: flex;
       }
       
       #references-pane-close:after {
      -  content: '✖';
      +  content: '\2716';
         float: right;
         cursor: pointer;
       }
      diff --git a/assets/ecmarkup.js b/assets/ecmarkup.js
      index 881cce1..b11acb7 100644
      --- a/assets/ecmarkup.js
      +++ b/assets/ecmarkup.js
      @@ -350,6 +350,14 @@ function Menu() {
         this._pinnedIds = {};
         this.loadPinEntries();
       
      +  // unpin all button
      +  document
      +    .querySelector('#menu-pins .unpin-all')
      +    .addEventListener('click', this.unpinAll.bind(this));
      +
      +  // individual unpinning buttons
      +  this.$pinList.addEventListener('click', this.pinListClick.bind(this));
      +
         // toggle menu
         this.$toggle.addEventListener('click', this.toggle.bind(this));
       
      @@ -399,8 +407,8 @@ Menu.prototype.documentKeydown = function (e) {
         e.stopPropagation();
         if (e.keyCode === 80) {
           this.togglePinEntry();
      -  } else if (e.keyCode > 48 && e.keyCode < 58) {
      -    this.selectPin(e.keyCode - 49);
      +  } else if (e.keyCode >= 48 && e.keyCode < 58) {
      +    this.selectPin((e.keyCode - 9) % 10);
         }
       };
       
      @@ -562,6 +570,7 @@ Menu.prototype.addPinEntry = function (id) {
           return;
         }
       
      +  let text;
         if (entry.type === 'clause') {
           let prefix;
           if (entry.number) {
      @@ -570,11 +579,14 @@ Menu.prototype.addPinEntry = function (id) {
             prefix = '';
           }
           // prettier-ignore
      -    this.$pinList.innerHTML += `
    • ${prefix}${entry.titleHTML}
    • `; + text = `${prefix}${entry.titleHTML}`; } else { - this.$pinList.innerHTML += `
    • ${getKey(entry)}
    • `; + text = getKey(entry); } + let link = `${text}`; + this.$pinList.innerHTML += `
    • ${link}
    • `; + if (Object.keys(this._pinnedIds).length === 0) { this.showPins(); } @@ -583,7 +595,7 @@ Menu.prototype.addPinEntry = function (id) { }; Menu.prototype.removePinEntry = function (id) { - let item = this.$pinList.querySelector(`a[href="${makeLinkToId(id)}"]`).parentNode; + let item = this.$pinList.querySelector(`li[data-section-id="${id}"]`); this.$pinList.removeChild(item); delete this._pinnedIds[id]; if (Object.keys(this._pinnedIds).length === 0) { @@ -593,6 +605,21 @@ Menu.prototype.removePinEntry = function (id) { this.persistPinEntries(); }; +Menu.prototype.unpinAll = function () { + for (let id of Object.keys(this._pinnedIds)) { + this.removePinEntry(id); + } +}; + +Menu.prototype.pinListClick = function (event) { + if (event?.target?.classList.contains('unpin')) { + let id = event.target.parentNode.dataset.sectionId; + if (id) { + this.removePinEntry(id); + } + } +}; + Menu.prototype.persistPinEntries = function () { try { if (!window.localStorage) return; diff --git a/index.html b/index.html index b343cfb..abf01aa 100644 --- a/index.html +++ b/index.html @@ -1,15 +1,17 @@ -Pattern Matching
      +Pattern Matching
      • Toggle shortcuts help?
      • Toggle "can call user code" annotationsu
      • Jump to search box/
      • +
      • Toggle pinning of the current clausep
      • +
      • Jump to nth pin1-9

      Stage 1 Draft / November 18, 2023

      Pattern Matching

      +

      Stage 1 Draft / November 20, 2023

      Pattern Matching