diff options
| author | Shinya Sato <shinnya.sato@gmail.com> | 2022-07-28 14:57:42 +0900 |
|---|---|---|
| committer | Shinya Sato <shinnya.sato@gmail.com> | 2022-07-28 14:57:42 +0900 |
| commit | cb5035ee44fc9c242dcac4704fcf543a31681140 (patch) | |
| tree | fc2fb3fb58705ad0d5543095c1833f8b220c71cc /src | |
| parent | a65ef22b5a36cd211883e094daf1ecf74bd40d66 (diff) | |
| parent | d0dcc63979c04e5c0fac4e776b87298ca3d8678a (diff) | |
| download | inpla-cb5035ee44fc9c242dcac4704fcf543a31681140.tar.gz inpla-cb5035ee44fc9c242dcac4704fcf543a31681140.zip | |
Merge branch 'develop'
Diffstat (limited to 'src')
| -rw-r--r-- | src/id_table.c | 6 | ||||
| -rw-r--r-- | src/id_table.h | 30 | ||||
| -rw-r--r-- | src/inpla.y | 96 |
3 files changed, 115 insertions, 17 deletions
diff --git a/src/id_table.c b/src/id_table.c index 07706f9..2ad96ad 100644 --- a/src/id_table.c +++ b/src/id_table.c @@ -39,6 +39,8 @@ void IdTable_init() { IdTable[ID_INTAGENT].aux.arity = 1; IdTable[ID_APPEND].aux.arity = 2; + IdTable[ID_ZIP].aux.arity = 2; + IdTable[ID_ZIPC].aux.arity = 2; IdTable[ID_MERGER].aux.arity = 1; IdTable[ID_MERGER_P].aux.arity = 1; IdTable[ID_ADD].aux.arity = 2; @@ -69,6 +71,8 @@ void IdTable_init() { IdTable[ID_INTAGENT].name = "Int"; IdTable[ID_APPEND].name = "Append"; + IdTable[ID_ZIP].name = "Zip"; + IdTable[ID_ZIPC].name = "ZipC"; IdTable[ID_MERGER].name = "Merger"; IdTable[ID_MERGER_P].name = "_MergerP"; IdTable[ID_ADD].name = "Add"; @@ -111,6 +115,8 @@ int IdTable_getid_builtin_funcAgent(Ast *agent) { id = ID_MOD; } else if (strcmp((char *)agent->left->sym, "Append") == 0) { id = ID_APPEND; + } else if (strcmp((char *)agent->left->sym, "Zip") == 0) { + id = ID_ZIP; } 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 152b028..7ee04bc 100644 --- a/src/id_table.h +++ b/src/id_table.h @@ -36,20 +36,22 @@ #define START_ID_OF_BUILTIN_OP_AGENT 15 #define ID_APPEND 15 -#define ID_MERGER 16 -#define ID_MERGER_P 17 -#define ID_ADD 18 -#define ID_ADD2 19 -#define ID_SUB 20 -#define ID_SUB2 21 -#define ID_MUL 22 -#define ID_MUL2 23 -#define ID_DIV 24 -#define ID_DIV2 25 -#define ID_MOD 26 -#define ID_MOD2 27 -#define ID_PERCENT 28 -#define END_ID_OF_BUILTIN_OP_AGENT 28 +#define ID_ZIP 16 +#define ID_ZIPC 17 +#define ID_MERGER 18 +#define ID_MERGER_P 19 +#define ID_ADD 20 +#define ID_ADD2 21 +#define ID_SUB 22 +#define ID_SUB2 23 +#define ID_MUL 24 +#define ID_MUL2 25 +#define ID_DIV 26 +#define ID_DIV2 27 +#define ID_MOD 28 +#define ID_MOD2 29 +#define ID_PERCENT 30 +#define END_ID_OF_BUILTIN_OP_AGENT 30 // 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 b7243d0..182bed7 100644 --- a/src/inpla.y +++ b/src/inpla.y @@ -22,8 +22,8 @@ // ---------------------------------------------- -#define VERSION "0.9.0" -#define BUILT_DATE "25 July 2022" +#define VERSION "0.9.1" +#define BUILT_DATE "28 July 2022" // ------------------------------------------------------------------ @@ -9526,7 +9526,7 @@ loop_agent_a1_a2_this_order: case ID_CONS: { - // App(r,a) >< [x|xs] => r~(*R)[x|w], (*L)App(w,a)~xs; + // App(r,a) >< x:xs => r~(*R)x:w, (*L)App(w,a)~xs; COUNTUP_INTERACTION(vm); VALUE a1p0 = AGENT(a1)->port[0]; @@ -9545,6 +9545,96 @@ loop_agent_a1_a2_this_order: break; // end ID_APPEND + + case ID_ZIP: + switch (BASIC(a2)->id) { + case ID_NIL: + { + // Zip(r, blist) >< [] => r~[], blist~Eraser; + COUNTUP_INTERACTION(vm); + + VALUE a1p0 = AGENT(a1)->port[0]; + VALUE a1p1 = AGENT(a1)->port[1]; + + // Eraser + BASIC(a1)->id = ID_ERASER; + PUSH(vm, a1p1, a1); + + a1=a1p0; + goto loop; + } + + case ID_CONS: + { + // Zip(r, blist) >< x:xs => Zip_Cons(r,x:xs)~blist; + COUNTUP_INTERACTION(vm); + + VALUE a1p1 = AGENT(a1)->port[1]; + + BASIC(a1)->id = ID_ZIPC; + AGENT(a1)->port[1] = a2; + a2 = a1p1; + goto loop; + } + } + + break; // end ID_ZIP + + case ID_ZIPC: + switch (BASIC(a2)->id) { + case ID_NIL: + { + // Zip_Cons(r, x:xs)><[] => r~[], x:xs~Eraser; + COUNTUP_INTERACTION(vm); + + VALUE a1p0 = AGENT(a1)->port[0]; + VALUE a1p1 = AGENT(a1)->port[1]; + + // Eraser + BASIC(a1)->id = ID_ERASER; + PUSH(vm, a1p1, a1); + + a1=a1p0; + goto loop; + } + + case ID_CONS: + { + // Zip_Cons(r, (*1)x:xs) >< y:ys => + // r~(*R)((*1)(y,x):ws), (*L)Zip(ws,ys)~xs; + COUNTUP_INTERACTION(vm); + + VALUE r = AGENT(a1)->port[0]; + VALUE inner_cons = AGENT(a1)->port[1]; + VALUE xs = AGENT(inner_cons)->port[1]; + VALUE ys = AGENT(a2)->port[1]; + + // (*1)(y,x) + BASIC(inner_cons)->id = ID_TUPLE2; + VALUE x = AGENT(inner_cons)->port[0]; + VALUE y = AGENT(a2)->port[0]; + AGENT(inner_cons)->port[0] = y; + AGENT(inner_cons)->port[1] = x; + + // (*R)((*1)(y,x):ws) + VALUE ws = make_Name(vm); + AGENT(a2)->port[0] = inner_cons; + AGENT(a2)->port[1] = ws; + + PUSH(vm, r, a2); + + // (*L)Zip(ws,ys)~xs; + BASIC(a1)->id = ID_ZIP; + AGENT(a1)->port[0] = ws; + AGENT(a1)->port[1] = ys; + a2 = xs; + goto loop; + } + } + + break; // end ID_ZIPC + + case ID_MERGER: switch (BASIC(a2)->id) { |
