aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShinya Sato <shinnya.sato@gmail.com>2022-07-28 14:41:04 +0900
committerShinya Sato <shinnya.sato@gmail.com>2022-07-28 14:41:04 +0900
commitabd0e738f2c928b37acab0d5145a226dc872af69 (patch)
treecedae242126d8145e06387f275dfa7b58b7c27c0 /src
parent8ec1385229c73246d89441f15a140d3eeeec093d (diff)
downloadinpla-abd0e738f2c928b37acab0d5145a226dc872af69.tar.gz
inpla-abd0e738f2c928b37acab0d5145a226dc872af69.zip
v0.9.1
Diffstat (limited to 'src')
-rw-r--r--src/id_table.c6
-rw-r--r--src/id_table.h30
-rw-r--r--src/inpla.y96
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) {