Skip to content

Commit 4b015aa

Browse files
authored
Accept namespaces or symbols in Var.intern and Var.find APIs (#499)
1 parent fd37170 commit 4b015aa

File tree

6 files changed

+32
-19
lines changed

6 files changed

+32
-19
lines changed

src/basilisp/importer.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -273,9 +273,9 @@ def _exec_module(
273273
f"Loaded Basilisp module '{fullname}' in {duration / 1000000}ms"
274274
)
275275
):
276-
# During compilation, bytecode objects are added to the list via the closure
277-
# add_bytecode below, which is passed to the compiler. The collected bytecodes
278-
# will be used to generate an .lpyc file for caching the compiled file.
276+
# During compilation, bytecode objects are added to the list which is
277+
# passed to the compiler. The collected bytecodes will be used to generate
278+
# an .lpyc file for caching the compiled file.
279279
all_bytecode: List[types.CodeType] = []
280280

281281
logger.debug(f"Reading and compiling Basilisp module '{fullname}'")

src/basilisp/lang/compiler/analyzer.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2484,7 +2484,7 @@ def __resolve_namespaced_symbol_in_ns( # pylint: disable=too-many-branches
24842484
)
24852485
elif ns_sym in which_ns.aliases:
24862486
aliased_ns: runtime.Namespace = which_ns.aliases[ns_sym]
2487-
v = Var.find(sym.symbol(form.name, ns=aliased_ns.name))
2487+
v = Var.find_in_ns(aliased_ns, sym.symbol(form.name))
24882488
if v is None:
24892489
raise AnalyzerException(
24902490
f"unable to resolve symbol '{sym.symbol(form.name, ns_sym.name)}' in this context",

src/basilisp/lang/compiler/generator.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -678,7 +678,7 @@ def _def_to_py_ast( # pylint: disable=too-many-branches
678678
else:
679679
def_ast = GeneratedPyAST(node=ast.Constant(None))
680680

681-
ns_name = ast.Call(func=_NEW_SYM_FN_NAME, args=[_NS_VAR_NAME], keywords=[])
681+
ns_name = _load_attr(_NS_VAR_VALUE)
682682
def_name = ast.Call(
683683
func=_NEW_SYM_FN_NAME, args=[ast.Constant(defsym.name)], keywords=[]
684684
)

src/basilisp/lang/runtime.py

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -270,28 +270,41 @@ def value(self, v):
270270

271271
@staticmethod
272272
def intern(
273-
ns: sym.Symbol, name: sym.Symbol, val, dynamic: bool = False, meta=None
273+
ns: Union["Namespace", sym.Symbol],
274+
name: sym.Symbol,
275+
val,
276+
dynamic: bool = False,
277+
meta=None,
274278
) -> "Var":
275279
"""Intern the value bound to the symbol `name` in namespace `ns`."""
276-
var_ns = Namespace.get_or_create(ns)
277-
var = var_ns.intern(name, Var(var_ns, name, dynamic=dynamic, meta=meta))
280+
if isinstance(ns, sym.Symbol):
281+
ns = Namespace.get_or_create(ns)
282+
var = ns.intern(name, Var(ns, name, dynamic=dynamic, meta=meta))
278283
var.root = val
279284
return var
280285

281286
@staticmethod
282287
def intern_unbound(
283-
ns: sym.Symbol, name: sym.Symbol, dynamic: bool = False, meta=None
288+
ns: Union["Namespace", sym.Symbol],
289+
name: sym.Symbol,
290+
dynamic: bool = False,
291+
meta=None,
284292
) -> "Var":
285293
"""Create a new unbound `Var` instance to the symbol `name` in namespace `ns`."""
286-
var_ns = Namespace.get_or_create(ns)
287-
return var_ns.intern(name, Var(var_ns, name, dynamic=dynamic, meta=meta))
294+
if isinstance(ns, sym.Symbol):
295+
ns = Namespace.get_or_create(ns)
296+
return ns.intern(name, Var(ns, name, dynamic=dynamic, meta=meta))
288297

289298
@staticmethod
290-
def find_in_ns(ns_sym: sym.Symbol, name_sym: sym.Symbol) -> "Optional[Var]":
299+
def find_in_ns(
300+
ns_or_sym: Union["Namespace", sym.Symbol], name_sym: sym.Symbol
301+
) -> "Optional[Var]":
291302
"""Return the value current bound to the name `name_sym` in the namespace
292303
specified by `ns_sym`."""
293-
ns = Namespace.get(ns_sym)
294-
if ns:
304+
ns = (
305+
Namespace.get(ns_or_sym) if isinstance(ns_or_sym, sym.Symbol) else ns_or_sym
306+
)
307+
if ns is not None:
295308
return ns.find(name_sym)
296309
return None
297310

@@ -1387,9 +1400,9 @@ def _basilisp_fn(f):
13871400

13881401
def init_ns_var(which_ns: str = CORE_NS, ns_var_name: str = NS_VAR_NAME) -> Var:
13891402
"""Initialize the dynamic `*ns*` variable in the Namespace `which_ns`."""
1390-
core_sym = sym.Symbol(which_ns)
1403+
core_sym = sym.symbol(which_ns)
13911404
core_ns = Namespace.get_or_create(core_sym)
1392-
ns_var = Var.intern(core_sym, sym.Symbol(ns_var_name), core_ns, dynamic=True)
1405+
ns_var = Var.intern(core_ns, sym.Symbol(ns_var_name), core_ns, dynamic=True)
13931406
logger.debug(f"Created namespace variable {sym.symbol(ns_var_name, ns=which_ns)}")
13941407
return ns_var
13951408

@@ -1504,7 +1517,7 @@ def add_generated_python(
15041517
which_ns = get_current_ns()
15051518
v = Maybe(which_ns.find(sym.symbol(var_name))).or_else(
15061519
lambda: Var.intern(
1507-
sym.symbol(which_ns.name), # type: ignore
1520+
which_ns, # type: ignore
15081521
sym.symbol(var_name),
15091522
"",
15101523
dynamic=True,

tests/basilisp/reader_test.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ def test_ns() -> str:
2222

2323
@pytest.fixture
2424
def ns(test_ns: str) -> runtime.Namespace:
25-
runtime.init_ns_var(which_ns=runtime.CORE_NS)
25+
runtime.init_ns_var()
2626
with runtime.ns_bindings(test_ns) as ns:
2727
yield ns
2828

tests/basilisp/runtime_test.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -379,7 +379,7 @@ def test_trampoline_args():
379379

380380
@pytest.fixture
381381
def core_ns():
382-
ns_var = runtime.init_ns_var(which_ns=runtime.CORE_NS)
382+
ns_var = runtime.init_ns_var()
383383
yield ns_var.value
384384

385385

0 commit comments

Comments
 (0)