this repo has no description

Support anonymous record spread in compiler

authored by bernsteinbear.com and committed by

Max Bernstein 97c98a0a cc6e61af

+11 -2
+7 -1
compiler.py
··· 246 246 updates = {} 247 247 use_spread = False 248 248 for key, pattern_value in pattern.data.items(): 249 - assert not isinstance(pattern_value, Spread), "record spread not yet supported" 249 + if isinstance(pattern_value, Spread): 250 + use_spread = True 251 + if pattern_value.name: 252 + raise NotImplementedError("named record spread not yet supported") 253 + break 250 254 key_idx = self.record_key(key) 251 255 record_value = self._mktemp(f"record_get({arg}, {key_idx})") 256 + # TODO(max): If the key is present in the type, don't emit this 257 + # check 252 258 self._emit(f"if ({record_value} == NULL) {{ goto {fallthrough}; }}") 253 259 updates.update(self.try_match(env, record_value, pattern_value, fallthrough)) 254 260 if not use_spread:
+4 -1
compiler_tests.py
··· 117 117 def test_match_record_too_few_keys(self) -> None: 118 118 self.assertEqual(self._run("f {a = 4, b = 5} . f = | {a = _} -> 3 | {a = _, b = _} -> 6"), "6\n") 119 119 120 + def test_match_record_spread(self) -> None: 121 + self.assertEqual(self._run("f {a=1, b=2, c=3} . f = | {a=a, ...} -> a"), "1\n") 122 + 120 123 @unittest.skip("TODO") 121 - def test_match_record_spread(self) -> None: 124 + def test_match_record_spread_named(self) -> None: 122 125 self.assertEqual(self._run("f {a=1, b=2, c=3} . f = | {a=1, ...rest} -> rest"), "[5]\n") 123 126 124 127 def test_match_hole(self) -> None: