summaryrefslogtreecommitdiff
path: root/interpreter.c
diff options
context:
space:
mode:
Diffstat (limited to 'interpreter.c')
-rw-r--r--interpreter.c26
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);
}