sku-pg
Version:
Skulpt is a Javascript implementation of Python 2.x. Python that runs in your browser!
309 lines (233 loc) • 10.6 kB
JavaScript
var $builtinmodule = function (name) {
var mod = {};
mod.pi = new Sk.builtin.float_(Math.PI);
mod.e = new Sk.builtin.float_(Math.E);
mod.fabs = new Sk.builtin.func(function (x) {
Sk.builtin.pyCheckArgs("fabs", arguments, 1, 1);
Sk.builtin.pyCheckType("x", "number", Sk.builtin.checkNumber(x));
return new Sk.builtin.float_(Math.abs(Sk.builtin.asnum$(x)));
});
mod.asin = new Sk.builtin.func(function (rad) {
Sk.builtin.pyCheckArgs("asin", arguments, 1, 1);
Sk.builtin.pyCheckType("rad", "number", Sk.builtin.checkNumber(rad));
return new Sk.builtin.float_(Math.asin(Sk.builtin.asnum$(rad)));
});
mod.acos = new Sk.builtin.func(function (rad) {
Sk.builtin.pyCheckArgs("acos", arguments, 1, 1);
Sk.builtin.pyCheckType("rad", "number", Sk.builtin.checkNumber(rad));
return new Sk.builtin.float_(Math.acos(Sk.builtin.asnum$(rad)));
});
mod.atan = new Sk.builtin.func(function (rad) {
Sk.builtin.pyCheckArgs("atan", arguments, 1, 1);
Sk.builtin.pyCheckType("rad", "number", Sk.builtin.checkNumber(rad));
return new Sk.builtin.float_(Math.atan(Sk.builtin.asnum$(rad)));
});
mod.atan2 = new Sk.builtin.func(function (y, x) {
Sk.builtin.pyCheckArgs("atan2", arguments, 2, 2);
Sk.builtin.pyCheckType("y", "number", Sk.builtin.checkNumber(y));
Sk.builtin.pyCheckType("x", "number", Sk.builtin.checkNumber(x));
return new Sk.builtin.float_(Math.atan2(Sk.builtin.asnum$(y), Sk.builtin.asnum$(x)));
});
mod.sin = new Sk.builtin.func(function (rad) {
Sk.builtin.pyCheckArgs("sin", arguments, 1, 1);
Sk.builtin.pyCheckType("rad", "number", Sk.builtin.checkNumber(rad));
return new Sk.builtin.float_(Math.sin(Sk.builtin.asnum$(rad)));
});
mod.cos = new Sk.builtin.func(function (rad) {
Sk.builtin.pyCheckArgs("cos", arguments, 1, 1);
Sk.builtin.pyCheckType("rad", "number", Sk.builtin.checkNumber(rad));
return new Sk.builtin.float_(Math.cos(Sk.builtin.asnum$(rad)));
});
mod.tan = new Sk.builtin.func(function (rad) {
Sk.builtin.pyCheckArgs("tan", arguments, 1, 1);
Sk.builtin.pyCheckType("rad", "number", Sk.builtin.checkNumber(rad));
return new Sk.builtin.float_(Math.tan(Sk.builtin.asnum$(rad)));
});
mod.asinh = new Sk.builtin.func(function (x) {
Sk.builtin.pyCheckArgs("asinh", arguments, 1, 1);
Sk.builtin.pyCheckType("x", "number", Sk.builtin.checkNumber(x));
x = Sk.builtin.asnum$(x);
var L = x + Math.sqrt(x * x + 1);
return new Sk.builtin.float_(Math.log(L));
});
mod.acosh = new Sk.builtin.func(function (x) {
Sk.builtin.pyCheckArgs("acosh", arguments, 1, 1);
Sk.builtin.pyCheckType("x", "number", Sk.builtin.checkNumber(x));
x = Sk.builtin.asnum$(x);
var L = x + Math.sqrt(x * x - 1);
return new Sk.builtin.float_(Math.log(L));
});
mod.atanh = new Sk.builtin.func(function (x) {
Sk.builtin.pyCheckArgs("atanh", arguments, 1, 1);
Sk.builtin.pyCheckType("x", "number", Sk.builtin.checkNumber(x));
x = Sk.builtin.asnum$(x);
var L = (1 + x) / (1 - x);
return new Sk.builtin.float_(Math.log(L) / 2);
});
mod.sinh = new Sk.builtin.func(function (x) {
Sk.builtin.pyCheckArgs("sinh", arguments, 1, 1);
Sk.builtin.pyCheckType("x", "number", Sk.builtin.checkNumber(x));
x = Sk.builtin.asnum$(x);
var e = Math.E;
var p = Math.pow(e, x);
var n = 1 / p;
var result = (p - n) / 2;
return new Sk.builtin.float_(result);
});
mod.cosh = new Sk.builtin.func(function (x) {
Sk.builtin.pyCheckArgs("cosh", arguments, 1, 1);
Sk.builtin.pyCheckType("x", "number", Sk.builtin.checkNumber(x));
x = Sk.builtin.asnum$(x);
var e = Math.E;
var p = Math.pow(e, x);
var n = 1 / p;
var result = (p + n) / 2;
return new Sk.builtin.float_(result);
});
mod.tanh = new Sk.builtin.func(function (x) {
Sk.builtin.pyCheckArgs("tanh", arguments, 1, 1);
Sk.builtin.pyCheckType("x", "number", Sk.builtin.checkNumber(x));
x = Sk.builtin.asnum$(x);
var e = Math.E;
var p = Math.pow(e, x);
var n = 1 / p;
var result = ((p - n) / 2) / ((p + n) / 2);
return new Sk.builtin.float_(result);
});
mod.ceil = new Sk.builtin.func(function (x) {
Sk.builtin.pyCheckArgs("ceil", arguments, 1, 1);
Sk.builtin.pyCheckType("x", "number", Sk.builtin.checkNumber(x));
return new Sk.builtin.float_(Math.ceil(Sk.builtin.asnum$(x)));
});
// returns y with the sign of x
mod.copysign = new Sk.builtin.func(function (x, y) {
Sk.builtin.pyCheckArgs("ceil", arguments, 2, 2);
Sk.builtin.pyCheckType("x", "number", Sk.builtin.checkNumber(x));
Sk.builtin.pyCheckType("y", "number", Sk.builtin.checkNumber(y));
var _x = Sk.ffi.remapToJs(x);
var _y = Sk.ffi.remapToJs(y);
var res;
var isNeg_x = _x < 0;
var isNeg_y = _x < 0;
// special case for floats with negative zero
if(Sk.builtin.checkFloat(x)) {
if(_x === 0) {
isNeg_x = 1/_x === -Infinity ? true : false;
}
}
if(Sk.builtin.checkFloat(y)) {
if(_y === 0) {
isNeg_y = 1/_y === -Infinity ? true : false;
}
}
// if both signs are equal, just return _y
if((isNeg_x && isNeg_y) || (!isNeg_x && !isNeg_y)) {
res = _y;
} else if((isNeg_x && !isNeg_y) || (!isNeg_x && isNeg_y)) {
// if different, invert sign
if(y === 0) {
// special case for zero
res = isNeg_x ? -0.0 : 0.0;
} else {
res = _y * -1;
}
}
return new Sk.builtin.float_(res);
});
mod.floor = new Sk.builtin.func(function (x) {
Sk.builtin.pyCheckArgs("floor", arguments, 1, 1);
Sk.builtin.pyCheckType("x", "number", Sk.builtin.checkNumber(x));
return new Sk.builtin.float_(Math.floor(Sk.builtin.asnum$(x)));
});
mod.sqrt = new Sk.builtin.func(function (x) {
Sk.builtin.pyCheckArgs("sqrt", arguments, 1, 1);
Sk.builtin.pyCheckType("x", "number", Sk.builtin.checkNumber(x));
return new Sk.builtin.float_(Math.sqrt(Sk.builtin.asnum$(x)));
});
mod.trunc = new Sk.builtin.func(function (x) {
Sk.builtin.pyCheckArgs("trunc", arguments, 1, 1);
Sk.builtin.pyCheckType("x", "number", Sk.builtin.checkNumber(x));
return new Sk.builtin.int_(Sk.builtin.asnum$(x) | 0);
});
mod.log = new Sk.builtin.func(function (x, base) {
Sk.builtin.pyCheckArgs("log", arguments, 1, 2);
Sk.builtin.pyCheckType("x", "number", Sk.builtin.checkNumber(x));
if (base === undefined) {
return new Sk.builtin.float_(Math.log(Sk.builtin.asnum$(x)));
} else {
Sk.builtin.pyCheckType("base", "number", Sk.builtin.checkNumber(base));
var ret = Math.log(Sk.builtin.asnum$(x)) / Math.log(Sk.builtin.asnum$(base));
return new Sk.builtin.float_(ret);
}
});
mod.log10 = new Sk.builtin.func(function (x) {
Sk.builtin.pyCheckArgs("log10", arguments, 1, 1);
Sk.builtin.pyCheckType("x", "number", Sk.builtin.checkNumber(x));
var ret = Math.log(Sk.builtin.asnum$(x)) / Math.log(10);
return new Sk.builtin.float_(ret);
});
/* Return True if x is infinite, and False otherwise. */
mod.isinf = new Sk.builtin.func(function(x) {
Sk.builtin.pyCheckArgs("isinf", arguments, 1, 1);
Sk.builtin.pyCheckType("x", "number", Sk.builtin.checkNumber(x));
var _x = Sk.builtin.asnum$(x);
if(isFinite(_x) && !isNaN(_x)) {
return Sk.builtin.bool.false$;
} else {
return Sk.builtin.bool.true$
}
});
/* Return True if x is a NaN (not a number), and False otherwise. */
mod.isnan = new Sk.builtin.func(function(x) {
Sk.builtin.pyCheckArgs("isnan", arguments, 1, 1);
Sk.builtin.pyCheckType("x", "float", Sk.builtin.checkFloat(x));
var _x = Sk.builtin.asnum$(x);
if(isNaN(_x)) {
return Sk.builtin.bool.true$;
} else {
return Sk.builtin.bool.false$;
}
});
mod.exp = new Sk.builtin.func(function (x) {
Sk.builtin.pyCheckArgs("exp", arguments, 1, 1);
Sk.builtin.pyCheckType("x", "number", Sk.builtin.checkNumber(x));
return new Sk.builtin.float_(Math.exp(Sk.builtin.asnum$(x)));
});
mod.pow = new Sk.builtin.func(function (x, y) {
Sk.builtin.pyCheckArgs("pow", arguments, 2, 2);
Sk.builtin.pyCheckType("x", "number", Sk.builtin.checkNumber(x));
Sk.builtin.pyCheckType("y", "number", Sk.builtin.checkNumber(y));
return new Sk.builtin.float_(Math.pow(Sk.builtin.asnum$(x), Sk.builtin.asnum$(y)));
});
mod.radians = new Sk.builtin.func(function (deg) {
Sk.builtin.pyCheckArgs("radians", arguments, 1, 1);
Sk.builtin.pyCheckType("deg", "number", Sk.builtin.checkNumber(deg));
var ret = Math.PI / 180.0 * Sk.builtin.asnum$(deg);
return new Sk.builtin.float_(ret);
});
mod.degrees = new Sk.builtin.func(function (rad) {
Sk.builtin.pyCheckArgs("degrees", arguments, 1, 1);
Sk.builtin.pyCheckType("rad", "number", Sk.builtin.checkNumber(rad));
var ret = 180.0 / Math.PI * Sk.builtin.asnum$(rad);
return new Sk.builtin.float_(ret);
});
mod.hypot = new Sk.builtin.func(function (x, y) {
Sk.builtin.pyCheckArgs("hypot", arguments, 2, 2);
Sk.builtin.pyCheckType("x", "number", Sk.builtin.checkNumber(x));
Sk.builtin.pyCheckType("y", "number", Sk.builtin.checkNumber(y));
x = Sk.builtin.asnum$(x);
y = Sk.builtin.asnum$(y);
return new Sk.builtin.float_(Math.sqrt((x * x) + (y * y)));
});
mod.factorial = new Sk.builtin.func(function (x) {
Sk.builtin.pyCheckArgs("factorial", arguments, 1, 1);
Sk.builtin.pyCheckType("x", "number", Sk.builtin.checkNumber(x));
x = Math.floor(Sk.builtin.asnum$(x));
var r = 1;
for (var i = 2; i <= x; i++) {
r *= i;
}
return new Sk.builtin.int_(r);
});
return mod;
}