summaryrefslogtreecommitdiff
path: root/functions.c
diff options
context:
space:
mode:
authorPeter Mikkelsen <petermikkelsen10@gmail.com>2022-01-13 20:33:51 +0000
committerPeter Mikkelsen <petermikkelsen10@gmail.com>2022-01-13 20:33:51 +0000
commit2d498de6c105e57c32c9048e5901955556ab38bf (patch)
tree47f1f2b2d0946345a21ea8bad7383282d4102e86 /functions.c
parent50d6dd8b50958271bf1ff13f99dc21d4cd8431f7 (diff)
Implement dyadic (integer only) version of + - × ÷ * ⍟
Diffstat (limited to 'functions.c')
-rw-r--r--functions.c126
1 files changed, 120 insertions, 6 deletions
diff --git a/functions.c b/functions.c
index bbac1a9..db9fe01 100644
--- a/functions.c
+++ b/functions.c
@@ -62,12 +62,12 @@ fnmonad monadfunctiondefs[] = {
};
fndyad dyadfunctiondefs[] = {
- 0, /* + */
- 0, /* - */
- 0, /* × */
- 0, /* ÷ */
- 0, /* * */
- 0, /* ⍟ */
+ fnPlus, /* + */
+ fnMinus, /* - */
+ fnTimes, /* × */
+ fnDivide, /* ÷ */
+ fnPower, /* * */
+ fnLogarithm, /* ⍟ */
0, /* ⌹ */
0, /* ○ */
0, /* ! */
@@ -189,6 +189,120 @@ fnShape(Array *right)
/* Dyadic functions */
Array *
+fnPlus(Array *left, Array *right)
+{
+ Array *leftarr;
+ Array *rightarr;
+ int rankok = scalarextend(left, right, &leftarr, &rightarr);
+ if(!rankok){
+ print("Ranks don't match lol\n");
+ exits(nil);
+ }
+
+ Array *res = duparray(leftarr);
+ for(int i = 0; i < leftarr->size; i++)
+ res->intdata[i] += rightarr->intdata[i];
+ freearray(leftarr);
+ freearray(rightarr);
+ return res;
+}
+
+Array *
+fnMinus(Array *left, Array *right)
+{
+ Array *leftarr;
+ Array *rightarr;
+ int rankok = scalarextend(left, right, &leftarr, &rightarr);
+ if(!rankok){
+ print("Ranks don't match lol\n");
+ exits(nil);
+ }
+
+ Array *res = duparray(leftarr);
+ for(int i = 0; i < leftarr->size; i++)
+ res->intdata[i] -= rightarr->intdata[i];
+ freearray(leftarr);
+ freearray(rightarr);
+ return res;
+}
+
+Array *
+fnTimes(Array *left, Array *right)
+{
+ Array *leftarr;
+ Array *rightarr;
+ int rankok = scalarextend(left, right, &leftarr, &rightarr);
+ if(!rankok){
+ print("Ranks don't match lol\n");
+ exits(nil);
+ }
+
+ Array *res = duparray(leftarr);
+ for(int i = 0; i < leftarr->size; i++)
+ res->intdata[i] *= rightarr->intdata[i];
+ freearray(leftarr);
+ freearray(rightarr);
+ return res;
+}
+
+Array *
+fnDivide(Array *left, Array *right)
+{
+ Array *leftarr;
+ Array *rightarr;
+ int rankok = scalarextend(left, right, &leftarr, &rightarr);
+ if(!rankok){
+ print("Ranks don't match lol\n");
+ exits(nil);
+ }
+
+ Array *res = duparray(leftarr);
+ for(int i = 0; i < leftarr->size; i++)
+ res->intdata[i] /= rightarr->intdata[i];
+ freearray(leftarr);
+ freearray(rightarr);
+ return res;
+}
+
+Array *
+fnPower(Array *left, Array *right)
+{
+ Array *leftarr;
+ Array *rightarr;
+ int rankok = scalarextend(left, right, &leftarr, &rightarr);
+ if(!rankok){
+ print("Ranks don't match lol\n");
+ exits(nil);
+ }
+
+ Array *res = duparray(leftarr);
+ for(int i = 0; i < leftarr->size; i++)
+ res->intdata[i] = pow(res->intdata[i], rightarr->intdata[i]);
+ freearray(leftarr);
+ freearray(rightarr);
+ return res;
+}
+
+Array *
+fnLogarithm(Array *left, Array *right)
+{
+ Array *leftarr;
+ Array *rightarr;
+ int rankok = scalarextend(left, right, &leftarr, &rightarr);
+ if(!rankok){
+ print("Ranks don't match lol\n");
+ exits(nil);
+ }
+
+ Array *res = duparray(leftarr);
+ for(int i = 0; i < leftarr->size; i++)
+ res->intdata[i] = log(rightarr->intdata[i])/log(res->intdata[i]);
+ freearray(leftarr);
+ freearray(rightarr);
+ return res;
+}
+
+Array *
fnLeft(Array *left, Array *right)
{
USED(right);