Skip to content

Commit b8ac6b5

Browse files
committed
wip
1 parent 3c8e62a commit b8ac6b5

File tree

1 file changed

+9
-26
lines changed

1 file changed

+9
-26
lines changed

scrapscript.py

Lines changed: 9 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -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:
345345
HIGHEST_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")
351349
assert " " 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

23872370
class MatchTests(unittest.TestCase):
23882371
def test_match_with_equal_ints_returns_empty_dict(self) -> None:

0 commit comments

Comments
 (0)