diff --git a/src/kiss/Helpers.hx b/src/kiss/Helpers.hx index bf586de0..cf077158 100644 --- a/src/kiss/Helpers.hx +++ b/src/kiss/Helpers.hx @@ -7,6 +7,7 @@ import kiss.CompileError; import kiss.Types; using kiss.Reader; +using kiss.Helpers; using StringTools; class Helpers { @@ -85,10 +86,7 @@ class Helpers { default: throw CompileError.fromExp(argList, 'expected an argument list'); }, - expr: { - pos: Context.currentPos(), - expr: EReturn(convert(CallExp(Symbol("begin").withPos(body[0].pos), body).withPos(body[0].pos))) - } + expr: EReturn(convert(CallExp(Symbol("begin").withPos(body[0].pos), body).withPos(body[0].pos))).withContextPos() } } } diff --git a/src/kiss/SpecialForms.hx b/src/kiss/SpecialForms.hx index bcc62d9b..607f498a 100644 --- a/src/kiss/SpecialForms.hx +++ b/src/kiss/SpecialForms.hx @@ -190,7 +190,13 @@ class SpecialForms { var condition = macro Prelude.truthy(${convert(args[0])}); var thenExp = convert(args[1]); - var elseExp = if (args.length > 2) convert(args[2]) else null; + var elseExp = if (args.length > 2) { + convert(args[2]); + } else { + // Kiss (if... ) expressions all need to generate a Haxe else block + // to make sure they always return something + macro null; + }; macro if ($condition) $thenExp diff --git a/src/test/cases/BasicTestCase.hx b/src/test/cases/BasicTestCase.hx index 3824e408..3062f4cf 100644 --- a/src/test/cases/BasicTestCase.hx +++ b/src/test/cases/BasicTestCase.hx @@ -120,6 +120,8 @@ class BasicTestCase extends Test { Assert.equals(false, BasicTestCase.myIf8); Assert.equals(false, BasicTestCase.myIf9); Assert.equals(true, BasicTestCase.myIf10); + Assert.equals(5, BasicTestCase.myIf11); + Assert.equals(null, BasicTestCase.myIf12); } function testMacros() { diff --git a/src/test/cases/BasicTestCase.kiss b/src/test/cases/BasicTestCase.kiss index 310adfb4..b5f4a6dd 100644 --- a/src/test/cases/BasicTestCase.kiss +++ b/src/test/cases/BasicTestCase.kiss @@ -64,6 +64,8 @@ (defvar myIf8 (if "" true false)) (defvar myIf9 (if [] true false)) (defvar myIf10 (if [1] true false)) +(defvar myIf11 (if true 5)) +(defvar myIf12 (if false 5)) (defvar :Int myInt 8)