From 2a7d8e927de9660acf81047266384dcf123f99d1 Mon Sep 17 00:00:00 2001 From: Nat Quayle Nelson Date: Sun, 11 Dec 2022 23:24:43 +0000 Subject: [PATCH] expect macro for reader macros --- kiss/src/kiss/Kiss.hx | 8 ++++++++ kiss/src/kiss/List.hx | 1 + kiss/src/kiss/Reader.hx | 5 +++-- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/kiss/src/kiss/Kiss.hx b/kiss/src/kiss/Kiss.hx index 809c6ad0..15ec9dbf 100644 --- a/kiss/src/kiss/Kiss.hx +++ b/kiss/src/kiss/Kiss.hx @@ -641,9 +641,17 @@ class Kiss { }; }; + copy.macros["expect"] = (wholeExp:ReaderExp, exps:Array, k:KissState) -> { + wholeExp.checkNumArgs(3, null, "(expect )"); + var b = wholeExp.expBuilder(); + var streamSymbol = exps.shift(); + b.callField("expect", streamSymbol, [exps.shift(), b.callSymbol("lambda", [b.list([]), b.callField(Prelude.symbolNameValue(exps.shift()), streamSymbol, exps)])]); + }; + // TODO should this also be in forHScript()? // In macro evaluation, copy.macros.remove("eval"); + // BECAUSE it is provided as a function instead. return copy; } diff --git a/kiss/src/kiss/List.hx b/kiss/src/kiss/List.hx index 3b635425..9e340f36 100644 --- a/kiss/src/kiss/List.hx +++ b/kiss/src/kiss/List.hx @@ -39,6 +39,7 @@ abstract List(Array) from Array to Array { return v; } + // TODO deleting these should be fine, because the haxe Array functions already allow negative arguments public function insert(idx:Int, v:T) { this.insert(realIndex(idx), v); } diff --git a/kiss/src/kiss/Reader.hx b/kiss/src/kiss/Reader.hx index 96b6992f..ea60c196 100644 --- a/kiss/src/kiss/Reader.hx +++ b/kiss/src/kiss/Reader.hx @@ -294,7 +294,7 @@ class Reader { } } - public static function readExpArray(stream:Stream, end:String, k:KissState, startingPos=null):Array { + public static function readExpArray(stream:Stream, end:String, k:KissState, allowEof=false, startingPos=null):Array { var array = []; if (startingPos == null) startingPos = stream.position(); @@ -306,7 +306,8 @@ class Reader { case Some(exp): array.push(exp); case None: - throw new StreamError(startingPos, 'Ran out of expressions before $end was found.'); + if (allowEof) return array; + else throw new StreamError(startingPos, 'Ran out of expressions before $end was found.'); } } catch (s:UnmatchedBracketSignal) { if (s.type == end)