rapydscript-ns 0.9.0 → 0.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/.agignore +1 -1
  2. package/.github/workflows/ci.yml +38 -38
  3. package/=template.pyj +5 -5
  4. package/CHANGELOG.md +10 -0
  5. package/HACKING.md +103 -103
  6. package/LICENSE +24 -24
  7. package/README.md +7 -6
  8. package/TODO.md +116 -1
  9. package/add-toc-to-readme +2 -2
  10. package/bin/export +75 -75
  11. package/bin/rapydscript +70 -70
  12. package/bin/web-repl-export +102 -102
  13. package/build +2 -2
  14. package/language-service/index.js +9 -9
  15. package/language-service/language-service.d.ts +1 -1
  16. package/package.json +6 -2
  17. package/publish.py +37 -37
  18. package/release/compiler.js +246 -231
  19. package/release/signatures.json +23 -23
  20. package/session.vim +4 -4
  21. package/setup.cfg +2 -2
  22. package/src/compiler.pyj +36 -36
  23. package/src/errors.pyj +30 -30
  24. package/src/lib/aes.pyj +646 -646
  25. package/src/lib/contextlib.pyj +379 -0
  26. package/src/lib/copy.pyj +120 -120
  27. package/src/lib/datetime.pyj +712 -0
  28. package/src/lib/elementmaker.pyj +83 -83
  29. package/src/lib/encodings.pyj +126 -126
  30. package/src/lib/gettext.pyj +569 -569
  31. package/src/lib/io.pyj +500 -0
  32. package/src/lib/itertools.pyj +580 -580
  33. package/src/lib/json.pyj +227 -0
  34. package/src/lib/math.pyj +193 -193
  35. package/src/lib/operator.pyj +11 -11
  36. package/src/lib/pythonize.pyj +20 -20
  37. package/src/lib/random.pyj +118 -118
  38. package/src/lib/react.pyj +74 -74
  39. package/src/lib/traceback.pyj +63 -63
  40. package/src/lib/uuid.pyj +77 -77
  41. package/src/monaco-language-service/diagnostics.js +4 -4
  42. package/src/monaco-language-service/dts.js +550 -550
  43. package/src/monaco-language-service/index.js +2 -2
  44. package/src/output/comments.pyj +45 -45
  45. package/src/output/exceptions.pyj +201 -201
  46. package/src/output/jsx.pyj +164 -164
  47. package/src/output/loops.pyj +9 -0
  48. package/src/output/treeshake.pyj +182 -182
  49. package/src/output/utils.pyj +72 -72
  50. package/src/string_interpolation.pyj +72 -72
  51. package/src/tokenizer.pyj +1 -1
  52. package/src/unicode_aliases.pyj +576 -576
  53. package/src/utils.pyj +192 -192
  54. package/test/_import_one.pyj +37 -37
  55. package/test/_import_two/__init__.pyj +11 -11
  56. package/test/_import_two/level2/deep.pyj +4 -4
  57. package/test/_import_two/other.pyj +6 -6
  58. package/test/_import_two/sub.pyj +13 -13
  59. package/test/aes_vectors.pyj +421 -421
  60. package/test/annotations.pyj +80 -80
  61. package/test/contextlib.pyj +362 -0
  62. package/test/datetime.pyj +500 -0
  63. package/test/debugger_stmt.pyj +41 -0
  64. package/test/decorators.pyj +77 -77
  65. package/test/docstrings.pyj +39 -39
  66. package/test/elementmaker_test.pyj +45 -45
  67. package/test/functions.pyj +151 -151
  68. package/test/generators.pyj +41 -41
  69. package/test/generic.pyj +370 -370
  70. package/test/imports.pyj +72 -72
  71. package/test/internationalization.pyj +73 -73
  72. package/test/io.pyj +316 -0
  73. package/test/json.pyj +196 -0
  74. package/test/lint.pyj +164 -164
  75. package/test/loops.pyj +85 -85
  76. package/test/numpy.pyj +734 -734
  77. package/test/omit_function_metadata.pyj +20 -20
  78. package/test/repl.pyj +121 -121
  79. package/test/scoped_flags.pyj +76 -76
  80. package/test/unit/index.js +66 -0
  81. package/test/unit/language-service-dts.js +543 -543
  82. package/test/unit/language-service-hover.js +455 -455
  83. package/test/unit/language-service.js +1 -1
  84. package/test/unit/web-repl.js +533 -0
  85. package/tools/compiler.d.ts +367 -0
  86. package/tools/completer.js +131 -131
  87. package/tools/gettext.js +185 -185
  88. package/tools/ini.js +65 -65
  89. package/tools/msgfmt.js +187 -187
  90. package/tools/repl.js +223 -223
  91. package/tools/test.js +118 -118
  92. package/tools/utils.js +128 -128
  93. package/tools/web_repl.js +95 -95
  94. package/try +41 -41
  95. package/web-repl/env.js +196 -196
  96. package/web-repl/index.html +163 -163
  97. package/web-repl/prism.css +139 -139
  98. package/web-repl/prism.js +113 -113
  99. package/web-repl/rapydscript.js +224 -224
  100. package/web-repl/sha1.js +25 -25
@@ -0,0 +1,227 @@
1
+ ###########################################################
2
+ # RapydScript Standard Library
3
+ # Author: RapydScript-NS Contributors
4
+ # Copyright 2024 RapydScript-NS Contributors
5
+ # License: Apache License 2.0
6
+ # This library is covered under Apache license, so that
7
+ # you can distribute it with your RapydScript applications.
8
+ ###########################################################
9
+
10
+
11
+ # Python-compatible json module backed by the JS JSON global.
12
+ #
13
+ # RapydScript dicts/lists map directly to JS objects/arrays, so
14
+ # JSON.stringify / JSON.parse round-trip without conversion.
15
+ # This wrapper provides the familiar Python json.dumps / json.loads API.
16
+ #
17
+ # NOTE: `default` is a JS reserved word in RapydScript; the parameter is
18
+ # exposed as `dflt` in function signatures but documented as `default`.
19
+
20
+
21
+ class JSONDecodeError(ValueError):
22
+ def __init__(self, msg, doc, pos):
23
+ self.msg = msg
24
+ self.doc = doc
25
+ self.pos = pos
26
+ self.lineno = 1
27
+ self.colno = pos + 1
28
+ ValueError.__init__(self, msg + ': line ' + str(self.lineno) + ' column ' + str(self.colno) + ' (char ' + str(pos) + ')')
29
+
30
+
31
+ # ---------------------------------------------------------------------------
32
+ # Internal JS helpers
33
+ # ---------------------------------------------------------------------------
34
+
35
+ v"""
36
+ // Convert a value to a plain JS object recursively, honouring ρσ_dict.toJSON.
37
+ function _json_to_plain(val) {
38
+ if (val === null || val === undefined) return val;
39
+ if (Array.isArray(val)) {
40
+ return val.map(_json_to_plain);
41
+ }
42
+ if (typeof val === 'object') {
43
+ if (typeof val.toJSON === 'function') {
44
+ // ρσ_dict.toJSON() converts the dict to a plain {k:v} object
45
+ val = val.toJSON();
46
+ }
47
+ var out = {};
48
+ var keys = Object.keys(val);
49
+ for (var i = 0; i < keys.length; i++) {
50
+ out[keys[i]] = _json_to_plain(val[keys[i]]);
51
+ }
52
+ return out;
53
+ }
54
+ return val;
55
+ }
56
+
57
+ // Sort keys recursively.
58
+ function _json_sort_keys(val) {
59
+ if (val === null || val === undefined) return val;
60
+ if (Array.isArray(val)) {
61
+ return val.map(_json_sort_keys);
62
+ }
63
+ if (typeof val === 'object') {
64
+ var sorted = {};
65
+ Object.keys(val).sort().forEach(function(k) {
66
+ sorted[k] = _json_sort_keys(val[k]);
67
+ });
68
+ return sorted;
69
+ }
70
+ return val;
71
+ }
72
+
73
+ // Raise ValueError if any value in the tree is NaN or non-finite.
74
+ function _json_check_nan(val, raise_fn) {
75
+ if (typeof val === 'number') {
76
+ if (isNaN(val) || !isFinite(val)) {
77
+ raise_fn();
78
+ }
79
+ return;
80
+ }
81
+ if (Array.isArray(val)) {
82
+ for (var i = 0; i < val.length; i++) _json_check_nan(val[i], raise_fn);
83
+ return;
84
+ }
85
+ if (val !== null && typeof val === 'object') {
86
+ var keys = Object.keys(val);
87
+ for (var j = 0; j < keys.length; j++) _json_check_nan(val[keys[j]], raise_fn);
88
+ }
89
+ }
90
+
91
+ // Walk a parsed JSON tree and apply object_hook / parse_float / parse_int.
92
+ function _json_walk(val, parse_float, parse_int, object_hook, object_pairs_hook) {
93
+ if (Array.isArray(val)) {
94
+ for (var i = 0; i < val.length; i++) {
95
+ val[i] = _json_walk(val[i], parse_float, parse_int, object_hook, object_pairs_hook);
96
+ }
97
+ return val;
98
+ }
99
+ if (val !== null && typeof val === 'object') {
100
+ var keys = Object.keys(val);
101
+ for (var j = 0; j < keys.length; j++) {
102
+ val[keys[j]] = _json_walk(val[keys[j]], parse_float, parse_int, object_hook, object_pairs_hook);
103
+ }
104
+ if (object_pairs_hook) {
105
+ var pairs = keys.map(function(k) { return [k, val[k]]; });
106
+ return object_pairs_hook(pairs);
107
+ }
108
+ if (object_hook) {
109
+ return object_hook(val);
110
+ }
111
+ return val;
112
+ }
113
+ if (typeof val === 'number') {
114
+ if (parse_int && val === Math.floor(val)) {
115
+ return parse_int(String(val));
116
+ }
117
+ if (parse_float && val !== Math.floor(val)) {
118
+ return parse_float(String(val));
119
+ }
120
+ }
121
+ return val;
122
+ }
123
+ """
124
+
125
+
126
+ def dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True,
127
+ allow_nan=False, sort_keys=False, indent=None, separators=None,
128
+ dflt=None):
129
+ """Serialize obj to a JSON-formatted string.
130
+
131
+ Parameters:
132
+ indent -- int or str; if not None, pretty-print output
133
+ sort_keys -- if True, sort dict keys in the output
134
+ dflt -- callable for objects that are not serializable (Python: default);
135
+ should return a JSON-serializable value or raise TypeError
136
+ separators -- (item_sep, key_sep) pair; (',', ':') gives compact output
137
+ allow_nan -- if False (default), NaN/Infinity raise ValueError
138
+ skipkeys, ensure_ascii, check_circular -- accepted for API compatibility
139
+ """
140
+ # Convert to plain JS (handles ρσ_dict via toJSON)
141
+ work = _json_to_plain(obj)
142
+
143
+ if not allow_nan:
144
+ def _raise_nan():
145
+ raise ValueError('Out of range float values are not JSON compliant')
146
+ _json_check_nan(work, _raise_nan)
147
+
148
+ if sort_keys:
149
+ work = _json_sort_keys(work)
150
+
151
+ js_indent = None
152
+ if indent is not None:
153
+ if jstype(indent) is 'number':
154
+ js_indent = indent
155
+ else:
156
+ js_indent = str(indent)
157
+
158
+ replacer = None
159
+ if dflt is not None:
160
+ _dflt_fn = dflt
161
+ def replacer(key, value):
162
+ if value is not None and jstype(value) is 'object' and not Array.isArray(value):
163
+ try:
164
+ return _json_to_plain(_dflt_fn(value))
165
+ except TypeError:
166
+ pass
167
+ return value
168
+
169
+ result = JSON.stringify(work, replacer, js_indent)
170
+
171
+ if result is undefined:
172
+ raise TypeError('Object of type ' + jstype(obj) + ' is not JSON serializable')
173
+
174
+ # Apply custom separators when not pretty-printing.
175
+ # JS default uses ", " between items and ": " between key and value.
176
+ if indent is None and separators is not None:
177
+ item_sep = separators[0]
178
+ key_sep = separators[1]
179
+ result = result.split(', ').join(item_sep).split(': ').join(key_sep)
180
+
181
+ return result
182
+
183
+
184
+ def loads(s, cls=None, object_hook=None, parse_float=None,
185
+ parse_int=None, parse_constant=None, object_pairs_hook=None):
186
+ """Deserialize s (a str) to a Python object.
187
+
188
+ Returns plain JS objects (access with obj['key'] or obj.key).
189
+
190
+ Parameters:
191
+ object_hook -- callable applied to every decoded JSON object
192
+ object_pairs_hook -- called with [(key, value), ...] for each object
193
+ (takes precedence over object_hook)
194
+ parse_float -- called with the string of each float literal
195
+ parse_int -- called with the string of each integer literal
196
+ cls, parse_constant -- accepted for API compatibility, ignored
197
+ """
198
+ try:
199
+ result = v'JSON.parse'(str(s))
200
+ except Exception as _parse_err:
201
+ msg = _parse_err.message if _parse_err.message else str(_parse_err)
202
+ raise JSONDecodeError(msg, str(s), 0)
203
+
204
+ if result is undefined:
205
+ raise JSONDecodeError('No JSON object could be decoded', str(s), 0)
206
+
207
+ needs_walk = (parse_float is not None or parse_int is not None or
208
+ object_hook is not None or object_pairs_hook is not None)
209
+ if needs_walk:
210
+ result = _json_walk(result, parse_float, parse_int, object_hook, object_pairs_hook)
211
+
212
+ return result
213
+
214
+
215
+ def dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True,
216
+ allow_nan=False, sort_keys=False, indent=None, separators=None,
217
+ dflt=None):
218
+ """Serialize obj as a JSON stream to fp (a file-like object with .write())."""
219
+ fp.write(dumps(obj, skipkeys=skipkeys, ensure_ascii=ensure_ascii,
220
+ check_circular=check_circular, allow_nan=allow_nan,
221
+ sort_keys=sort_keys, indent=indent, separators=separators,
222
+ dflt=dflt))
223
+
224
+
225
+ def load(fp):
226
+ """Deserialize fp (a file-like object with .read()) to a Python object."""
227
+ return loads(fp.read())
package/src/lib/math.pyj CHANGED
@@ -1,193 +1,193 @@
1
- ###########################################################
2
- # RapydScript Standard Library
3
- # Author: Alexander Tsepkov
4
- # Copyright 2013 Pyjeon Software LLC
5
- # License: Apache License 2.0
6
- # This library is covered under Apache license, so that
7
- # you can distribute it with your RapydScript applications.
8
- ###########################################################
9
-
10
-
11
- # basic implementation of Python's 'math' library
12
-
13
- # NOTE: this is only meant to aid those porting lots of Python code into RapydScript,
14
- # if you're writing a new RapydScript application, in most cases you probably want to
15
- # use JavaScript's Math module directly instead
16
-
17
-
18
- pi = Math.PI
19
- e = Math.E
20
- inf = Infinity
21
-
22
- ########################################
23
- # Number-theoretic and representation functions
24
- ########################################
25
- def ceil(x):
26
- return Math.ceil(x)
27
- def copysign(x, y):
28
- x = Math.abs(x)
29
- if y < 0:
30
- return -x
31
- else:
32
- return x
33
- def fabs(x):
34
- return Math.abs(x)
35
- def factorial(x):
36
- if Math.abs(int(x)) is not x:
37
- raise ValueError("factorial() only accepts integral values")
38
- factorial.cache = []
39
- r = def(n):
40
- if n is 0 or n is 1:
41
- return 1
42
- if not factorial.cache[n]:
43
- factorial.cache[n] = r(n-1) * n
44
- return factorial.cache[n]
45
- return r(x)
46
- def floor(x):
47
- return Math.floor(x)
48
- def fmod(x, y):
49
- # javascript's % operator isn't consistent with C fmod implementation, this function is
50
- while y <= x:
51
- x -= y
52
- return x
53
- def fsum(iterable):
54
- # like Python's fsum, this method is much more resilient to rounding errors than regular sum
55
- partials = [] # sorted, non-overlapping partial sums
56
- for x in iterable:
57
- i = 0
58
- for y in partials:
59
- if Math.abs(x) < Math.abs(y):
60
- x, y = y, x
61
- hi = x + y
62
- lo = y - (hi - x)
63
- if lo:
64
- partials[i] = lo
65
- i += 1
66
- x = hi
67
- #partials[i:] = [x]
68
- partials.splice(i, partials.length-i, x)
69
- return sum(partials)
70
- def isinf(x):
71
- return not isFinite(x)
72
- def isnan(x):
73
- return isNaN(x)
74
- def modf(x):
75
- m = fmod(x, 1)
76
- return m, x-m
77
- def trunc(x):
78
- return x | 0
79
-
80
- ########################################
81
- # Power and logarithmic functions
82
- ########################################
83
- def exp(x):
84
- return Math.exp(x)
85
- def expm1(x):
86
- # NOTE: Math.expm1() is currently only implemented in Firefox, this provides alternative implementation
87
- # https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/expm1
88
- #return Math.expm1(x)
89
- if Math.abs(x) < 1e-5:
90
- return x + 0.5*x*x
91
- else:
92
- return Math.exp(x) - 1
93
- def log(x, base=e):
94
- return Math.log(x)/Math.log(base)
95
- def log1p(x):
96
- # NOTE: Math.log1p() is currently only implemented in Firefox, this provides alternative implementation
97
- # https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/log1p
98
- # this version has been taken from http://phpjs.org/functions/log1p/
99
- # admittedly it's not as accurate as MDN version, as you can see from math.log1p(1) result
100
- ret = 0
101
- n = 50
102
- if x <= -1:
103
- return Number.NEGATIVE_INFINITY
104
- if x < 0 or x > 1:
105
- return Math.log(1 + x)
106
- for i in range(1, n):
107
- if i % 2 is 0:
108
- ret -= Math.pow(x, i) / i
109
- else:
110
- ret += Math.pow(x, i) / i
111
- return ret
112
- def log10(x):
113
- # NOTE: Math.log10() is currently only implemented in Firefox, this provides alternative implementation
114
- # https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/log10
115
- # I didn't find a more accurate algorithm so I'm using the basic implementation
116
- return Math.log(x)/Math.LN10
117
- def pow(x, y):
118
- if x < 0 and int(y) is not y:
119
- raise ValueError('math domain error')
120
- if isnan(y) and x is 1:
121
- return 1
122
- return Math.pow(x, y)
123
- def sqrt(x):
124
- return Math.sqrt(x)
125
-
126
- ########################################
127
- # Trigonometric functions
128
- ########################################
129
- def acos(x): return Math.acos(x)
130
- def asin(x): return Math.asin(x)
131
- def atan(x): return Math.atan(x)
132
- def atan2(y, x): return Math.atan2(y, x)
133
- def cos(x): return Math.cos(x)
134
- def sin(x): return Math.sin(x)
135
- def hypot(x, y): return Math.sqrt(x*x + y*y)
136
- def tan(x): return Math.tan(x)
137
-
138
- ########################################
139
- # Angular conversion
140
- ########################################
141
- def degrees(x): return x*180/pi
142
- def radians(x): return x*pi/180
143
-
144
- ########################################
145
- # Hyperbolic functions
146
- ########################################
147
- def acosh(x):
148
- # NOTE: will be replaced with official, when it becomes mainstream
149
- # https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/acosh
150
- return Math.log(x + Math.sqrt(x*x - 1))
151
- def asinh(x):
152
- # NOTE: will be replaced with official, when it becomes mainstream
153
- # https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/asinh
154
- return Math.log(x + Math.sqrt(x*x + 1))
155
- def atanh(x):
156
- # NOTE: will be replaced with official, when it becomes mainstream
157
- # https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/atanh
158
- return 0.5 * Math.log((1 + x) / (1 - x))
159
- def cosh(x):
160
- # NOTE: will be replaced with official, when it becomes mainstream
161
- # https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/cosh
162
- return (Math.exp(x) + Math.exp(-x)) / 2
163
- def sinh(x):
164
- # NOTE: will be replaced with official, when it becomes mainstream
165
- # https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sinh
166
- return (Math.exp(x) - Math.exp(-x)) / 2
167
- def tanh(x):
168
- # NOTE: will be replaced with official, when it becomes mainstream
169
- # https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/tanh
170
- return (Math.exp(x) - Math.exp(-x)) / (Math.exp(x) + Math.exp(-x))
171
-
172
-
173
-
174
- #import stdlib
175
- #print(math.ceil(4.2))
176
- #print(math.floor(4.2))
177
- #print(math.fabs(-6))
178
- #print(math.copysign(-5, 7))
179
- #print(math.factorial(4))
180
- #print(math.fmod(-1e100, 1e100))
181
- #
182
- #d = [0.9999999, 1, 2, 3]
183
- #print(sum(d), math.fsum(d))
184
- #print(math.isinf(5), math.isinf(Infinity))
185
- #print(math.modf(5.5))
186
- #print(math.trunc(2.6), math.trunc(-2.6))
187
- #print(math.exp(1e-5), math.expm1(1e-5))
188
- #print(math.log(10), math.log(10, 1000))
189
- #print(math.log1p(1e-15), math.log1p(1))
190
- #print(math.log10(1000), math.log(1000, 10))
191
- #print(math.pow(1, 0), math.pow(1, NaN), math.pow(0, 0), math.pow(NaN, 0), math.pow(4,3), math.pow(100, -2))
192
- #print(math.hypot(3,4))
193
- #print(math.acosh(2), math.asinh(1), math.atanh(0.5), math.cosh(1), math.cosh(-1), math.sinh(1), math.tanh(1))
1
+ ###########################################################
2
+ # RapydScript Standard Library
3
+ # Author: Alexander Tsepkov
4
+ # Copyright 2013 Pyjeon Software LLC
5
+ # License: Apache License 2.0
6
+ # This library is covered under Apache license, so that
7
+ # you can distribute it with your RapydScript applications.
8
+ ###########################################################
9
+
10
+
11
+ # basic implementation of Python's 'math' library
12
+
13
+ # NOTE: this is only meant to aid those porting lots of Python code into RapydScript,
14
+ # if you're writing a new RapydScript application, in most cases you probably want to
15
+ # use JavaScript's Math module directly instead
16
+
17
+
18
+ pi = Math.PI
19
+ e = Math.E
20
+ inf = Infinity
21
+
22
+ ########################################
23
+ # Number-theoretic and representation functions
24
+ ########################################
25
+ def ceil(x):
26
+ return Math.ceil(x)
27
+ def copysign(x, y):
28
+ x = Math.abs(x)
29
+ if y < 0:
30
+ return -x
31
+ else:
32
+ return x
33
+ def fabs(x):
34
+ return Math.abs(x)
35
+ def factorial(x):
36
+ if Math.abs(int(x)) is not x:
37
+ raise ValueError("factorial() only accepts integral values")
38
+ factorial.cache = []
39
+ r = def(n):
40
+ if n is 0 or n is 1:
41
+ return 1
42
+ if not factorial.cache[n]:
43
+ factorial.cache[n] = r(n-1) * n
44
+ return factorial.cache[n]
45
+ return r(x)
46
+ def floor(x):
47
+ return Math.floor(x)
48
+ def fmod(x, y):
49
+ # javascript's % operator isn't consistent with C fmod implementation, this function is
50
+ while y <= x:
51
+ x -= y
52
+ return x
53
+ def fsum(iterable):
54
+ # like Python's fsum, this method is much more resilient to rounding errors than regular sum
55
+ partials = [] # sorted, non-overlapping partial sums
56
+ for x in iterable:
57
+ i = 0
58
+ for y in partials:
59
+ if Math.abs(x) < Math.abs(y):
60
+ x, y = y, x
61
+ hi = x + y
62
+ lo = y - (hi - x)
63
+ if lo:
64
+ partials[i] = lo
65
+ i += 1
66
+ x = hi
67
+ #partials[i:] = [x]
68
+ partials.splice(i, partials.length-i, x)
69
+ return sum(partials)
70
+ def isinf(x):
71
+ return not isFinite(x)
72
+ def isnan(x):
73
+ return isNaN(x)
74
+ def modf(x):
75
+ m = fmod(x, 1)
76
+ return m, x-m
77
+ def trunc(x):
78
+ return x | 0
79
+
80
+ ########################################
81
+ # Power and logarithmic functions
82
+ ########################################
83
+ def exp(x):
84
+ return Math.exp(x)
85
+ def expm1(x):
86
+ # NOTE: Math.expm1() is currently only implemented in Firefox, this provides alternative implementation
87
+ # https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/expm1
88
+ #return Math.expm1(x)
89
+ if Math.abs(x) < 1e-5:
90
+ return x + 0.5*x*x
91
+ else:
92
+ return Math.exp(x) - 1
93
+ def log(x, base=e):
94
+ return Math.log(x)/Math.log(base)
95
+ def log1p(x):
96
+ # NOTE: Math.log1p() is currently only implemented in Firefox, this provides alternative implementation
97
+ # https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/log1p
98
+ # this version has been taken from http://phpjs.org/functions/log1p/
99
+ # admittedly it's not as accurate as MDN version, as you can see from math.log1p(1) result
100
+ ret = 0
101
+ n = 50
102
+ if x <= -1:
103
+ return Number.NEGATIVE_INFINITY
104
+ if x < 0 or x > 1:
105
+ return Math.log(1 + x)
106
+ for i in range(1, n):
107
+ if i % 2 is 0:
108
+ ret -= Math.pow(x, i) / i
109
+ else:
110
+ ret += Math.pow(x, i) / i
111
+ return ret
112
+ def log10(x):
113
+ # NOTE: Math.log10() is currently only implemented in Firefox, this provides alternative implementation
114
+ # https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/log10
115
+ # I didn't find a more accurate algorithm so I'm using the basic implementation
116
+ return Math.log(x)/Math.LN10
117
+ def pow(x, y):
118
+ if x < 0 and int(y) is not y:
119
+ raise ValueError('math domain error')
120
+ if isnan(y) and x is 1:
121
+ return 1
122
+ return Math.pow(x, y)
123
+ def sqrt(x):
124
+ return Math.sqrt(x)
125
+
126
+ ########################################
127
+ # Trigonometric functions
128
+ ########################################
129
+ def acos(x): return Math.acos(x)
130
+ def asin(x): return Math.asin(x)
131
+ def atan(x): return Math.atan(x)
132
+ def atan2(y, x): return Math.atan2(y, x)
133
+ def cos(x): return Math.cos(x)
134
+ def sin(x): return Math.sin(x)
135
+ def hypot(x, y): return Math.sqrt(x*x + y*y)
136
+ def tan(x): return Math.tan(x)
137
+
138
+ ########################################
139
+ # Angular conversion
140
+ ########################################
141
+ def degrees(x): return x*180/pi
142
+ def radians(x): return x*pi/180
143
+
144
+ ########################################
145
+ # Hyperbolic functions
146
+ ########################################
147
+ def acosh(x):
148
+ # NOTE: will be replaced with official, when it becomes mainstream
149
+ # https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/acosh
150
+ return Math.log(x + Math.sqrt(x*x - 1))
151
+ def asinh(x):
152
+ # NOTE: will be replaced with official, when it becomes mainstream
153
+ # https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/asinh
154
+ return Math.log(x + Math.sqrt(x*x + 1))
155
+ def atanh(x):
156
+ # NOTE: will be replaced with official, when it becomes mainstream
157
+ # https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/atanh
158
+ return 0.5 * Math.log((1 + x) / (1 - x))
159
+ def cosh(x):
160
+ # NOTE: will be replaced with official, when it becomes mainstream
161
+ # https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/cosh
162
+ return (Math.exp(x) + Math.exp(-x)) / 2
163
+ def sinh(x):
164
+ # NOTE: will be replaced with official, when it becomes mainstream
165
+ # https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sinh
166
+ return (Math.exp(x) - Math.exp(-x)) / 2
167
+ def tanh(x):
168
+ # NOTE: will be replaced with official, when it becomes mainstream
169
+ # https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/tanh
170
+ return (Math.exp(x) - Math.exp(-x)) / (Math.exp(x) + Math.exp(-x))
171
+
172
+
173
+
174
+ #import stdlib
175
+ #print(math.ceil(4.2))
176
+ #print(math.floor(4.2))
177
+ #print(math.fabs(-6))
178
+ #print(math.copysign(-5, 7))
179
+ #print(math.factorial(4))
180
+ #print(math.fmod(-1e100, 1e100))
181
+ #
182
+ #d = [0.9999999, 1, 2, 3]
183
+ #print(sum(d), math.fsum(d))
184
+ #print(math.isinf(5), math.isinf(Infinity))
185
+ #print(math.modf(5.5))
186
+ #print(math.trunc(2.6), math.trunc(-2.6))
187
+ #print(math.exp(1e-5), math.expm1(1e-5))
188
+ #print(math.log(10), math.log(10, 1000))
189
+ #print(math.log1p(1e-15), math.log1p(1))
190
+ #print(math.log10(1000), math.log(1000, 10))
191
+ #print(math.pow(1, 0), math.pow(1, NaN), math.pow(0, 0), math.pow(NaN, 0), math.pow(4,3), math.pow(100, -2))
192
+ #print(math.hypot(3,4))
193
+ #print(math.acosh(2), math.asinh(1), math.atanh(0.5), math.cosh(1), math.cosh(-1), math.sinh(1), math.tanh(1))
@@ -1,11 +1,11 @@
1
- add = __add__ = def(x, y): return x + y
2
- sub = __sub__ = def(x, y): return x - y
3
- mul = __mul__ = def(x, y): return x * y
4
- div = __div__ = def(x, y): return x / y
5
-
6
- lt = __lt__ = def(x, y): return x < y
7
- le = __le__ = def(x, y): return x <= y
8
- eq = __eq__ = def(x, y): return x is y
9
- ne = __ne__ = def(x, y): return x is not y
10
- ge = __ge__ = def(x, y): return x >= y
11
- gt = __gt__ = def(x, y): return x > y
1
+ add = __add__ = def(x, y): return x + y
2
+ sub = __sub__ = def(x, y): return x - y
3
+ mul = __mul__ = def(x, y): return x * y
4
+ div = __div__ = def(x, y): return x / y
5
+
6
+ lt = __lt__ = def(x, y): return x < y
7
+ le = __le__ = def(x, y): return x <= y
8
+ eq = __eq__ = def(x, y): return x is y
9
+ ne = __ne__ = def(x, y): return x is not y
10
+ ge = __ge__ = def(x, y): return x >= y
11
+ gt = __gt__ = def(x, y): return x > y
@@ -1,20 +1,20 @@
1
- # vim:fileencoding=utf-8
2
- # License: BSD Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>
3
- # globals: ρσ_str
4
-
5
- def strings():
6
- string_funcs = set((
7
- 'capitalize strip lstrip rstrip islower isupper isspace lower upper swapcase title'
8
- ' center count endswith startswith find rfind index rindex format join ljust rjust'
9
- ' partition rpartition replace split rsplit splitlines zfill expandtabs').split(' '))
10
-
11
- if not arguments.length:
12
- exclude = {'split', 'replace'}
13
- elif arguments[0]:
14
- exclude = Array.prototype.slice.call(arguments)
15
- else:
16
- exclude = None
17
- if exclude:
18
- string_funcs = string_funcs.difference(set(exclude))
19
- for name in string_funcs:
20
- String.prototype[name] = ρσ_str.prototype[name]
1
+ # vim:fileencoding=utf-8
2
+ # License: BSD Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>
3
+ # globals: ρσ_str
4
+
5
+ def strings():
6
+ string_funcs = set((
7
+ 'capitalize strip lstrip rstrip islower isupper isspace lower upper swapcase title'
8
+ ' center count endswith startswith find rfind index rindex format join ljust rjust'
9
+ ' partition rpartition replace split rsplit splitlines zfill expandtabs').split(' '))
10
+
11
+ if not arguments.length:
12
+ exclude = {'split', 'replace'}
13
+ elif arguments[0]:
14
+ exclude = Array.prototype.slice.call(arguments)
15
+ else:
16
+ exclude = None
17
+ if exclude:
18
+ string_funcs = string_funcs.difference(set(exclude))
19
+ for name in string_funcs:
20
+ String.prototype[name] = ρσ_str.prototype[name]