operator.js 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. /*
  2. * __author__: Isaac Dontje Lindell (i@isaacdontjelindell.com)
  3. *
  4. * Implementation of the Python operator module.
  5. */
  6. var $builtinmodule = function (name) {
  7. var mod = {};
  8. mod.lt = new Sk.builtin.func(function (a, b) {
  9. return Sk.builtin.bool(Sk.misceval.richCompareBool(a, b, 'Lt'));
  10. });
  11. mod.__lt__ = mod.lt;
  12. mod.le = new Sk.builtin.func(function (a, b) {
  13. return Sk.builtin.bool(Sk.misceval.richCompareBool(a, b, 'LtE'));
  14. });
  15. mod.__le__ = mod.le;
  16. mod.eq = new Sk.builtin.func(function (a, b) {
  17. return Sk.builtin.bool(Sk.misceval.richCompareBool(a, b, 'Eq'));
  18. });
  19. mod.__eq__ = mod.eq;
  20. mod.ne = new Sk.builtin.func(function (a, b) {
  21. return Sk.builtin.bool(Sk.misceval.richCompareBool(a, b, 'NotEq'));
  22. });
  23. mod.__ne__ = mod.ne;
  24. mod.ge = new Sk.builtin.func(function (a, b) {
  25. return Sk.builtin.bool(Sk.misceval.richCompareBool(a, b, 'GtE'));
  26. });
  27. mod.__ge__ = mod.ge;
  28. mod.gt = new Sk.builtin.func(function (a, b) {
  29. return Sk.builtin.bool(Sk.misceval.richCompareBool(a, b, 'Gt'));
  30. });
  31. mod.__gt__ = mod.gt;
  32. mod.not_ = new Sk.builtin.func(function (obj) {
  33. throw new Sk.builtin.NotImplementedError("operator.not_() is not yet implemented in Skulpt");
  34. });
  35. mod.truth = new Sk.builtin.func(function (obj) {
  36. return Sk.builtin.bool(obj);
  37. });
  38. mod.is_ = new Sk.builtin.func(function (a, b) {
  39. return Sk.builtin.bool(Sk.misceval.richCompareBool(a, b, 'Is'));
  40. });
  41. mod.is_not = new Sk.builtin.func(function (a, b) {
  42. return Sk.builtin.bool(Sk.misceval.richCompareBool(a, b, 'IsNot'));
  43. });
  44. mod.abs = new Sk.builtin.func(function (obj) {
  45. return Sk.misceval.callsim(Sk.builtin.abs, obj);
  46. });
  47. mod.__abs__ = mod.abs;
  48. // The documentation says that operator.add() is defined for a and b numbers, but
  49. // CPython (2.6) allows a and b to be other types (e.g. str)
  50. mod.add = new Sk.builtin.func(function (a, b) {
  51. return Sk.abstr.objectAdd(a, b);
  52. });
  53. mod.__add__ = mod.add;
  54. mod.and_ = new Sk.builtin.func(function (a, b) {
  55. return Sk.abstr.binary_op_(a, b, "BitAnd");
  56. });
  57. mod.__and__ = mod.and_;
  58. mod.div = new Sk.builtin.func(function (a, b) {
  59. return Sk.abstr.binary_op_(a, b, "Div");
  60. });
  61. mod.__div__ = mod.div;
  62. mod.floordiv = new Sk.builtin.func(function (a, b) {
  63. return Sk.abstr.binary_op_(a, b, "FloorDiv");
  64. });
  65. mod.__floordiv__ = mod.floordiv;
  66. mod.index = new Sk.builtin.func(function (a) {
  67. return new Sk.builtin.int_(Sk.misceval.asIndex(a));
  68. });
  69. mod.__index__ = mod.index;
  70. // Note: Sk.abstr.numberUnaryOp(obj, 'Invert') looks for the function nb$invert() on obj.
  71. // However, it doesn't look like that function has been implemented for any existing object types.
  72. // I've gone ahead and created this function for completeness' sake, but expect any use of it to
  73. // result in an error.
  74. mod.inv = new Sk.builtin.func(function (obj) {
  75. return Sk.abstr.numberUnaryOp(obj, 'Invert');
  76. });
  77. mod.__inv__ = mod.inv;
  78. mod.invert = mod.inv;
  79. mod.__invert__ = mod.inv;
  80. mod.lshift = new Sk.builtin.func(function (a, b) {
  81. return Sk.abstr.binary_op_(a, b, "LShift");
  82. });
  83. mod.__lshift__ = mod.lshift;
  84. mod.mod = new Sk.builtin.func(function (a, b) {
  85. return Sk.abstr.binary_op_(a, b, "Mod");
  86. });
  87. mod.__mod__ = mod.mod;
  88. mod.divmod = new Sk.builtin.func(function (a, b) {
  89. return Sk.abstr.binary_op_(a, b, "DivMod");
  90. });
  91. mod.__divmod__ = mod.divmod;
  92. mod.mul = new Sk.builtin.func(function (a, b) {
  93. return Sk.abstr.binary_op_(a, b, "Mult");
  94. });
  95. mod.__mul__ = mod.mul;
  96. mod.neg = new Sk.builtin.func(function (obj) {
  97. return Sk.abstr.objectNegative(obj);
  98. });
  99. mod.__neg__ = mod.neg;
  100. mod.or_ = new Sk.builtin.func(function (a, b) {
  101. return Sk.abstr.binary_op_(a, b, "BitOr");
  102. });
  103. mod.__or__ = mod.or_;
  104. mod.pos = new Sk.builtin.func(function (obj) {
  105. return Sk.abstr.objectPositive(obj);
  106. });
  107. mod.__pos__ = mod.pos;
  108. mod.pow = new Sk.builtin.func(function (a, b) {
  109. return Sk.abstr.binary_op_(a, b, "Pow");
  110. });
  111. mod.__pow__ = mod.pow;
  112. mod.rshift = new Sk.builtin.func(function (a, b) {
  113. return Sk.abstr.binary_op_(a, b, "RShift");
  114. });
  115. mod.__rshift__ = mod.rshift;
  116. mod.sub = new Sk.builtin.func(function (a, b) {
  117. return Sk.abstr.binary_op_(a, b, "Sub");
  118. });
  119. mod.__sub__ = mod.sub;
  120. mod.truediv = mod.div;
  121. mod.__truediv__ = mod.div;
  122. mod.xor = new Sk.builtin.func(function (a, b) {
  123. return Sk.abstr.binary_op_(a, b, "BitXor");
  124. });
  125. mod.__xor__ = mod.xor;
  126. mod.concat = new Sk.builtin.func(function (a, b) {
  127. return Sk.abstr.sequenceConcat(a, b);
  128. });
  129. mod.__concat__ = mod.concat;
  130. mod.contains = new Sk.builtin.func(function (a, b) {
  131. return Sk.builtin.bool(Sk.abstr.sequenceContains(a, b));
  132. });
  133. mod.__contains__ = mod.contains;
  134. mod.countOf = new Sk.builtin.func(function (a, b) {
  135. return Sk.abstr.sequenceGetCountOf(a, b);
  136. });
  137. mod.delitem = new Sk.builtin.func(function (a, b) {
  138. return Sk.abstr.sequenceDelItem(a, b);
  139. });
  140. mod.__delitem__ = mod.delitem;
  141. mod.getitem = new Sk.builtin.func(function (a, b) {
  142. return Sk.abstr.sequenceGetItem(a, b);
  143. });
  144. mod.__getitem__ = mod.getitem;
  145. mod.indexOf = new Sk.builtin.func(function (a, b) {
  146. return Sk.abstr.sequenceGetIndexOf(a, b);
  147. });
  148. mod.setitem = new Sk.builtin.func(function (a, b, c) {
  149. return Sk.abstr.sequenceSetItem(a, b, c);
  150. });
  151. mod.__setitem__ = mod.setitem;
  152. return mod;
  153. };