•math trig functions

This commit is contained in:
dzaima 2021-06-26 19:23:02 +03:00
parent 98166dd809
commit d087898359
2 changed files with 23 additions and 0 deletions

View File

@ -1,6 +1,7 @@
#include "../core.h"
#include "../utils/each.h"
#include "../utils/builtins.h"
#include "../nfns.h"
#include <math.h>
static inline B arith_recm(BB2B f, B x) {
@ -21,6 +22,12 @@ B floor_c1(B t, B x) { if (isF64(x)) return m_f64(floor(x.f)); P1(floor); thrM("
B ceil_c1(B t, B x) { if (isF64(x)) return m_f64( ceil(x.f)); P1( ceil); thrM("⌈: Argument was not a number"); }
B stile_c1(B t, B x) { if (isF64(x)) return m_f64( fabs(x.f)); P1(stile); thrM("|: Argument was not a number"); }
B log_c1(B t, B x) { if (isF64(x)) return m_f64( log(x.f)); P1( log); thrM("⋆⁼: Getting log of non-number"); }
B sin_c1(B t, B x) { if (isF64(x)) return m_f64( sin(x.f)); P1( sin); thrM("•math.Sin: Argument contained non-number"); }
B cos_c1(B t, B x) { if (isF64(x)) return m_f64( cos(x.f)); P1( cos); thrM("•math.Cos: Argument contained non-number"); }
B tan_c1(B t, B x) { if (isF64(x)) return m_f64( tan(x.f)); P1( tan); thrM("•math.Tan: Argument contained non-number"); }
B asin_c1(B t, B x) { if (isF64(x)) return m_f64( asin(x.f)); P1( asin); thrM("•math.Asin: Argument contained non-number"); }
B acos_c1(B t, B x) { if (isF64(x)) return m_f64( acos(x.f)); P1( acos); thrM("•math.Acos: Argument contained non-number"); }
B atan_c1(B t, B x) { if (isF64(x)) return m_f64( atan(x.f)); P1( atan); thrM("•math.Atan: Argument contained non-number"); }
#undef P1
B lt_c1(B t, B x) { return m_unit(x); }
@ -28,6 +35,20 @@ B eq_c1(B t, B x) { B r = m_i32(isArr(x)? rnk(x) : 0); decR(x); return r; }
B ne_c1(B t, B x) { B r = m_f64(isArr(x)&&rnk(x)? *a(x)->sh : 1); decR(x); return r; }
static B internalNS;
B getMathNS() {
if (internalNS.u == 0) {
#define F(X,N) m_nfn(registerNFn(m_str32(U"•math." N), X##_c1, c2_invalid),m_f64(0)),
B fn = bqn_exec(m_str32(U"{⟨ Sin, Cos, Tan, Asin, Acos, Atan ⟩⇐𝕩}"), inc(bi_emptyCVec), inc(bi_emptySVec));
B arg = m_caB(6, (B[]){F(sin,U"Sin")F(cos,U"Cos")F(tan,U"Tan")F(asin,U"Asin")F(acos,U"Acos")F(atan,U"Atan")});
#undef F
internalNS = c1(fn,arg);
gc_add(internalNS);
dec(fn);
}
return inc(internalNS);
}
void arith_init() {
c(BFn,bi_add)->ident = c(BFn,bi_sub)->ident = c(BFn,bi_or )->ident = c(BFn,bi_ne)->ident = c(BFn,bi_gt)->ident = m_i32(0);
c(BFn,bi_mul)->ident = c(BFn,bi_div)->ident = c(BFn,bi_and)->ident = c(BFn,bi_eq)->ident = c(BFn,bi_ge)->ident = c(BFn,bi_pow)->ident = c(BFn,bi_not)->ident = m_i32(1);

View File

@ -293,6 +293,7 @@ B exit_c1(B t, B x) {
}
B getInternalNS();
B getMathNS();
static B file_nsGen;
B sys_c1(B t, B x) {
@ -316,6 +317,7 @@ B sys_c1(B t, B x) {
r.a[i] = inc(fileNS);
}
else if (eqStr(c, U"internal")) r.a[i] = getInternalNS();
else if (eqStr(c, U"math")) r.a[i] = getMathNS();
else if (eqStr(c, U"type")) r.a[i] = inc(bi_type);
else if (eqStr(c, U"decompose")) r.a[i] = inc(bi_decp);
else if (eqStr(c, U"primind")) r.a[i] = inc(bi_primInd);