From cac651cd88f8da1e5957b0cc13fa25d79e1887fc Mon Sep 17 00:00:00 2001 From: tomsmeding Date: Tue, 23 Aug 2016 20:58:50 +0200 Subject: Many things - two-letter AST union members - AST_QUOTED - AST_LAMBDA - an interpreter that works - function registering in the interpreter - some builtins --- inter_builtins.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 inter_builtins.c (limited to 'inter_builtins.c') diff --git a/inter_builtins.c b/inter_builtins.c new file mode 100644 index 0000000..cc96afd --- /dev/null +++ b/inter_builtins.c @@ -0,0 +1,60 @@ +#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 -- cgit v1.2.3-54-g00ecf