defnew
This commit is contained in:
@@ -64,17 +64,6 @@ class FieldForms {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
static function fieldName(formName:String, nameExp:ReaderExp) {
|
|
||||||
return switch (nameExp.def) {
|
|
||||||
case Symbol(name):
|
|
||||||
name;
|
|
||||||
case MetaExp(_, nameExp) | TypedExp(_, nameExp):
|
|
||||||
fieldName(formName, nameExp);
|
|
||||||
default:
|
|
||||||
throw CompileError.fromExp(nameExp, 'The first argument to $formName should be a variable name, :Typed variable name, and/or &meta variable name.');
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
static function isVoid(nameExp:ReaderExp) {
|
static function isVoid(nameExp:ReaderExp) {
|
||||||
return switch (nameExp.def) {
|
return switch (nameExp.def) {
|
||||||
case MetaExp(_, nameExp):
|
case MetaExp(_, nameExp):
|
||||||
@@ -89,7 +78,7 @@ class FieldForms {
|
|||||||
static function varOrProperty(formName:String, wholeExp:ReaderExp, args:Array<ReaderExp>, k:KissState):Field {
|
static function varOrProperty(formName:String, wholeExp:ReaderExp, args:Array<ReaderExp>, k:KissState):Field {
|
||||||
wholeExp.checkNumArgs(1, 3, '($formName [optional: &mut] [optional :type] [variable] [optional value])');
|
wholeExp.checkNumArgs(1, 3, '($formName [optional: &mut] [optional :type] [variable] [optional value])');
|
||||||
|
|
||||||
var name = fieldName(formName, args[0]);
|
var name = Helpers.varName(formName, args[0]);
|
||||||
var access = fieldAccess(formName, name, args[0]);
|
var access = fieldAccess(formName, name, args[0]);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
@@ -107,7 +96,7 @@ class FieldForms {
|
|||||||
static function funcOrMethod(formName:String, wholeExp:ReaderExp, args:Array<ReaderExp>, k:KissState):Field {
|
static function funcOrMethod(formName:String, wholeExp:ReaderExp, args:Array<ReaderExp>, k:KissState):Field {
|
||||||
wholeExp.checkNumArgs(3, null, '($formName [optional :type] [name] [[argNames...]] [body...])');
|
wholeExp.checkNumArgs(3, null, '($formName [optional :type] [name] [[argNames...]] [body...])');
|
||||||
|
|
||||||
var name = fieldName(formName, args[0]);
|
var name = Helpers.varName(formName, args[0]);
|
||||||
var access = fieldAccess(formName, name, args[0]);
|
var access = fieldAccess(formName, name, args[0]);
|
||||||
var returnsValue = !isVoid(args[0]);
|
var returnsValue = !isVoid(args[0]);
|
||||||
|
|
||||||
|
@@ -57,6 +57,17 @@ class Helpers {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function varName(formName:String, nameExp:ReaderExp) {
|
||||||
|
return switch (nameExp.def) {
|
||||||
|
case Symbol(name):
|
||||||
|
name;
|
||||||
|
case MetaExp(_, nameExp) | TypedExp(_, nameExp):
|
||||||
|
varName(formName, nameExp);
|
||||||
|
default:
|
||||||
|
throw CompileError.fromExp(nameExp, 'The first argument to $formName should be a variable name, :Typed variable name, and/or &meta variable name.');
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
// TODO generic type parameter declarations
|
// TODO generic type parameter declarations
|
||||||
public static function makeFunction(?name:ReaderExp, returnsValue:Bool, argList:ReaderExp, body:List<ReaderExp>, k:KissState):Function {
|
public static function makeFunction(?name:ReaderExp, returnsValue:Bool, argList:ReaderExp, body:List<ReaderExp>, k:KissState):Function {
|
||||||
if (name != null) {
|
if (name != null) {
|
||||||
|
@@ -515,6 +515,24 @@ class Macros {
|
|||||||
|
|
||||||
macros["awaitLet"] = awaitLet;
|
macros["awaitLet"] = awaitLet;
|
||||||
|
|
||||||
|
// TODO test defnew
|
||||||
|
macros["defnew"] = (wholeExp:ReaderExp, exps:Array<ReaderExp>, k:KissState) -> {
|
||||||
|
wholeExp.checkNumArgs(2, null, "(defnew [[args...]] [[property bindings...]] [body...]");
|
||||||
|
var bindingList = exps[1].bindingList("defnew");
|
||||||
|
var bindingPairs = Prelude.groups(bindingList, 2);
|
||||||
|
|
||||||
|
var b = wholeExp.expBuilder();
|
||||||
|
var propertyDefs = [for (bindingPair in bindingPairs) b.call(b.symbol("defprop"), [bindingPair[0]])];
|
||||||
|
var propertySetExps = [for (bindingPair in bindingPairs)
|
||||||
|
b.call(b.symbol("set"), [b.symbol(Helpers.varName("a defprop property binding", bindingPair[0])), bindingPair[1]])];
|
||||||
|
return b.begin(propertyDefs.concat([
|
||||||
|
b.call(b.symbol("defmethod"), [
|
||||||
|
b.symbol("new"),
|
||||||
|
exps[0]
|
||||||
|
].concat(propertySetExps).concat(exps.slice(2)))
|
||||||
|
]));
|
||||||
|
};
|
||||||
|
|
||||||
return macros;
|
return macros;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user