#include <u.h>#include <libc.h>#include <bio.h>#include "aa.h"#include "aa_math.h" #define CFUNC1(func) \ static aaObject * \ cf_##func(aaContext *ctx, aaObject *arg) \ { \ aaNumber x = aa_tonumber(ctx, aa_nextarg(ctx, &arg, 0)); \ return aa_number(ctx, aNumber(func(x.r), 0.0)); \ } #define CFUNC2(func) \ static aaObject * \ cf_##func(aaContext *ctx, aaObject *arg) \ { \ aaNumber x = aa_tonumber(ctx, aa_nextarg(ctx, &arg, 0)); \ aaNumber y = aa_tonumber(ctx, aa_nextarg(ctx, &arg, 0)); \ return aa_number(ctx, aNumber(func(x.r, y.r), 0.0)); \ } #define FUNCS \ CFUNC1(sin); \ CFUNC1(cos); \ CFUNC1(tan); \ CFUNC1(asin); \ CFUNC1(acos); \ CFUNC1(exp); \ CFUNC1(log); \ CFUNC1(sqrt); \ CFUNC1(floor); \ CFUNC1(log10); \ CFUNC1(sinh); \ CFUNC1(cosh); \ CFUNC1(tanh); \ FUNCSCFUNC1(fabs);CFUNC1(ceil);CFUNC2(pow); static aaObject *cf_atan2(aaContext *ctx, aaObject *arg){ aaNumber x = aa_tonumber(ctx, aa_nextarg(ctx, &arg, 0)); aaObject *yo = aa_nextarg(ctx, &arg, 1); aaNumber y = yo != nil ? aa_tonumber(ctx, yo) : aNumber(1.0, 0.0); return aa_number(ctx, aNumber(atan2(x.r, y.r), 0.0));} static aaObject *cf_truncate(aaContext *ctx, aaObject *arg){ aaNumber x = aa_tonumber(ctx, aa_nextarg(ctx, &arg, 0)); modf(x.r, &x.r); return aa_number(ctx, x);} #undef CFUNC1#undef CFUNC2#define CFUNC(func, name) aa_set(ctx, aa_symbol(ctx, name), aa_cfunc(ctx, cf_##func))#define CFUNC1(x) CFUNC(x, #x)#define CFUNC2(x) CFUNC(x, #x) voidaa_include_math(aaContext *ctx){ FUNCS; CFUNC(fabs, "abs"); CFUNC(ceil, "ceiling"); CFUNC(pow, "expt"); CFUNC(atan2, "atan"); CFUNC(truncate, "truncate");}
#include <u.h>
#include <libc.h>
#include <bio.h>
#include "aa.h"
#include "aa_math.h"
#define CFUNC1(func) \
static aaObject * \
cf_##func(aaContext *ctx, aaObject *arg) \
{ \
aaNumber x = aa_tonumber(ctx, aa_nextarg(ctx, &arg, 0)); \
return aa_number(ctx, aNumber(func(x.r), 0.0)); \
}
#define CFUNC2(func) \
static aaObject * \
cf_##func(aaContext *ctx, aaObject *arg) \
{ \
aaNumber x = aa_tonumber(ctx, aa_nextarg(ctx, &arg, 0)); \
aaNumber y = aa_tonumber(ctx, aa_nextarg(ctx, &arg, 0)); \
return aa_number(ctx, aNumber(func(x.r, y.r), 0.0)); \
}
#define FUNCS \
CFUNC1(sin); \
CFUNC1(cos); \
CFUNC1(tan); \
CFUNC1(asin); \
CFUNC1(acos); \
CFUNC1(exp); \
CFUNC1(log); \
CFUNC1(sqrt); \
CFUNC1(floor); \
CFUNC1(log10); \
CFUNC1(sinh); \
CFUNC1(cosh); \
CFUNC1(tanh); \
FUNCS
CFUNC1(fabs);
CFUNC1(ceil);
CFUNC2(pow);
static aaObject *
cf_atan2(aaContext *ctx, aaObject *arg)
{
aaNumber x = aa_tonumber(ctx, aa_nextarg(ctx, &arg, 0));
aaObject *yo = aa_nextarg(ctx, &arg, 1);
aaNumber y = yo != nil ? aa_tonumber(ctx, yo) : aNumber(1.0, 0.0);
return aa_number(ctx, aNumber(atan2(x.r, y.r), 0.0));
}
static aaObject *
cf_truncate(aaContext *ctx, aaObject *arg)
{
aaNumber x = aa_tonumber(ctx, aa_nextarg(ctx, &arg, 0));
modf(x.r, &x.r);
return aa_number(ctx, x);
}
#undef CFUNC1
#undef CFUNC2
#define CFUNC(func, name) aa_set(ctx, aa_symbol(ctx, name), aa_cfunc(ctx, cf_##func))
#define CFUNC1(x) CFUNC(x, #x)
#define CFUNC2(x) CFUNC(x, #x)
void
aa_include_math(aaContext *ctx)
{
FUNCS;
CFUNC(fabs, "abs");
CFUNC(ceil, "ceiling");
CFUNC(pow, "expt");
CFUNC(atan2, "atan");
CFUNC(truncate, "truncate");
}