@@ -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
@@ -1096,26 +1094,17 @@ class MatchError(Exception):
1096
1094
pass
1097
1095
1098
1096
1099
- def match_guard (env : Env , guard : Optional [Object ]) -> bool :
1100
- if guard is None :
1101
- return True
1102
- return eval_exp (env , guard ) == Symbol ("true" )
1103
-
1104
-
1105
- def match (obj : Object , pattern : Object , env : Optional [Env ] = None , guard : Optional [Object ] = None ) -> Optional [Env ]:
1106
- if env is None :
1107
- env = {}
1097
+ def match (obj : Object , pattern : Object ) -> Optional [Env ]:
1108
1098
if isinstance (pattern , Int ):
1109
- return {} if isinstance (obj , Int ) and obj .value == pattern .value and match_guard ( env , guard ) else None
1099
+ return {} if isinstance (obj , Int ) and obj .value == pattern .value else None
1110
1100
if isinstance (pattern , Float ):
1111
1101
raise MatchError ("pattern matching is not supported for Floats" )
1112
1102
if isinstance (pattern , String ):
1113
- return {} if isinstance (obj , String ) and obj .value == pattern .value and match_guard ( env , guard ) else None
1103
+ return {} if isinstance (obj , String ) and obj .value == pattern .value else None
1114
1104
if isinstance (pattern , Var ):
1115
- env = {** env , pattern .name : obj }
1116
- return env if match_guard (env , guard ) else None
1105
+ return {pattern .name : obj }
1117
1106
if isinstance (pattern , Symbol ):
1118
- return {} if isinstance (obj , Symbol ) and obj .value == pattern .value and match_guard ( env , guard ) else None
1107
+ return {} if isinstance (obj , Symbol ) and obj .value == pattern .value else None
1119
1108
if isinstance (pattern , Record ):
1120
1109
if not isinstance (obj , Record ):
1121
1110
return None
@@ -1135,7 +1124,7 @@ def match(obj: Object, pattern: Object, env: Optional[Env] = None, guard: Option
1135
1124
result .update (part )
1136
1125
if not use_spread and len (pattern .data ) != len (obj .data ):
1137
1126
return None
1138
- return result if match_guard ( result , guard ) else None
1127
+ return result
1139
1128
if isinstance (pattern , List ):
1140
1129
if not isinstance (obj , List ):
1141
1130
return None
@@ -1158,7 +1147,7 @@ def match(obj: Object, pattern: Object, env: Optional[Env] = None, guard: Option
1158
1147
result .update (part )
1159
1148
if not use_spread and len (pattern .items ) != len (obj .items ):
1160
1149
return None
1161
- return result if match_guard ( result , guard ) else None
1150
+ return result
1162
1151
raise NotImplementedError (f"match not implemented for { type (pattern ).__name__ } " )
1163
1152
1164
1153
@@ -2377,12 +2366,6 @@ def test_parse_multiple_guards(self) -> None:
2377
2366
),
2378
2367
)
2379
2368
2380
- def test_parse_guard_pipe (self ) -> None :
2381
- self .assertEqual (
2382
- parse (tokenize ("| x guard x |> f -> x" )),
2383
- MatchFunction ([MatchCase (Var ("x" ), Apply (Var ("f" ), Var ("x" )), Var ("x" ))]),
2384
- )
2385
-
2386
2369
2387
2370
class MatchTests (unittest .TestCase ):
2388
2371
def test_match_with_equal_ints_returns_empty_dict (self ) -> None :
0 commit comments