summaryrefslogtreecommitdiff
path: root/eval.c
diff options
context:
space:
mode:
authorKai Stevenson <kai@kaistevenson.com>2023-02-15 23:57:36 -0800
committerKai Stevenson <kai@kaistevenson.com>2023-02-15 23:57:36 -0800
commit4b68d60daf495cef5eb22a521ce809d798418aa5 (patch)
tree327a8bd5e82cbd82c5c1578702e09686f961c116 /eval.c
parent012a218e3f25f4712e6eb9a197e4473f0617eaed (diff)
add license, some boolean functions, fixed bugs, improved visualizer and added flag
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c24
1 files changed, 17 insertions, 7 deletions
diff --git a/eval.c b/eval.c
index 3cbe987..05fd9b3 100644
--- a/eval.c
+++ b/eval.c
@@ -17,10 +17,10 @@ void init_eval() {
}
/* TODO: read base hashtable from file to allow modularity
pair value value? */
-void exec_all(symset_t symset) {
- for (int i = 0; i < symset.count; i++) {
+void exec_all(sym_t** symbols, int count) {
+ for (int i = 0; i < count; i++) {
/* dispose of result */
- eval(symset.symbols[i]);
+ eval(symbols[i]);
}
}
sym_t* eval(sym_t* symbol) {
@@ -58,10 +58,7 @@ sym_t* try_eval_internal(sym_t* symbol) {
/* TODO: return last arg. that's the function return line */
if (hash == get_hash("root")) {
/* execute all args as roots */
- symset_t symset;
- symset.symbols = symbol->args;
- symset.count = symbol->argCount;
- exec_all(symset);
+ exec_all(symbol->args, symbol->argCount);
return &trueSym;
}
else if (hash == get_hash("store")) {
@@ -101,6 +98,19 @@ sym_t* try_eval_internal(sym_t* symbol) {
}
return &trueSym;
}
+ else if (hash == get_hash("if")) {
+ sym_t* v = eval(symbol->args[0]);
+ if (symtoi(v) != 0) {
+ exec_all(symbol->args + 1, symbol->argCount - 1);
+ return &trueSym;
+ }
+ return &falseSym;
+ }
+ else if (hash == get_hash("not")) {
+ sym_t* v = eval(symbol->args[0]);
+ int b = symtoi(v);
+ return b ? &falseSym : &trueSym;
+ }
else if (hash == get_hash("print")) {
sym_t* v = eval(symbol->args[0]);
switch (v->litType) {