app()

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));

        },