Skip to content

Commit a3fd2cc

Browse files
authored
Allow empty function definitions (#280)
* Allow empty function definitions * Wrap Python AST node
1 parent a333a5b commit a3fd2cc

File tree

2 files changed

+33
-10
lines changed

2 files changed

+33
-10
lines changed

src/basilisp/lang/compiler.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -549,8 +549,12 @@ def _fn_args_body(ctx: CompilerContext, arg_vec: vec.Vector, # pylint:disable=t
549549
raise CompilerException(
550550
f"Expected variadic argument name after '&'") from None
551551

552+
fn_body = list(_collection_ast(ctx, body_exprs))
553+
if len(fn_body) == 0:
554+
fn_body = [_node(ast.NameConstant(None))]
555+
552556
args = [ast.arg(arg=a, annotation=None) for a in munged]
553-
body = itertools.chain(vargs_body, _collection_ast(ctx, body_exprs))
557+
body = itertools.chain(vargs_body, fn_body)
554558
return args, cast(ASTStream, body), vargs
555559

556560

tests/basilisp/compiler_test.py

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -197,35 +197,41 @@ def test_do(ns: runtime.Namespace):
197197

198198

199199
def test_single_arity_fn(ns: runtime.Namespace):
200+
code = """
201+
(def empty-single (fn* empty-single []))
202+
"""
203+
ns_name = ns.name
204+
fvar = lcompile(code)
205+
assert Var.find_in_ns(sym.symbol(ns_name), sym.symbol('empty-single')) == fvar
206+
assert callable(fvar.value)
207+
assert None is fvar.value()
208+
200209
code = """
201210
(def string-upper (fn* string-upper [s] (.upper s)))
202211
"""
203212
ns_name = ns.name
204213
fvar = lcompile(code)
205-
assert fvar == Var.find_in_ns(
206-
sym.symbol(ns_name), sym.symbol('string-upper'))
214+
assert Var.find_in_ns(sym.symbol(ns_name), sym.symbol('string-upper')) == fvar
207215
assert callable(fvar.value)
208-
assert fvar.value("lower") == "LOWER"
216+
assert "LOWER" == fvar.value("lower")
209217

210218
code = """
211219
(def string-upper (fn* string-upper ([s] (.upper s))))
212220
"""
213221
ns_name = ns.name
214222
fvar = lcompile(code)
215-
assert fvar == Var.find_in_ns(
216-
sym.symbol(ns_name), sym.symbol('string-upper'))
223+
assert Var.find_in_ns(sym.symbol(ns_name), sym.symbol('string-upper')) == fvar
217224
assert callable(fvar.value)
218-
assert fvar.value("lower") == "LOWER"
225+
assert "LOWER" == fvar.value("lower")
219226

220227
code = """
221228
(def string-lower #(.lower %))
222229
"""
223230
ns_name = ns.name
224231
fvar = lcompile(code)
225-
assert fvar == Var.find_in_ns(
226-
sym.symbol(ns_name), sym.symbol('string-lower'))
232+
assert Var.find_in_ns(sym.symbol(ns_name), sym.symbol('string-lower')) == fvar
227233
assert callable(fvar.value)
228-
assert fvar.value("UPPER") == "upper"
234+
assert "upper" == fvar.value("UPPER")
229235

230236

231237
def test_multi_arity_fn(ns: runtime.Namespace):
@@ -256,6 +262,19 @@ def test_multi_arity_fn(ns: runtime.Namespace):
256262
([& args] (concat [:rest-params] args))))
257263
""")
258264

265+
code = """
266+
(def empty-multi-fn
267+
(fn* empty-multi-fn
268+
([])
269+
([s])))
270+
"""
271+
ns_name = ns.name
272+
fvar = lcompile(code)
273+
assert Var.find_in_ns(sym.symbol(ns_name), sym.symbol('empty-multi-fn')) == fvar
274+
assert callable(fvar.value)
275+
assert None is fvar.value()
276+
assert None is fvar.value('STRING')
277+
259278
code = """
260279
(def multi-fn
261280
(fn* multi-fn

0 commit comments

Comments
 (0)