aboutsummaryrefslogtreecommitdiff
path: root/src/inpla.y
diff options
context:
space:
mode:
authorShinya Sato <shinnya.sato@gmail.com>2022-07-21 14:59:34 +0900
committerShinya Sato <shinnya.sato@gmail.com>2022-07-21 14:59:34 +0900
commit4753a3914675dd8a3dfb8233062f90b65520ba4e (patch)
tree3632b01a2caa682c45962fad114f7b7504ea2c1f /src/inpla.y
parentc57cb1fd511d2c69bf332324c73608f309bb4772 (diff)
parent1f51c41a32e190d483ff336c34eb63acda27cbb6 (diff)
downloadinpla-4753a3914675dd8a3dfb8233062f90b65520ba4e.tar.gz
inpla-4753a3914675dd8a3dfb8233062f90b65520ba4e.zip
Merge branch 'develop'
Diffstat (limited to '')
-rw-r--r--src/inpla.y187
1 files changed, 143 insertions, 44 deletions
diff --git a/src/inpla.y b/src/inpla.y
index 79e460e..bc9cfc2 100644
--- a/src/inpla.y
+++ b/src/inpla.y
@@ -22,8 +22,8 @@
// ----------------------------------------------
-#define VERSION "0.8.3"
-#define BUILT_DATE "19 July 2022"
+#define VERSION "0.8.3-1"
+#define BUILT_DATE "21 July 2022"
// ------------------------------------------------------------------
@@ -9103,32 +9103,89 @@ loop_agent_a1_a2_this_order:
a1=a1p;
goto loop;
}
+
+ // a2p0 などが fixint の場合は即座に複製させる
case 1:
{
// Dup(p0,p1) >< A(a2p0) => p1~A(w2), p0~A(w1),
- // Dup(w1,w2)~a2p0;
+ // Dup(w1,w2)~a2p0;
+ // Dup(p0,p1) >< A(int a2p0) => p1~A(a2p0), p0~A(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;
+ if (IS_FIXNUM(a2p0)) {
+ AGENT(new_a2)->port[0] = a2p0;
+ PUSH(vm, AGENT(a1)->port[1], new_a2);
+ AGENT(a2)->port[0] = a2p0;
+
+ VALUE a1p0 = AGENT(a1)->port[0];
+ free_Agent(a1);
+
+ //PUSH(vm, a1p0, a2);
+ a1 = a1p0;
+ goto loop;
+
+ } else {
+ VALUE w = make_Name(vm);
+ AGENT(new_a2)->port[0] = w;
+ PUSH(vm, AGENT(a1)->port[1], new_a2);
+ AGENT(a1)->port[1] = w; // for (*L)dup
+
+ w = make_Name(vm);
+ AGENT(a2)->port[0] = w;
+ PUSH(vm, AGENT(a1)->port[0], a2);
+
+ AGENT(a1)->port[0] = w; // for (*L)dup
+
+ a2 = a2p0;
+ goto loop;
+ }
+
}
+ break;
+ case 2:
+ {
+ // Dup(p0,p1) >< Cons(int i, a2p1) =>
+ // p0~Cons(i,w), p1~(*R)Cons(i,ww), (*L)Dup(w,ww)~a2p1;
+
+ VALUE a2p0 = AGENT(a2)->port[0];
+ if (IS_FIXNUM(a2p0)) {
+ int a2id = BASIC(a2)->id;
+ VALUE new_a2 = make_Agent(vm, a2id);
+
+ AGENT(new_a2)->port[0] = a2p0;
+
+ VALUE w = make_Name(vm);
+ AGENT(new_a2)->port[1] = w;
+
+ PUSH(vm, AGENT(a1)->port[0], new_a2);
+ AGENT(a1)->port[0] = w;
+
+ VALUE a2p1 = AGENT(a2)->port[1];
+ VALUE ww = make_Name(vm);
+ AGENT(a2)->port[1] = ww;
+
+ PUSH(vm, AGENT(a1)->port[1], a2);
+ AGENT(a1)->port[1] = ww;
+
+ a2 = a2p1;
+ goto loop;
+ }
+
+ // otherwise: goto default
+ // So, DO NOT put break.
+ }
+
+
default:
{
// Dup(p0,p1) >< A(a2p0, a2p1) =>
@@ -9146,56 +9203,98 @@ loop_agent_a1_a2_this_order:
// Dup(w2,ww2)~a2p2,
// Dup(w3,ww3)~a2p3;
+
+ // Dup(p0,p1) >< A(a2p0, int a2p1, a2p2 a2p3) =>
+ // p0~A(w0,a2p1,w2,w3), (*L)Dup(w0,ww0)~a2p0
+ // p1~(*R)A(ww0,a2p1,ww2,ww3),
+ // Dup(w2,ww2)~a2p2,
+ // Dup(w3,ww3)~a2p3;
+
+
// newA = mkAgent(A);
- // for (i=0; i<arity; i++) { newA->p[i] = w_i; }
- //
+ // for (i=0; i<arity; i++) {
+ // if (!IS_FIXNUM(a2->p[i])) {
+ // newA->p[i] = w_i;
+ // } else {
+ // newA->p[i] = a2->p[i];
+ // }
+ // }
// for (i=1; i<arity; i++) {
- // newDup( newA->p[i], newWW_i) ~ a2[i]
- // a2[i] = newWW_i;
+ // if (!IS_FIXNUM(a2->p[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.
+ // if (!IS_FIXNUM(a2->p[0])) {
+ // 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`.
-
+ // p0_preserve ~ newA
+ // a2[0] = newWW0;
+ //
+ // p1_preserve ~ a2; <-- This will be `goto loop'.
+ // } else {
+ // p0 ~ newA;
+ // p1_preserve = p1;
+ // free_Agent((*L)Dup);
+ // 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);
+ VALUE a2pi = AGENT(a2)->port[i];
+ if (!IS_FIXNUM(a2pi)) {
+ AGENT(new_a2)->port[i] = make_Name(vm);
+ } else {
+ AGENT(new_a2)->port[i] = a2pi;
+ }
}
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 a2pi = AGENT(a2)->port[i];
- VALUE new_ww = make_Name(vm);
- AGENT(new_dup)->port[1] = new_ww;
+ if (!IS_FIXNUM(a2pi)) {
+
+ VALUE new_dup = make_Agent(vm, ID_DUP);
+ AGENT(new_dup)->port[0] = AGENT(new_a2)->port[i];
- PUSH(vm, new_dup, AGENT(a2)->port[i]);
+ VALUE new_ww = make_Name(vm);
+ AGENT(new_dup)->port[1] = new_ww;
+
+ PUSH(vm, new_dup, a2pi);
- AGENT(a2)->port[i] = new_ww;
+ AGENT(a2)->port[i] = new_ww;
+ }
}
+
+ VALUE a2p0 = AGENT(a2)->port[0];
+ if (!IS_FIXNUM(a2p0)) {
- VALUE a1p0 = AGENT(a1)->port[0];
- VALUE a1p1 = AGENT(a1)->port[1];
+ 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]);
+ AGENT(a1)->port[0] = AGENT(new_a2)->port[0];
+ VALUE new_ww = make_Name(vm);
+ AGENT(a1)->port[1] = new_ww;
+ PUSH(vm, a1, a2p0);
- PUSH(vm, a1p0, new_a2);
+ PUSH(vm, a1p0, new_a2);
- AGENT(a2)->port[0] = new_ww;
+ AGENT(a2)->port[0] = new_ww;
- a1 = a1p1;
+ a1 = a1p1;
- goto loop;
+ goto loop;
+ } else {
+ PUSH(vm, AGENT(a1)->port[0], new_a2);
+ VALUE a1p1 = AGENT(a1)->port[1];
+ free_Agent(a1);
+
+ a1=a1p1;
+ goto loop;
+ }
}