diff --git a/dub.sdl b/dub.sdl index 58a534e..ce86bdd 100644 --- a/dub.sdl +++ b/dub.sdl @@ -8,7 +8,7 @@ dependency "taggedalgebraic" version="~>0.11.23" targetType "executable" buildRequirements "requireBoundsCheck" "requireContracts" -versions "LoxConcatNonStrings" "LoxExtraNativeFuncs" +versions "LoxConcatNonStrings" "LoxExtraNativeFuncs" "LoxPrintMultiple" configuration "jlox" { sourcePaths "src/jlox" "src/common" diff --git a/src/jlox/interpreter.d b/src/jlox/interpreter.d index d248eda..157d0a5 100644 --- a/src/jlox/interpreter.d +++ b/src/jlox/interpreter.d @@ -116,8 +116,12 @@ class Interpreter : Stmt.Visitor!void, Expr.Visitor!TValue { execute(stmt.elseBranch); } void visit(Stmt.Print stmt){ - TValue value = evaluate(stmt.expression); - writeln(tvalueToString(value)); + version(LoxPrintMultiple){ + writeln(stmt.expressions.map!(x => evaluate(x)).map!tvalueToString.join("\t")); + } else { + TValue value = evaluate(stmt.expression); + writeln(tvalueToString(value)); + } } void visit(Stmt.Return stmt){ TValue value = stmt.value !is null ? evaluate(stmt.value) : TValue.nil(tvalueNil); diff --git a/src/jlox/parser.d b/src/jlox/parser.d index 6ebc002..f0d1133 100644 --- a/src/jlox/parser.d +++ b/src/jlox/parser.d @@ -81,9 +81,18 @@ class Parser{ } private Stmt printStatement(){ - Expr value = expression(); - consume(TokenType.SEMICOLON, "Expect ';' after value."); - return new Stmt.Print(value); + version(LoxPrintMultiple){ + Expr[] values; + do { + values ~= expression(); + } while(match(TokenType.COMMA)); + consume(TokenType.SEMICOLON, "Expect ';' after values."); + return new Stmt.Print(values); + } else { + Expr value = expression(); + consume(TokenType.SEMICOLON, "Expect ';' after value."); + return new Stmt.Print(value); + } } private Stmt returnStatement(){ Token keyword = previous(); diff --git a/src/jlox/stmt.d b/src/jlox/stmt.d index ad701c8..767f58e 100644 --- a/src/jlox/stmt.d +++ b/src/jlox/stmt.d @@ -50,7 +50,10 @@ abstract class Stmt{ mixin defCtorAndAccept; } static class Print : typeof(this){ - Expr expression; + version(LoxPrintMultiple) + Expr[] expressions; + else + Expr expression; mixin defCtorAndAccept; } static class Return : typeof(this){