@@ -305,6 +305,7 @@ def xp(n: float) -> Prec:
305305 "::" : lp (2000 ),
306306 "@" : rp (1001 ),
307307 "" : rp (1000 ),
308+ "guard" : rp (5.5 ),
308309 ">>" : lp (14 ),
309310 "<<" : lp (14 ),
310311 "^" : rp (13 ),
@@ -328,7 +329,6 @@ def xp(n: float) -> Prec:
328329 "||" : rp (7 ),
329330 "|>" : rp (6 ),
330331 "<|" : lp (6 ),
331- "guard" : rp (5.5 ),
332332 "->" : lp (5 ),
333333 "|" : rp (4.5 ),
334334 ":" : lp (4.5 ),
@@ -345,9 +345,7 @@ def xp(n: float) -> Prec:
345345HIGHEST_PREC : float = max (max (p .pl , p .pr ) for p in PS .values ())
346346
347347
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" )
351349assert " " not in OPER_CHARS
352350
353351
@@ -1093,26 +1091,17 @@ class MatchError(Exception):
10931091 pass
10941092
10951093
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 ]:
11051095 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
11071097 if isinstance (pattern , Float ):
11081098 raise MatchError ("pattern matching is not supported for Floats" )
11091099 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
11111101 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 }
11141103 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
11161105 if isinstance (pattern , Record ):
11171106 if not isinstance (obj , Record ):
11181107 return None
@@ -1132,7 +1121,7 @@ def match(obj: Object, pattern: Object, env: Optional[Env] = None, guard: Option
11321121 result .update (part )
11331122 if not use_spread and len (pattern .data ) != len (obj .data ):
11341123 return None
1135- return result if match_guard ( result , guard ) else None
1124+ return result
11361125 if isinstance (pattern , List ):
11371126 if not isinstance (obj , List ):
11381127 return None
@@ -1155,7 +1144,7 @@ def match(obj: Object, pattern: Object, env: Optional[Env] = None, guard: Option
11551144 result .update (part )
11561145 if not use_spread and len (pattern .items ) != len (obj .items ):
11571146 return None
1158- return result if match_guard ( result , guard ) else None
1147+ return result
11591148 raise NotImplementedError (f"match not implemented for { type (pattern ).__name__ } " )
11601149
11611150
@@ -2378,12 +2367,6 @@ def test_parse_multiple_guards(self) -> None:
23782367 ),
23792368 )
23802369
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-
23872370
23882371class MatchTests (unittest .TestCase ):
23892372 def test_match_with_equal_ints_returns_empty_dict (self ) -> None :
0 commit comments