Skip to content

Commit 8c2cb41

Browse files
authored
Reader will no longer resolve generated symbols in syntax-quote (#272)
1 parent 4787132 commit 8c2cb41

File tree

2 files changed

+11
-3
lines changed

2 files changed

+11
-3
lines changed

src/basilisp/lang/reader.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -625,7 +625,7 @@ def _read_sym(ctx: ReaderContext) -> MaybeSymbol:
625625
return True
626626
elif name == 'false':
627627
return False
628-
if ctx.is_syntax_quoted:
628+
if ctx.is_syntax_quoted and not name.endswith('#'):
629629
return ctx.resolve(symbol.symbol(name, ns))
630630
return symbol.symbol(name, ns=ns)
631631

tests/basilisp/reader_test.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -463,30 +463,38 @@ def complex_resolver(s: sym.Symbol) -> sym.Symbol:
463463

464464

465465
def test_syntax_quote_gensym():
466-
gensym = read_str_first("`s#")
466+
resolver = lambda s: sym.symbol(s.name, ns='test-ns')
467+
468+
gensym = read_str_first("`s#", resolver=resolver)
467469
assert isinstance(gensym, llist.List)
468470
assert gensym.first == reader._QUOTE
469471
genned_sym: sym.Symbol = gensym[1]
470472
assert genned_sym.name.startswith("s_")
471473

472474
# Verify that identical gensym forms resolve to the same
473475
# symbol inside the same syntax quote expansion
474-
multisym = read_str_first("`(s1# s2# s1#)")[1].rest
476+
multisym = read_str_first("`(s1# s2# s1#)", resolver=resolver)[1].rest
475477

476478
multisym1 = multisym[0][1]
477479
assert reader._QUOTE == multisym1[0]
478480
genned_sym1: sym.Symbol = multisym1[1]
481+
assert genned_sym1.ns is None
479482
assert genned_sym1.name.startswith("s1_")
483+
assert "#" not in genned_sym1.name
480484

481485
multisym2 = multisym[1][1]
482486
assert reader._QUOTE == multisym2[0]
483487
genned_sym2: sym.Symbol = multisym2[1]
488+
assert genned_sym2.ns is None
484489
assert genned_sym2.name.startswith("s2_")
490+
assert "#" not in genned_sym2.name
485491

486492
multisym3 = multisym[2][1]
487493
assert reader._QUOTE == multisym3[0]
488494
genned_sym3: sym.Symbol = multisym3[1]
495+
assert genned_sym3.ns is None
489496
assert genned_sym3.name.startswith("s1_")
497+
assert "#" not in genned_sym3.name
490498

491499
assert genned_sym1 == genned_sym3
492500
assert genned_sym1 != genned_sym2

0 commit comments

Comments
 (0)