summaryrefslogtreecommitdiff
path: root/eval.c
diff options
context:
space:
mode:
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c50
1 files changed, 41 insertions, 9 deletions
diff --git a/eval.c b/eval.c
index 86d0d15..f63f5e0 100644
--- a/eval.c
+++ b/eval.c
@@ -18,27 +18,28 @@ Datum nameis(Datum, Datum);
Datum assign(Datum, Datum);
Datum monadop(Datum, Datum);
Datum dyadop(Datum, Datum);
+Datum train(Datum, Datum);
Datum *lookup(Datum);
int bindingstrengths[11][11] = {
/* A F H MO DO AF ( ) ← IS N */
- 6, 3, 3, 4, 0, 0, 0, 0, 0, 0, 0, /* A */
- 2, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, /* F */
- 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, /* H */
+ 7, 4, 4, 5, 0, 0, 0, 0, 0, 0, 0, /* A */
+ 3, 2, 5, 5, 0, 0, 0, 0, 0, 0, 0, /* F */
+ 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, /* H */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* MO */
- 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, /* DO */
- 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* AF */
- 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, /* ( */
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, /* ) */
+ 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, /* DO */
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* AF */
+ 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, /* ( */
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, /* ) */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ← */
1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* IS */
- 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, /* N */
+ 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, /* N */
};
evalfn evalfns[11][11] = {
/* A F H MO DO AF ( ) ← IS N */
strand, dyadfun, dyadfun, monadop, 0, 0, 0, 0, 0, 0, 0, /* A */
- monadfun, 0, monadop, monadop, 0, 0, 0, 0, 0, 0, 0, /* F */
+ monadfun, train, monadop, monadop, 0, 0, 0, 0, 0, 0, 0, /* F */
0, 0, 0, monadop, 0, 0, 0, 0, 0, 0, 0, /* H */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* MO */
dyadop, dyadop, dyadop, 0, 0, 0, 0, 0, 0, 0, 0, /* DO */
@@ -287,4 +288,35 @@ dyadop(Datum left, Datum right)
if(arg->tag == ArrayTag)
incref(arg->array);
return result;
+}
+
+Datum
+train(Datum left, Datum right)
+{
+ Datum result;
+ result.shy = 0;
+ result.tag = FunctionTag;
+ result.func.type = FunctypeTrain;
+ result.func.left = left.func.left;
+
+ if(left.func.type == FunctypeTrain)
+ result.func = left.func;
+ else{
+ result.func.train.nfuncs = 1;
+ result.func.train.funcs = malloc(sizeof(Function));
+ result.func.train.funcs[0] = left.func;
+ }
+
+ if(right.func.type == FunctypeTrain){
+ int oldn = result.func.train.nfuncs;
+ result.func.train.nfuncs = oldn + right.func.train.nfuncs;
+ result.func.train.funcs = realloc(result.func.train.funcs, sizeof(Function) * result.func.train.nfuncs);
+ for(int i = 0; i < right.func.train.nfuncs; i++)
+ result.func.train.funcs[oldn + i] = right.func.train.funcs[i];
+ }else{
+ result.func.train.nfuncs++;
+ result.func.train.funcs = realloc(result.func.train.funcs, sizeof(Function) * result.func.train.nfuncs);
+ result.func.train.funcs[result.func.train.nfuncs-1] = right.func;
+ }
+ return result;
} \ No newline at end of file