summaryrefslogtreecommitdiff
path: root/eval.c
diff options
context:
space:
mode:
authorPeter Mikkelsen <petermikkelsen10@gmail.com>2022-01-12 20:09:05 +0000
committerPeter Mikkelsen <petermikkelsen10@gmail.com>2022-01-12 20:09:05 +0000
commit55ca6248ffff6d9e1669fc49fe9de8489adeb7f9 (patch)
tree1bd23b6c91cb0c792ac1072cfe005cf2f5581551 /eval.c
parentd152639e4495089cabbbf7a16e5bc5129af78bfa (diff)
Add dfn evaluation, and localized ⎕IO
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/eval.c b/eval.c
index 4d0d497..3221b4c 100644
--- a/eval.c
+++ b/eval.c
@@ -150,10 +150,25 @@ monadfun(Datum left, Datum right)
traceprint("Monadic function application\n");
Datum result;
result.tag = ArrayTag;
+ result.shy = 0;
if(left.func.type == FunctypeDfn){
- print("Can't evaluate dfns yet: %S %S\n", ppdatum(left), ppdatum(right));
- exits(nil);
+ Symtab *tmpsymtab = currentsymtab;
+ currentsymtab = newsymtab();
+ if(left.func.left){
+ Symbol *alpha = getsym(currentsymtab, L"⍺");
+ alpha->value.tag = ArrayTag;
+ alpha->value.array = left.func.left;
+ alpha->undefined = 0;
+ }
+
+ Symbol *omega = getsym(currentsymtab, L"⍵");
+ omega->value = right;
+ omega->undefined = 0;
+
+ Datum *dfnres = evalline(left.func.dfn);
+ currentsymtab = tmpsymtab;
+ return *dfnres; /* TODO what if the evaluation failed */
}else{
/* TODO handle undefined functions here */
if(left.func.left)