This commit is contained in:
2021-04-24 14:53:55 -06:00
parent 6103857d4c
commit 1f5e06a334
3 changed files with 31 additions and 13 deletions

View File

@@ -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) {
return switch (nameExp.def) {
case MetaExp(_, nameExp):
@@ -89,7 +78,7 @@ class FieldForms {
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])');
var name = fieldName(formName, args[0]);
var name = Helpers.varName(formName, args[0]);
var access = fieldAccess(formName, name, args[0]);
return {
@@ -107,7 +96,7 @@ class FieldForms {
static function funcOrMethod(formName:String, wholeExp:ReaderExp, args:Array<ReaderExp>, k:KissState):Field {
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 returnsValue = !isVoid(args[0]);

View File

@@ -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
public static function makeFunction(?name:ReaderExp, returnsValue:Bool, argList:ReaderExp, body:List<ReaderExp>, k:KissState):Function {
if (name != null) {

View File

@@ -515,6 +515,24 @@ class Macros {
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;
}