(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),
|
call: (func:ReaderExp, args:Array<ReaderExp>) -> CallExp(func, args).withPosOf(posRef),
|
||||||
list: (exps:Array<ReaderExp>) -> ListExp(exps).withPosOf(posRef),
|
list: (exps:Array<ReaderExp>) -> ListExp(exps).withPosOf(posRef),
|
||||||
str: (s:String) -> StrExp(s).withPosOf(posRef),
|
str: (s:String) -> StrExp(s).withPosOf(posRef),
|
||||||
symbol: (name:String) -> Symbol(name).withPosOf(posRef),
|
symbol: (?name:String) -> Prelude.symbol(name).withPosOf(posRef),
|
||||||
gensym: () -> Symbol('_${Uuid.v4().toShort()}').withPosOf(posRef),
|
|
||||||
raw: (code:String) -> RawHaxe(code).withPosOf(posRef),
|
raw: (code:String) -> RawHaxe(code).withPosOf(posRef),
|
||||||
typed: (path:String, exp:ReaderExp) -> TypedExp(path, exp).withPosOf(posRef),
|
typed: (path:String, exp:ReaderExp) -> TypedExp(path, exp).withPosOf(posRef),
|
||||||
meta: (m:String, exp:ReaderExp) -> MetaExp(m, 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
|
"pairs" => Symbol("Prelude.pairs"), // TODO test pairs
|
||||||
"memoize" => Symbol("Prelude.memoize"), // TODO test memoize
|
"memoize" => Symbol("Prelude.memoize"), // TODO test memoize
|
||||||
"symbolName" => Symbol("Prelude.symbolName"),
|
"symbolName" => Symbol("Prelude.symbolName"),
|
||||||
|
"symbol" => Symbol("Prelude.symbol"),
|
||||||
|
"expList" => Symbol("Prelude.expList"),
|
||||||
"map" => Symbol("Lambda.map"),
|
"map" => Symbol("Lambda.map"),
|
||||||
"filter" => Symbol("Lambda.filter"), // TODO use truthy as the default filter function
|
"filter" => Symbol("Lambda.filter"), // TODO use truthy as the default filter function
|
||||||
"has" => Symbol("Lambda.has"),
|
"has" => Symbol("Lambda.has"),
|
||||||
|
@@ -178,7 +178,7 @@ class Macros {
|
|||||||
wholeExp.checkNumArgs(2, null, "(or [v1] [v2] [values...])");
|
wholeExp.checkNumArgs(2, null, "(or [v1] [v2] [values...])");
|
||||||
var b = wholeExp.expBuilder();
|
var b = wholeExp.expBuilder();
|
||||||
|
|
||||||
var uniqueVarSymbol = b.gensym();
|
var uniqueVarSymbol = b.symbol();
|
||||||
|
|
||||||
b.begin([
|
b.begin([
|
||||||
b.call(b.symbol("deflocal"), [
|
b.call(b.symbol("deflocal"), [
|
||||||
@@ -204,7 +204,7 @@ class Macros {
|
|||||||
wholeExp.checkNumArgs(2, null, "(and [v1] [v2] [values...])");
|
wholeExp.checkNumArgs(2, null, "(and [v1] [v2] [values...])");
|
||||||
var b = wholeExp.expBuilder();
|
var b = wholeExp.expBuilder();
|
||||||
|
|
||||||
var uniqueVarSymbol = b.gensym();
|
var uniqueVarSymbol = b.symbol();
|
||||||
|
|
||||||
var condCases = [
|
var condCases = [
|
||||||
for (arg in args) {
|
for (arg in args) {
|
||||||
@@ -584,7 +584,7 @@ class Macros {
|
|||||||
function once(macroName:String, wholeExp:ReaderExp, exps:Array<ReaderExp>, k:KissState) {
|
function once(macroName:String, wholeExp:ReaderExp, exps:Array<ReaderExp>, k:KissState) {
|
||||||
wholeExp.checkNumArgs(1, null, '($macroName [body...])');
|
wholeExp.checkNumArgs(1, null, '($macroName [body...])');
|
||||||
var b = wholeExp.expBuilder();
|
var b = wholeExp.expBuilder();
|
||||||
var flag = b.gensym();
|
var flag = b.symbol();
|
||||||
// define the field:
|
// define the field:
|
||||||
k.convert(b.call(b.symbol(macroName), [b.meta("mut", flag), b.symbol("true")]));
|
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));
|
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
|
#elseif sys
|
||||||
import sys.io.Process;
|
import sys.io.Process;
|
||||||
#end
|
#end
|
||||||
|
import uuid.Uuid;
|
||||||
|
|
||||||
using StringTools;
|
using StringTools;
|
||||||
|
using uuid.Uuid;
|
||||||
|
|
||||||
/** What functions that process Lists should do when there are more elements than expected **/
|
/** What functions that process Lists should do when there are more elements than expected **/
|
||||||
enum ExtraElementHandling {
|
enum ExtraElementHandling {
|
||||||
@@ -278,6 +280,12 @@ class Prelude {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ReaderExp helpers for macros:
|
// 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 {
|
public static function symbolName(s:ReaderExp):ReaderExpDef {
|
||||||
return switch (s.def) {
|
return switch (s.def) {
|
||||||
case Symbol(name): StrExp(name);
|
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
|
#if sys
|
||||||
private static var kissProcess:Process = null;
|
private static var kissProcess:Process = null;
|
||||||
#end
|
#end
|
||||||
|
Reference in New Issue
Block a user