@@ -305,6 +305,7 @@ def xp(n: float) -> Prec:
305
305
"::" : lp (2000 ),
306
306
"@" : rp (1001 ),
307
307
"" : rp (1000 ),
308
+ "guard" : rp (5.5 ),
308
309
">>" : lp (14 ),
309
310
"<<" : lp (14 ),
310
311
"^" : rp (13 ),
@@ -328,7 +329,6 @@ def xp(n: float) -> Prec:
328
329
"||" : rp (7 ),
329
330
"|>" : rp (6 ),
330
331
"<|" : lp (6 ),
331
- "guard" : rp (5.5 ),
332
332
"->" : lp (5 ),
333
333
"|" : rp (4.5 ),
334
334
":" : lp (4.5 ),
@@ -345,9 +345,7 @@ def xp(n: float) -> Prec:
345
345
HIGHEST_PREC : float = max (max (p .pl , p .pr ) for p in PS .values ())
346
346
347
347
348
- # TODO(max): Consider making "guard" an operator with only punctuation (but
349
- # leave syntax-level "guard" keyword)
350
- OPER_CHARS = set (c for c in "" .join (PS .keys ()) if not c .isalpha ())
348
+ OPER_CHARS = set ("" .join (PS .keys ())) - set ("guard" )
351
349
assert " " not in OPER_CHARS
352
350
353
351
@@ -1093,26 +1091,17 @@ class MatchError(Exception):
1093
1091
pass
1094
1092
1095
1093
1096
- def match_guard (env : Env , guard : Optional [Object ]) -> bool :
1097
- if guard is None :
1098
- return True
1099
- return eval_exp (env , guard ) == Symbol ("true" )
1100
-
1101
-
1102
- def match (obj : Object , pattern : Object , env : Optional [Env ] = None , guard : Optional [Object ] = None ) -> Optional [Env ]:
1103
- if env is None :
1104
- env = {}
1094
+ def match (obj : Object , pattern : Object ) -> Optional [Env ]:
1105
1095
if isinstance (pattern , Int ):
1106
- return {} if isinstance (obj , Int ) and obj .value == pattern .value and match_guard ( env , guard ) else None
1096
+ return {} if isinstance (obj , Int ) and obj .value == pattern .value else None
1107
1097
if isinstance (pattern , Float ):
1108
1098
raise MatchError ("pattern matching is not supported for Floats" )
1109
1099
if isinstance (pattern , String ):
1110
- return {} if isinstance (obj , String ) and obj .value == pattern .value and match_guard ( env , guard ) else None
1100
+ return {} if isinstance (obj , String ) and obj .value == pattern .value else None
1111
1101
if isinstance (pattern , Var ):
1112
- env = {** env , pattern .name : obj }
1113
- return env if match_guard (env , guard ) else None
1102
+ return {pattern .name : obj }
1114
1103
if isinstance (pattern , Symbol ):
1115
- return {} if isinstance (obj , Symbol ) and obj .value == pattern .value and match_guard ( env , guard ) else None
1104
+ return {} if isinstance (obj , Symbol ) and obj .value == pattern .value else None
1116
1105
if isinstance (pattern , Record ):
1117
1106
if not isinstance (obj , Record ):
1118
1107
return None
@@ -1132,7 +1121,7 @@ def match(obj: Object, pattern: Object, env: Optional[Env] = None, guard: Option
1132
1121
result .update (part )
1133
1122
if not use_spread and len (pattern .data ) != len (obj .data ):
1134
1123
return None
1135
- return result if match_guard ( result , guard ) else None
1124
+ return result
1136
1125
if isinstance (pattern , List ):
1137
1126
if not isinstance (obj , List ):
1138
1127
return None
@@ -1155,7 +1144,7 @@ def match(obj: Object, pattern: Object, env: Optional[Env] = None, guard: Option
1155
1144
result .update (part )
1156
1145
if not use_spread and len (pattern .items ) != len (obj .items ):
1157
1146
return None
1158
- return result if match_guard ( result , guard ) else None
1147
+ return result
1159
1148
raise NotImplementedError (f"match not implemented for { type (pattern ).__name__ } " )
1160
1149
1161
1150
@@ -2378,12 +2367,6 @@ def test_parse_multiple_guards(self) -> None:
2378
2367
),
2379
2368
)
2380
2369
2381
- def test_parse_guard_pipe (self ) -> None :
2382
- self .assertEqual (
2383
- parse (tokenize ("| x guard x |> f -> x" )),
2384
- MatchFunction ([MatchCase (Var ("x" ), Apply (Var ("f" ), Var ("x" )), Var ("x" ))]),
2385
- )
2386
-
2387
2370
2388
2371
class MatchTests (unittest .TestCase ):
2389
2372
def test_match_with_equal_ints_returns_empty_dict (self ) -> None :
0 commit comments