diff options
Diffstat (limited to 'interpreter.c')
-rw-r--r-- | interpreter.c | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/interpreter.c b/interpreter.c index 9f389c1..f5fb3dc 100644 --- a/interpreter.c +++ b/interpreter.c @@ -182,7 +182,8 @@ static char* replace_arguments(AST *ast,int nargs,AST **args){ return NULL; } -static InterRet interpret(InterState *is,const AST *ast){ +InterRet interpret(InterState *is,const AST *ast){ + //fprintf(stderr,"Interpreting %s\n",ast_stringify(ast)); switch(ast->type){ case AST_LIST:{ if(ast->li.len==0){ @@ -200,10 +201,15 @@ static InterRet interpret(InterState *is,const AST *ast){ } if(nodes[0]->type!=AST_LAMBDA){ - fprintf(stderr,"type = %d\n",nodes[0]->type); return ir_err_c("First node in evaluated list not a function"); } + /*AST *temp=ast_list(ast->li.len,nodes); + char *ss=ast_stringify(temp); + free(temp); + fprintf(stderr,"Function call: %s\n",ss); + free(ss);*/ + if(nodes[0]->la.body){ char *errstr=replace_arguments(nodes[0]->la.body,ast->li.len-1,nodes+1); if(errstr)return ir_err(errstr); @@ -257,7 +263,22 @@ void inter_register(InterState *is,const char *name,lambdafunc_t cfunc){ void inter_register_prelude(InterState *is){ inter_register(is,"do",builtin_do); + inter_register(is,"?",builtin_if); + inter_register(is,"if",builtin_if); + inter_register(is,"print",builtin_print); + + inter_register(is,"=",builtin_equals); + inter_register(is,">",builtin_greater); + inter_register(is,">=",builtin_greaterequals); + inter_register(is,"<",builtin_less); + inter_register(is,"<=",builtin_lessequals); + inter_register(is,"equals",builtin_equals); + inter_register(is,"greater",builtin_greater); + inter_register(is,"greaterequals",builtin_greaterequals); + inter_register(is,"less",builtin_less); + inter_register(is,"lessequals",builtin_lessequals); + inter_register(is,"+",builtin_sum); inter_register(is,"-",builtin_difference); inter_register(is,"*",builtin_product); @@ -268,6 +289,7 @@ void inter_register_prelude(InterState *is){ inter_register(is,"product",builtin_product); inter_register(is,"quotient",builtin_quotient); inter_register(is,"remainder",builtin_remainder); + inter_register(is,"define",builtin_define); } |