diff options
Diffstat (limited to '')
| -rw-r--r-- | src/id_table.c | 4 | ||||
| -rw-r--r-- | src/id_table.h | 3 | ||||
| -rw-r--r-- | src/inpla.y | 91 |
3 files changed, 95 insertions, 3 deletions
diff --git a/src/id_table.c b/src/id_table.c index 2ad96ad..fc22bb1 100644 --- a/src/id_table.c +++ b/src/id_table.c @@ -54,6 +54,7 @@ void IdTable_init() { IdTable[ID_MOD].aux.arity = 2; IdTable[ID_MOD2].aux.arity = 2; IdTable[ID_PERCENT].aux.arity = 1; + IdTable[ID_MAP].aux.arity = 2; IdTable[ID_ERASER].aux.arity = 0; IdTable[ID_DUP].aux.arity = 2; @@ -86,6 +87,7 @@ void IdTable_init() { IdTable[ID_MOD].name = "Mod"; IdTable[ID_MOD2].name = "_Mod"; IdTable[ID_PERCENT].name = "%"; + IdTable[ID_MAP].name = "Map"; IdTable[ID_ERASER].name = "Eraser"; IdTable[ID_DUP].name = "Dup"; @@ -117,6 +119,8 @@ int IdTable_getid_builtin_funcAgent(Ast *agent) { id = ID_APPEND; } else if (strcmp((char *)agent->left->sym, "Zip") == 0) { id = ID_ZIP; + } else if (strcmp((char *)agent->left->sym, "Map") == 0) { + id = ID_MAP; } else if (strcmp((char *)agent->left->sym, "Int") == 0) { id = ID_INTAGENT; } else if (strcmp((char *)agent->left->sym, "Merger") == 0) { diff --git a/src/id_table.h b/src/id_table.h index 7ee04bc..c486975 100644 --- a/src/id_table.h +++ b/src/id_table.h @@ -51,7 +51,8 @@ #define ID_MOD 28 #define ID_MOD2 29 #define ID_PERCENT 30 -#define END_ID_OF_BUILTIN_OP_AGENT 30 +#define ID_MAP 31 +#define END_ID_OF_BUILTIN_OP_AGENT 31 // ID_ERASER and ID_DUP was put as 254, 255 // because these IDs are wanted larger like ID_DUP > any_agent.id diff --git a/src/inpla.y b/src/inpla.y index 182bed7..6053ff1 100644 --- a/src/inpla.y +++ b/src/inpla.y @@ -22,8 +22,8 @@ // ---------------------------------------------- -#define VERSION "0.9.1" -#define BUILT_DATE "28 July 2022" +#define VERSION "0.9.2" +#define BUILT_DATE "30 July 2022" // ------------------------------------------------------------------ @@ -9635,6 +9635,93 @@ loop_agent_a1_a2_this_order: break; // end ID_ZIPC + case ID_MAP: + switch (BASIC(a2)->id) { + case ID_NIL: + { + // Map(result, f) >< [] => result~[], Eraser~f; + COUNTUP_INTERACTION(vm); + + VALUE a1p0 = AGENT(a1)->port[0]; + VALUE a1p1 = AGENT(a1)->port[1]; + + // Eraser + BASIC(a1)->id = ID_ERASER; + PUSH(vm, a1, a1p1); + + a1=a1p0; + goto loop; + } + + case ID_CONS: + { + COUNTUP_INTERACTION(vm); + + VALUE a1p0 = AGENT(a1)->port[0]; + VALUE a1p1 = AGENT(a1)->port[1]; + + VALUE a2p0 = AGENT(a2)->port[0]; + VALUE a2p1 = AGENT(a2)->port[1]; + VALUE w = make_Name(vm); + VALUE ws = make_Name(vm); + + VALUE pair = make_Agent(vm, ID_TUPLE2); + + AGENT(a2)->port[0] = w; + AGENT(a2)->port[1] = ws; + PUSH(vm, a1p0, a2); + + /* + if ((IS_NAMEID(BASIC(a1p1)->id)) + && (NAME(a1p1)->port != NULL)) { + VALUE a1p1_agent = NAME(a1p1)->port; + free_Name(a1p1); + AGENT(a1)->port[1] = a1p1_agent; + } + */ + + if (BASIC(a1p1)->id == ID_PERCENT) { + // special case + //Map(result, %f) >< x:xs => + // result~w:ws, + // %f ~ (w, x), Map(ws, %f)~xs; + + AGENT(pair)->port[0] = w; + AGENT(pair)->port[1] = a2p0; + VALUE new_percent = make_Agent(vm, ID_PERCENT); + AGENT(new_percent)->port[0] = AGENT(a1p1)->port[0]; + PUSH(vm, new_percent, pair); + + AGENT(a1)->port[0] = ws; + a2 = a2p1; + goto loop; + } + + // Map(result, f) >< x:xs => Dup(f1,f2)~f, + // result~w:ws, + // f1 ~ (w, x), map(ws, f2)~xs; + + VALUE dup = make_Agent(vm, ID_DUP); + VALUE f1 = make_Name(vm); + VALUE f2 = make_Name(vm); + AGENT(dup)->port[0] = f1; + AGENT(dup)->port[1] = f2; + PUSH(vm, dup, a1p1); + + AGENT(pair)->port[0] = w; + AGENT(pair)->port[1] = a2p0; + PUSH(vm, f1, pair); + + AGENT(a1)->port[0] = ws; + AGENT(a1)->port[1] = f2; + a2 = a2p1; + goto loop; + + } + } + + break; // end ID_MAP + case ID_MERGER: switch (BASIC(a2)->id) { |
