aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShinya Sato <shinnya.sato@gmail.com>2022-07-30 20:42:07 +0900
committerShinya Sato <shinnya.sato@gmail.com>2022-07-30 20:42:07 +0900
commitd0cd3d140252c55151cd30c4bfed2e35138a30fc (patch)
treecea203ebb8e6aae387acedff2c3282f6effb130a /src
parentd0dcc63979c04e5c0fac4e776b87298ca3d8678a (diff)
downloadinpla-d0cd3d140252c55151cd30c4bfed2e35138a30fc.tar.gz
inpla-d0cd3d140252c55151cd30c4bfed2e35138a30fc.zip
v0.9.2
Diffstat (limited to 'src')
-rw-r--r--src/id_table.c4
-rw-r--r--src/id_table.h3
-rw-r--r--src/inpla.y91
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) {