Skip to content

Commit 412aacb

Browse files
committed
wip
1 parent 7ba29ba commit 412aacb

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

@@ -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

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

0 commit comments

Comments
 (0)