From 82236b75f1a8d85610c2d9b78ce9c68c3f454b3e Mon Sep 17 00:00:00 2001 From: Nat Quayle Nelson Date: Wed, 9 Dec 2020 21:46:07 -0700 Subject: [PATCH] Refactor reader macros in AOC Day 8 pt 1 --- src/kiss/Helpers.hx | 12 ++++++++++-- src/kiss/Reader.hx | 8 ++++++-- src/kiss/Stream.hx | 2 +- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/kiss/Helpers.hx b/src/kiss/Helpers.hx index f5fd135..0be308d 100644 --- a/src/kiss/Helpers.hx +++ b/src/kiss/Helpers.hx @@ -197,6 +197,7 @@ class Helpers { interp.variables.set("read", Reader.assertRead.bind(_, k.readTable)); interp.variables.set("readExpArray", Reader.readExpArray.bind(_, _, k.readTable)); interp.variables.set("ReaderExp", ReaderExpDef); + interp.variables.set("nextToken", Reader.nextToken.bind(_, "a token")); interp.variables.set("kiss", { Reader: { ReaderExpDef: ReaderExpDef @@ -247,8 +248,15 @@ class Helpers { FieldExp(field, evalUnquotes(innerExp, k, args)); case KeyValueExp(keyExp, valueExp): KeyValueExp(evalUnquotes(keyExp, k, args), evalUnquotes(valueExp, k, args)); - case Unquote(exp): - runAtCompileTime(exp, k, args).def; + case Unquote(innerExp): + var unquoteValue:Dynamic = runAtCompileTime(innerExp, k, args); + if (unquoteValue == null) { + throw CompileError.fromExp(innerExp, "unquote evaluated to null"); + } else if (Std.isOfType(unquoteValue, ReaderExpDef)) { + unquoteValue; + } else { + unquoteValue.def; + }; default: throw CompileError.fromExp(exp, 'unquote evaluation not implemented'); }; diff --git a/src/kiss/Reader.hx b/src/kiss/Reader.hx index 124b78b..45616fd 100644 --- a/src/kiss/Reader.hx +++ b/src/kiss/Reader.hx @@ -93,8 +93,12 @@ class Reader { public static final terminators = [")", "]", "/*", "\n", " "]; - static function nextToken(stream:Stream, expect:String) { - return stream.expect(expect, () -> stream.takeUntilOneOf(terminators)); + public static function nextToken(stream:Stream, expect:String) { + var tok = stream.expect(expect, () -> stream.takeUntilOneOf(terminators)); + if (tok.length == 0) { + throw 'Expected token $expect at ${stream.position()}'; + } + return tok; } public static function assertRead(stream:Stream, readTable:Map):ReaderExp { diff --git a/src/kiss/Stream.hx b/src/kiss/Stream.hx index 4531d99..7fc3175 100644 --- a/src/kiss/Stream.hx +++ b/src/kiss/Stream.hx @@ -158,7 +158,7 @@ class Stream { switch (f()) { case Some(s): return s; - case None: + default: throw 'Expected $whatToExpect at $position'; } }