in packages/core/nano/src/ast.ts [162:189]
app(head: ExpressionNode<I>, args: ExpressionNode<I>[], start: number, end: number, context: AlgebraContext) {
if (head.kind === NodeKind.Ident && typeof head.value === "string") {
switch (head.value) {
case "if":
case "IF":
return createNaryNode(NodeKind.Conditional, args);
case "fun":
case "FUN":
if (args.length === 0) {
context.onError("Empty function definition", start, end);
}
let error = false;
for (let i = 0; i < args.length - 1; i += 1) {
if (args[i].kind !== NodeKind.Ident) {
error = true;
break;
}
}
if (error) {
// TODO: Better spans;
context.onError("Illegal function parameter node", start, end);
}
return createNaryNode(NodeKind.Fun, args);
}
}
return createNaryNode(NodeKind.App, [head].concat(args));
},