-#define FUNCTION(name) \
-do { \
- ast_function *func_##name; \
- ast_block *my_funcblock; \
- DEFVAR(var_##name); \
- VAR(TYPE_FUNCTION, var_##name); \
- MKGLOBAL(var_##name); \
- func_##name = ast_function_new(ctx, #name, var_##name); \
- assert(functions_add(func_##name) >= 0); \
- my_funcblock = ast_block_new(ctx); \
- assert(my_funcblock); \
- assert(ast_function_blocks_add(func_##name, my_funcblock)); \
+#define BUILTIN(name, outtype, number) \
+do { \
+ ast_function *func_##name; \
+ ast_value *thisfuncval; \
+ ast_function *thisfunc; \
+ DEFVAR(return_##name); \
+ VARnamed(TYPE_FUNCTION, name, name); \
+ VARnamed(outtype, return_##name, "#returntype"); \
+ name->expression.next = (ast_expression*)return_##name; \
+ MKGLOBAL(name); \
+ func_##name = ast_function_new(ctx, #name, name); \
+ thisfunc = func_##name; \
+ (void)thisfunc; \
+ thisfuncval = name; \
+ (void)thisfuncval; \
+ assert(functions_add(func_##name) >= 0); \
+ func_##name->builtin = number;
+
+#define ENDBUILTIN() } while(0)
+
+#define PARAM(ptype, name) \
+do { \
+ DEFVAR(parm); \
+ VARnamed(ptype, parm, name); \
+ assert(ast_value_params_add(thisfuncval, parm)); \
+} while(0)
+
+#define FUNCTION(name, outtype) \
+do { \
+ ast_function *thisfunc; \
+ ast_function *func_##name; \
+ ast_block *my_funcblock; \
+ DEFVAR(var_##name); \
+ DEFVAR(return_##name); \
+ VARnamed(TYPE_FUNCTION, var_##name, name); \
+ VARnamed(outtype, return_##name, "#returntype"); \
+ var_##name->expression.next = (ast_expression*)return_##name; \
+ MKGLOBAL(var_##name); \
+ func_##name = ast_function_new(ctx, #name, var_##name); \
+ thisfunc = func_##name; \
+ (void)thisfunc; \
+ assert(functions_add(func_##name) >= 0); \
+ my_funcblock = ast_block_new(ctx); \
+ assert(my_funcblock); \
+ assert(ast_function_blocks_add(func_##name, my_funcblock)); \