aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShinya Sato <shinnya.sato@gmail.com>2022-07-20 00:00:44 +0900
committerShinya Sato <shinnya.sato@gmail.com>2022-07-20 00:00:44 +0900
commitc57cb1fd511d2c69bf332324c73608f309bb4772 (patch)
tree634287f3becc3fae3f81b09cf808b95bba009cae /src
parente9db0870164cfec10aa219cc0898c30f6a888f53 (diff)
parent633a31e251950349d3b8f9ae208af55667a4f9c4 (diff)
downloadinpla-c57cb1fd511d2c69bf332324c73608f309bb4772.tar.gz
inpla-c57cb1fd511d2c69bf332324c73608f309bb4772.zip
Merge branch 'develop'
Diffstat (limited to 'src')
-rw-r--r--src/id_table.c4
-rw-r--r--src/id_table.h4
-rw-r--r--src/inpla.y173
3 files changed, 170 insertions, 11 deletions
diff --git a/src/id_table.c b/src/id_table.c
index bf8be22..3dea99c 100644
--- a/src/id_table.c
+++ b/src/id_table.c
@@ -52,6 +52,7 @@ void IdTable_init() {
IdTable[ID_MOD].aux.arity = 2;
IdTable[ID_MOD2].aux.arity = 2;
IdTable[ID_ERASER].aux.arity = 0;
+ IdTable[ID_DUP].aux.arity = 2;
IdTable[ID_INT].name = "int";
@@ -80,6 +81,7 @@ void IdTable_init() {
IdTable[ID_MOD2].name = "_Mod";
IdTable[ID_ERASER].name = "Eraser";
+ IdTable[ID_DUP].name = "Dup";
}
@@ -112,6 +114,8 @@ int IdTable_getid_builtin_funcAgent(Ast *agent) {
id = ID_MERGER;
} else if (strcmp((char *)agent->left->sym, "Eraser") == 0) {
id = ID_ERASER;
+ } else if (strcmp((char *)agent->left->sym, "Dup") == 0) {
+ id = ID_DUP;
}
return id;
diff --git a/src/id_table.h b/src/id_table.h
index c08732e..2b13e48 100644
--- a/src/id_table.h
+++ b/src/id_table.h
@@ -49,11 +49,11 @@
#define ID_MOD 26
#define ID_MOD2 27
#define ID_ERASER 28
-#define END_ID_OF_BUILTIN_OP_AGENT 28
+#define ID_DUP 29
+#define END_ID_OF_BUILTIN_OP_AGENT 29
#define START_ID_OF_AGENT END_ID_OF_BUILTIN_OP_AGENT+1
-//#define NUM_AGENTS 1024
#define END_ID_OF_AGENT 255
#define NUM_AGENTS END_ID_OF_AGENT+1 // 256
diff --git a/src/inpla.y b/src/inpla.y
index b68ee4c..79e460e 100644
--- a/src/inpla.y
+++ b/src/inpla.y
@@ -22,8 +22,8 @@
// ----------------------------------------------
-#define VERSION "0.8.2-2"
-#define BUILT_DATE "29 May 2022"
+#define VERSION "0.8.3"
+#define BUILT_DATE "19 July 2022"
// ------------------------------------------------------------------
@@ -1345,7 +1345,7 @@ VALUE myalloc_Name(Heap *hp) {
}
-unsigned long Heap_getnum_used_forName(Heap *hp) {
+unsigned long Heap_GetNum_Usage_forName(Heap *hp) {
int i;
unsigned long total=0;
for (i=0; i < hp->size; i++) {
@@ -1355,7 +1355,7 @@ unsigned long Heap_getnum_used_forName(Heap *hp) {
}
return total;
}
-unsigned long Heap_getnum_used_forAgent(Heap *hp) {
+unsigned long Heap_GetNum_Usage_forAgent(Heap *hp) {
int i;
unsigned long total=0;
for (i=0; i < hp->size; i++) {
@@ -2124,8 +2124,8 @@ void flush_name_port0(VALUE ptr) {
#ifdef VERBOSE_NODE_USE
#ifndef THREAD
printf("(%lu agents and %lu names nodes are used.)\n",
- Heap_getnum_used_forAgent(&VM.agentHeap),
- Heap_getnum_used_forName(&VM.nameHeap));
+ Heap_GetNum_Usage_forAgent(&VM.agentHeap),
+ Heap_GetNum_Usage_forName(&VM.nameHeap));
#endif
#endif
@@ -8864,6 +8864,21 @@ loop_a2IsFixnum:
free_Agent(a1);
return;
}
+
+ case ID_DUP:
+ {
+ COUNTUP_INTERACTION(vm);
+
+ // Dup(x,y) ~ (int n) --> x~n, y~n;
+ VALUE a1port = AGENT(a1)->port[0];
+ PUSH(vm, a1port, a2);
+
+ a1port = AGENT(a1)->port[1];
+ free_Agent(a1);
+ a1 = a1port;
+ goto loop;
+ }
+
}
@@ -9009,6 +9024,8 @@ loop_a2IsAgent:
code = RuleTable_get_code(a1, a2, &result);
if (result == 0) {
+ // there is no user-defined rule.
+
loop_agent_a1_a2_this_order:
@@ -9050,6 +9067,143 @@ loop_agent_a1_a2_this_order:
}
}
break;
+
+
+ case ID_DUP:
+ {
+ // Dup(p1,p2) ~ Alpha(b1,...,b5)
+ COUNTUP_INTERACTION(vm);
+
+ if (BASIC(a2)->id == ID_DUP) {
+ // Dup(p1,p2) >< Dup(b1,b2) => p1~b1, b2~b2;
+ VALUE a1p = AGENT(a1)->port[0];
+ VALUE a2p = AGENT(a2)->port[0];
+ PUSH(vm, a1p, a2p);
+
+ a1p = AGENT(a1)->port[1];
+ a2p = AGENT(a2)->port[1];
+
+ free_Agent2(a1,a2);
+ a1 = a1p;
+ a2 = a2p;
+ goto loop;
+ }
+
+ int arity = IdTable_get_arity(BASIC(a2)->id);
+ switch (arity) {
+ case 0:
+ {
+ // Dup(p0,p1) >< A => p0~A, p1~A;
+ VALUE a1p = AGENT(a1)->port[0];
+ VALUE new_a2 = make_Agent(vm, BASIC(a2)->id);
+ PUSH(vm, a1p, new_a2);
+
+ a1p = AGENT(a1)->port[1];
+ free_Agent(a1);
+ a1=a1p;
+ goto loop;
+ }
+
+ case 1:
+ {
+ // Dup(p0,p1) >< A(a2p0) => p1~A(w2), p0~A(w1),
+ // Dup(w1,w2)~a2p0;
+ VALUE a2p0 = AGENT(a2)->port[0];
+ int a2id = BASIC(a2)->id;
+
+ // p1
+ VALUE new_a2 = make_Agent(vm, a2id);
+ VALUE w = make_Name(vm);
+ AGENT(new_a2)->port[0] = w;
+ PUSH(vm, AGENT(a1)->port[1], new_a2);
+ AGENT(a1)->port[1] = w;
+
+ // p0
+ w = make_Name(vm);
+ AGENT(a2)->port[0] = w;
+ PUSH(vm, AGENT(a1)->port[0], a2);
+ AGENT(a1)->port[0] = w;
+
+ a2 = a2p0;
+ goto loop;
+ }
+
+
+ default:
+ {
+ // Dup(p0,p1) >< A(a2p0, a2p1) =>
+ // p0~A(w0,w1), (*L)Dup(w0,ww0)~a2p0
+ // p1~(*R)A(ww0,ww1), Dup(w1,ww1)~a2p1,
+
+ // Dup(p0,p1) >< A(a2p0, a2p1, a2p2) =>
+ // p0~A(w0,w1,w2), (*L)Dup(w0,ww0)~a2p0
+ // p1~(*R)A(ww0,ww1,ww2), Dup(w1,ww1)~a2p1,
+ // Dup(w2,ww2)~a2p2;
+
+ // Dup(p0,p1) >< A(a2p0, a2p1, a2p2 a2p3) =>
+ // p0~A(w0,w1,w2,w3), (*L)Dup(w0,ww0)~a2p0
+ // p1~(*R)A(ww0,ww1,ww2,ww3), Dup(w1,ww1)~a2p1,
+ // Dup(w2,ww2)~a2p2,
+ // Dup(w3,ww3)~a2p3;
+
+ // newA = mkAgent(A);
+ // for (i=0; i<arity; i++) { newA->p[i] = w_i; }
+ //
+ // for (i=1; i<arity; i++) {
+ // newDup( newA->p[i], newWW_i) ~ a2[i]
+ // a2[i] = newWW_i;
+ // }
+ // p0_preserve = p0;
+ // p1_preserve = p1;
+ // (*L)Dup(w0, newWW0) ~ a2[0] // this destroys the p0 and p1.
+ //
+ // p0_preserve ~ newA
+ // a2[0] = newWW0;
+
+ // p1_preserve ~ a2; <-- This will be `goto loop`.
+
+
+ int a2id = BASIC(a2)->id;
+ VALUE new_a2 = make_Agent(vm, a2id);
+ for (int i=0; i<arity; i++) {
+ AGENT(new_a2)->port[i] = make_Name(vm);
+ }
+
+ for (int i=1; i<arity; i++) {
+ VALUE new_dup = make_Agent(vm, ID_DUP);
+ AGENT(new_dup)->port[0] = AGENT(new_a2)->port[i];
+
+ VALUE new_ww = make_Name(vm);
+ AGENT(new_dup)->port[1] = new_ww;
+
+ PUSH(vm, new_dup, AGENT(a2)->port[i]);
+
+ AGENT(a2)->port[i] = new_ww;
+ }
+
+ VALUE a1p0 = AGENT(a1)->port[0];
+ VALUE a1p1 = AGENT(a1)->port[1];
+
+ AGENT(a1)->port[0] = AGENT(new_a2)->port[0];
+ VALUE new_ww = make_Name(vm);
+ AGENT(a1)->port[1] = new_ww;
+ PUSH(vm, a1, AGENT(a2)->port[0]);
+
+ PUSH(vm, a1p0, new_a2);
+
+ AGENT(a2)->port[0] = new_ww;
+
+ a1 = a1p1;
+
+ goto loop;
+ }
+
+
+ }
+ }
+ break;
+
+
case ID_TUPLE0:
if (BASIC(a2)->id == ID_TUPLE0) {
@@ -9361,7 +9515,8 @@ loop_agent_a1_a2_this_order:
if ((BASIC(a1)->id < BASIC(a2)->id)
- || (BASIC(a2)->id == ID_ERASER)){
+ || (BASIC(a2)->id == ID_ERASER)
+ || (BASIC(a2)->id == ID_DUP)){
VALUE tmp;
tmp = a1;
a1 = a2;
@@ -9752,8 +9907,8 @@ int exec(Ast *at) {
#ifdef VERBOSE_NODE_USE
printf("(%lu agents and %lu names nodes are used.)\n",
- Heap_getnum_used_forAgent(&VM.agentHeap),
- Heap_getnum_used_forName(&VM.nameHeap));
+ Heap_GetNum_Usage_forAgent(&VM.agentHeap),
+ Heap_GetNum_Usage_forName(&VM.nameHeap));
#endif
#ifdef COUNT_CNCT