sku-pg
Version:
Skulpt is a Javascript implementation of Python 2.x. Python that runs in your browser!
192 lines (153 loc) • 5.81 kB
JavaScript
/*
* __author__: Isaac Dontje Lindell (i@isaacdontjelindell.com)
*
* Implementation of the Python operator module.
*/
var $builtinmodule = function (name) {
var mod = {};
mod.lt = new Sk.builtin.func(function (a, b) {
return Sk.builtin.bool(Sk.misceval.richCompareBool(a, b, 'Lt'));
});
mod.__lt__ = mod.lt;
mod.le = new Sk.builtin.func(function (a, b) {
return Sk.builtin.bool(Sk.misceval.richCompareBool(a, b, 'LtE'));
});
mod.__le__ = mod.le;
mod.eq = new Sk.builtin.func(function (a, b) {
return Sk.builtin.bool(Sk.misceval.richCompareBool(a, b, 'Eq'));
});
mod.__eq__ = mod.eq;
mod.ne = new Sk.builtin.func(function (a, b) {
return Sk.builtin.bool(Sk.misceval.richCompareBool(a, b, 'NotEq'));
});
mod.__ne__ = mod.ne;
mod.ge = new Sk.builtin.func(function (a, b) {
return Sk.builtin.bool(Sk.misceval.richCompareBool(a, b, 'GtE'));
});
mod.__ge__ = mod.ge;
mod.gt = new Sk.builtin.func(function (a, b) {
return Sk.builtin.bool(Sk.misceval.richCompareBool(a, b, 'Gt'));
});
mod.__gt__ = mod.gt;
mod.not_ = new Sk.builtin.func(function (obj) {
throw new Sk.builtin.NotImplementedError("operator.not_() is not yet implemented in Skulpt");
});
mod.truth = new Sk.builtin.func(function (obj) {
return Sk.builtin.bool(obj);
});
mod.is_ = new Sk.builtin.func(function (a, b) {
return Sk.builtin.bool(Sk.misceval.richCompareBool(a, b, 'Is'));
});
mod.is_not = new Sk.builtin.func(function (a, b) {
return Sk.builtin.bool(Sk.misceval.richCompareBool(a, b, 'IsNot'));
});
mod.abs = new Sk.builtin.func(function (obj) {
return Sk.misceval.callsim(Sk.builtin.abs, obj);
});
mod.__abs__ = mod.abs;
// The documentation says that operator.add() is defined for a and b numbers, but
// CPython (2.6) allows a and b to be other types (e.g. str)
mod.add = new Sk.builtin.func(function (a, b) {
return Sk.abstr.objectAdd(a, b);
});
mod.__add__ = mod.add;
mod.and_ = new Sk.builtin.func(function (a, b) {
return Sk.abstr.binary_op_(a, b, "BitAnd");
});
mod.__and__ = mod.and_;
mod.div = new Sk.builtin.func(function (a, b) {
return Sk.abstr.binary_op_(a, b, "Div");
});
mod.__div__ = mod.div;
mod.floordiv = new Sk.builtin.func(function (a, b) {
return Sk.abstr.binary_op_(a, b, "FloorDiv");
});
mod.__floordiv__ = mod.floordiv;
mod.index = new Sk.builtin.func(function (a) {
return new Sk.builtin.int_(Sk.misceval.asIndex(a));
});
mod.__index__ = mod.index;
// Note: Sk.abstr.numberUnaryOp(obj, 'Invert') looks for the function nb$invert() on obj.
// However, it doesn't look like that function has been implemented for any existing object types.
// I've gone ahead and created this function for completeness' sake, but expect any use of it to
// result in an error.
mod.inv = new Sk.builtin.func(function (obj) {
return Sk.abstr.numberUnaryOp(obj, 'Invert');
});
mod.__inv__ = mod.inv;
mod.invert = mod.inv;
mod.__invert__ = mod.inv;
mod.lshift = new Sk.builtin.func(function (a, b) {
return Sk.abstr.binary_op_(a, b, "LShift");
});
mod.__lshift__ = mod.lshift;
mod.mod = new Sk.builtin.func(function (a, b) {
return Sk.abstr.binary_op_(a, b, "Mod");
});
mod.__mod__ = mod.mod;
mod.divmod = new Sk.builtin.func(function (a, b) {
return Sk.abstr.binary_op_(a, b, "DivMod");
});
mod.__divmod__ = mod.divmod;
mod.mul = new Sk.builtin.func(function (a, b) {
return Sk.abstr.binary_op_(a, b, "Mult");
});
mod.__mul__ = mod.mul;
mod.neg = new Sk.builtin.func(function (obj) {
return Sk.abstr.objectNegative(obj);
});
mod.__neg__ = mod.neg;
mod.or_ = new Sk.builtin.func(function (a, b) {
return Sk.abstr.binary_op_(a, b, "BitOr");
});
mod.__or__ = mod.or_;
mod.pos = new Sk.builtin.func(function (obj) {
return Sk.abstr.objectPositive(obj);
});
mod.__pos__ = mod.pos;
mod.pow = new Sk.builtin.func(function (a, b) {
return Sk.abstr.binary_op_(a, b, "Pow");
});
mod.__pow__ = mod.pow;
mod.rshift = new Sk.builtin.func(function (a, b) {
return Sk.abstr.binary_op_(a, b, "RShift");
});
mod.__rshift__ = mod.rshift;
mod.sub = new Sk.builtin.func(function (a, b) {
return Sk.abstr.binary_op_(a, b, "Sub");
});
mod.__sub__ = mod.sub;
mod.truediv = mod.div;
mod.__truediv__ = mod.div;
mod.xor = new Sk.builtin.func(function (a, b) {
return Sk.abstr.binary_op_(a, b, "BitXor");
});
mod.__xor__ = mod.xor;
mod.concat = new Sk.builtin.func(function (a, b) {
return Sk.abstr.sequenceConcat(a, b);
});
mod.__concat__ = mod.concat;
mod.contains = new Sk.builtin.func(function (a, b) {
return Sk.builtin.bool(Sk.abstr.sequenceContains(a, b));
});
mod.__contains__ = mod.contains;
mod.countOf = new Sk.builtin.func(function (a, b) {
return Sk.abstr.sequenceGetCountOf(a, b);
});
mod.delitem = new Sk.builtin.func(function (a, b) {
return Sk.abstr.sequenceDelItem(a, b);
});
mod.__delitem__ = mod.delitem;
mod.getitem = new Sk.builtin.func(function (a, b) {
return Sk.abstr.sequenceGetItem(a, b);
});
mod.__getitem__ = mod.getitem;
mod.indexOf = new Sk.builtin.func(function (a, b) {
return Sk.abstr.sequenceGetIndexOf(a, b);
});
mod.setitem = new Sk.builtin.func(function (a, b, c) {
return Sk.abstr.sequenceSetItem(a, b, c);
});
mod.__setitem__ = mod.setitem;
return mod;
};