(symbol) and (expList) for macros
This commit is contained in:
@@ -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),
|
||||
|
@@ -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"),
|
||||
|
@@ -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));
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user