| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 |
- /*
- * __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;
- };
|