#include #include #include #include "inter_builtins.h" #include "interpreter.h" #include "util.h" InterRet builtin_do(InterState *is,int nargs,AST **args){ assert(args); InterRet ir; for(int i=0;i0)putchar(' '); printf("%s",s); free(s); } putchar('\n'); return ir_ast(ast_list(0,malloc(1,AST*))); } #define BUILTIN_ARITH_OP(op,name,defval,expr) \ InterRet builtin_##name(InterState *is,int nargs,AST **args){ \ (void)is; \ assert(args); \ if(nargs==0)return ir_ast(ast_number(defval)); \ for(int i=0;itype!=AST_NUMBER){ \ return ir_err_c("Non-number argument passed to builtin '" #op "'"); \ } \ } \ double res=args[0]->nu.num; \ for(int i=1;inu.num; \ res=expr; \ } \ return ir_ast(ast_number(res)); \ } BUILTIN_ARITH_OP(+,sum,0,res+n) BUILTIN_ARITH_OP(-,difference,0,res-n) BUILTIN_ARITH_OP(*,product,1,res*n) BUILTIN_ARITH_OP(/,quotient,1,res/n) BUILTIN_ARITH_OP(%,remainder,1,floatmod(res,n)) #undef BUILTIN_ARITH_OP