From 5a4686d977671f5f5b90e675b1aa23543aec6474 Mon Sep 17 00:00:00 2001 From: Nat Quayle Nelson Date: Sat, 12 Jun 2021 21:28:48 -0600 Subject: [PATCH] (symbol) and (expList) for macros --- src/kiss/Helpers.hx | 3 +-- src/kiss/Kiss.hx | 2 ++ src/kiss/Macros.hx | 6 +++--- src/kiss/Prelude.hx | 16 ++++++++++++++++ 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/kiss/Helpers.hx b/src/kiss/Helpers.hx index 71cb3e4..5848ce9 100644 --- a/src/kiss/Helpers.hx +++ b/src/kiss/Helpers.hx @@ -389,8 +389,7 @@ class Helpers { call: (func:ReaderExp, args:Array) -> CallExp(func, args).withPosOf(posRef), list: (exps:Array) -> ListExp(exps).withPosOf(posRef), str: (s:String) -> StrExp(s).withPosOf(posRef), - symbol: (name:String) -> Symbol(name).withPosOf(posRef), - gensym: () -> Symbol('_${Uuid.v4().toShort()}').withPosOf(posRef), + symbol: (?name:String) -> Prelude.symbol(name).withPosOf(posRef), raw: (code:String) -> RawHaxe(code).withPosOf(posRef), typed: (path:String, exp:ReaderExp) -> TypedExp(path, exp).withPosOf(posRef), meta: (m:String, exp:ReaderExp) -> MetaExp(m, exp).withPosOf(posRef), diff --git a/src/kiss/Kiss.hx b/src/kiss/Kiss.hx index 8b0d670..3b6d63a 100644 --- a/src/kiss/Kiss.hx +++ b/src/kiss/Kiss.hx @@ -59,6 +59,8 @@ class Kiss { "pairs" => Symbol("Prelude.pairs"), // TODO test pairs "memoize" => Symbol("Prelude.memoize"), // TODO test memoize "symbolName" => Symbol("Prelude.symbolName"), + "symbol" => Symbol("Prelude.symbol"), + "expList" => Symbol("Prelude.expList"), "map" => Symbol("Lambda.map"), "filter" => Symbol("Lambda.filter"), // TODO use truthy as the default filter function "has" => Symbol("Lambda.has"), diff --git a/src/kiss/Macros.hx b/src/kiss/Macros.hx index 382959e..129f6d7 100644 --- a/src/kiss/Macros.hx +++ b/src/kiss/Macros.hx @@ -178,7 +178,7 @@ class Macros { wholeExp.checkNumArgs(2, null, "(or [v1] [v2] [values...])"); var b = wholeExp.expBuilder(); - var uniqueVarSymbol = b.gensym(); + var uniqueVarSymbol = b.symbol(); b.begin([ b.call(b.symbol("deflocal"), [ @@ -204,7 +204,7 @@ class Macros { wholeExp.checkNumArgs(2, null, "(and [v1] [v2] [values...])"); var b = wholeExp.expBuilder(); - var uniqueVarSymbol = b.gensym(); + var uniqueVarSymbol = b.symbol(); var condCases = [ for (arg in args) { @@ -584,7 +584,7 @@ class Macros { function once(macroName:String, wholeExp:ReaderExp, exps:Array, k:KissState) { wholeExp.checkNumArgs(1, null, '($macroName [body...])'); var b = wholeExp.expBuilder(); - var flag = b.gensym(); + var flag = b.symbol(); // define the field: k.convert(b.call(b.symbol(macroName), [b.meta("mut", flag), b.symbol("true")])); return b.call(b.symbol("when"), [flag, b.call(b.symbol("set"), [flag, b.symbol("false")])].concat(exps)); diff --git a/src/kiss/Prelude.hx b/src/kiss/Prelude.hx index 5afc864..e2b6e05 100644 --- a/src/kiss/Prelude.hx +++ b/src/kiss/Prelude.hx @@ -12,8 +12,10 @@ import js.node.Buffer; #elseif sys import sys.io.Process; #end +import uuid.Uuid; using StringTools; +using uuid.Uuid; /** What functions that process Lists should do when there are more elements than expected **/ enum ExtraElementHandling { @@ -278,6 +280,12 @@ class Prelude { } // ReaderExp helpers for macros: + public static function symbol(?name:String):ReaderExpDef { + if (name == null) + name = '_${Uuid.v4().toShort()}'; + return Symbol(name); + } + public static function symbolName(s:ReaderExp):ReaderExpDef { return switch (s.def) { case Symbol(name): StrExp(name); @@ -285,6 +293,14 @@ class Prelude { }; } + public static function expList(s:ReaderExp):Array { + return switch (s.def) { + case ListExp(exps): + exps; + default: throw 'expected $s to be a list expression'; + } + } + #if sys private static var kissProcess:Process = null; #end