@@ -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
@@ -1096,26 +1094,17 @@ class MatchError(Exception):
10961094 pass
10971095
10981096
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 ]:
11081098 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
11101100 if isinstance (pattern , Float ):
11111101 raise MatchError ("pattern matching is not supported for Floats" )
11121102 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
11141104 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 }
11171106 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
11191108 if isinstance (pattern , Record ):
11201109 if not isinstance (obj , Record ):
11211110 return None
@@ -1135,7 +1124,7 @@ def match(obj: Object, pattern: Object, env: Optional[Env] = None, guard: Option
11351124 result .update (part )
11361125 if not use_spread and len (pattern .data ) != len (obj .data ):
11371126 return None
1138- return result if match_guard ( result , guard ) else None
1127+ return result
11391128 if isinstance (pattern , List ):
11401129 if not isinstance (obj , List ):
11411130 return None
@@ -1158,7 +1147,7 @@ def match(obj: Object, pattern: Object, env: Optional[Env] = None, guard: Option
11581147 result .update (part )
11591148 if not use_spread and len (pattern .items ) != len (obj .items ):
11601149 return None
1161- return result if match_guard ( result , guard ) else None
1150+ return result
11621151 raise NotImplementedError (f"match not implemented for { type (pattern ).__name__ } " )
11631152
11641153
@@ -2377,12 +2366,6 @@ def test_parse_multiple_guards(self) -> None:
23772366 ),
23782367 )
23792368
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-
23862369
23872370class MatchTests (unittest .TestCase ):
23882371 def test_match_with_equal_ints_returns_empty_dict (self ) -> None :
0 commit comments