gc_delref(ast->value.func.body);
break;
+ case AST_FNAPP:
+ gc_delref(ast->value.fnapp.fn);
+ vec_deinit(&(ast->value.fnapp.args));
+ break;
+
default:
break;
}
func->value.func.body = (AST*)gc_addref(body);
}
-AST* FnApp(AST* fn)
+AST* FnApp(AST* fnapp)
{
AST* node = ast(AST_FNAPP);
- node->value.fnapp.fn = (AST*)gc_addref(fn);
+ node->value.fnapp.fn = (AST*)gc_addref(fnapp);
vec_init(&(node->value.fnapp.args));
return node;
}
-void fnapp_add_arg(AST* func, AST* arg)
+AST* fnapp_fn(AST* fnapp)
+{
+ return fnapp->value.fnapp.fn;
+}
+
+vec_t* fnapp_args(AST* fnapp)
+{
+ return &(fnapp->value.fnapp.args);
+}
+
+void fnapp_add_arg(AST* fnapp, AST* arg)
{
- vec_push_back(&(func->value.fnapp.args), gc_addref(arg));
+ vec_push_back(&(fnapp->value.fnapp.args), gc_addref(arg));
}
AST* app = FnApp(fn);
expect(p,T_LPAR);
while (peek(p)->type != T_RPAR) {
- fnapp_add_arg(p, expression(p));
+ fnapp_add_arg(app, expression(p));
if (peek(p)->type != T_RPAR)
expect(p, T_COMMA);
}
printf(")");
break;
+ case AST_FNAPP:
+ printf("(");
+ pprint_tree(file, fnapp_fn(tree), depth);
+ for (size_t i = 0; i < vec_size(fnapp_args(tree)); i++) {
+ printf(" ");
+ pprint_tree(file, vec_at(fnapp_args(tree), i), depth);
+ }
+ printf(")");
+ break;
+
default:
pprint_literal(file, tree, depth);
break;
/* Function Application */
AST* FnApp(AST* fn);
+AST* fnapp_fn(AST* fnapp);
+vec_t* fnapp_args(AST* fnapp);
void fnapp_add_arg(AST* func, AST* arg);
-
-
///* Annotation */
//AST* Ann(char* name, AST* value);
//char* ann_name(AST* def);