(symbol) and (expList) for macros

This commit is contained in:
2021-06-12 21:28:48 -06:00
parent e3543cfafb
commit d1fc9d3623
4 changed files with 22 additions and 5 deletions

View File

@@ -389,8 +389,7 @@ class Helpers {
call: (func:ReaderExp, args:Array<ReaderExp>) -> CallExp(func, args).withPosOf(posRef),
list: (exps:Array<ReaderExp>) -> 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),

View File

@@ -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"),

View File

@@ -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<ReaderExp>, 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));

View File

@@ -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<ReaderExp> {
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