From 821bc6250b041fa6919c7c7f9703be652aa3bd2f Mon Sep 17 00:00:00 2001 From: tmeissner Date: Fri, 10 May 2019 00:36:28 +0200 Subject: [PATCH] Add lookup of builtins --- chapter_10/lispy.c | 23 ++++++++++++++++++++++- chapter_10/lispy.h | 1 + 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/chapter_10/lispy.c b/chapter_10/lispy.c index bafa75d..6405bb2 100644 --- a/chapter_10/lispy.c +++ b/chapter_10/lispy.c @@ -289,7 +289,7 @@ lval* lval_eval_sexpr(lval* v) { } /* Call builtin with operator */ - lval* result = builtin_op(v, f->sym); + lval* result = builtin(v, f->sym); lval_del(f); return result; @@ -338,6 +338,27 @@ lval* lval_take(lval* v, size_t i) { } +lval* builtin(lval* a, char* func) { + + /* Check for builtin functions */ + if (strcmp("list", func) == 0) {return builtin_list(a);} + if (strcmp("head", func) == 0) {return builtin_head(a);} + if (strcmp("tail", func) == 0) {return builtin_tail(a);} + if (strcmp("join", func) == 0) {return builtin_join(a);} + if (strcmp("eval", func) == 0) {return builtin_eval(a);} + + /* Check for operators */ + if (strstr("+-*/%^", func) || + strcmp("min", func) == 0 || strcmp("max", func) == 0) { + return builtin_op(a, func); + } + + lval_del(a); + return lval_err("Unknown function!"); + +} + + lval* builtin_op(lval* a, char* op) { /* Ensure all arguments are numbers */ diff --git a/chapter_10/lispy.h b/chapter_10/lispy.h index 3074aba..1d9f3df 100644 --- a/chapter_10/lispy.h +++ b/chapter_10/lispy.h @@ -70,6 +70,7 @@ void lval_println(lval* v); /* language built-in operators and functions */ long min(long x, long y); long max(long x, long y); +lval* builtin(lval* a, char* func); lval* builtin_op(lval* a, char* op); lval* builtin_head(lval* a); lval* builtin_tail(lval* a);