Skip to content

Commit 9ea1029

Browse files
committed
interpreterprocessor.py fixes and enhancements
Fully tested (tests fail without the fixes and enhancements): - Enhanced Absolute to remove any leading "-" from a string - Fixed Product([]) to return 1 instead of None - Fixed Lowercase([]) and Uppercase([]) to return [] instead of None - Fixed Incremented([]) to return [] instead of None - Enhanced SquareRoot to vectorise and cast string to float - Enhanced Maximum("") and Minimum("") to return "" instead of crashing - Fixed Negate([[]]) to return [[]] instead of crashing - Fixed Reverse(1.2) to return 2.1 instead of crashing - Enhanced AtIndex("\0", 0) to return "\0" instead of "" - Fixed Split(101, 0) to return [1, 1] instead of crashing Partially tested (tests are skipped if above tests fail): - Fixed Absolute([]) to return [] instead of crashing - Fixed Decremented([]) to return [] instead of None - Fixed Doubled([]) and Halved([]) to return [] instead of None - Fixed Negate("1") to return "-1" instead of crashing - Fixed Reverse(Negate(12)) to return -21 instead of crashing - Fixed Split("foobar", ["oo", "a"]) to return ["f", "b", "r"] Untested: - Removed rounding from Incremented, Decremented, Doubled and Halved - Fixed BitwiseNot(Cast("-1.0")) to return 0 instead of crashing - Enhanced Join to cast its second parameter to string - Enhanced PadLeft and PadRight to cast their first parameter to string
1 parent 3153a86 commit 9ea1029

File tree

2 files changed

+99
-95
lines changed

2 files changed

+99
-95
lines changed

‎interpreterprocessor.py‎

Lines changed: 71 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -61,20 +61,6 @@ def itersplit(iterable, number):
6161
return result
6262

6363

64-
def negate_str(string):
65-
try:
66-
return float(string) if "." in string else int(string)
67-
except:
68-
return string[::-1]
69-
70-
71-
def abs_str(string):
72-
try:
73-
return abs(float(string) if "." in string else int(string))
74-
except:
75-
return string # ???
76-
77-
7864
def _int(obj):
7965
if isinstance(obj, str) and re.match("\d+\.?\d*$", obj):
8066
return int(float(obj))
@@ -89,31 +75,31 @@ def product(item):
8975

9076

9177
def Negate(item):
92-
if isinstance(item, int) or isinstance(item, float):
78+
if isinstance(item, int) or isinstance(item, float) or isinstance(item, Number):
9379
return -item
94-
if isinstance(item, str):
95-
return negate_str(item)
9680
if isinstance(item, Expression):
9781
item = item.run()
9882
if isinstance(item, String):
99-
return String(negate_str(str(item)))
83+
item = str(item)
84+
if isinstance(item, str):
85+
return item[1:] if item[:1] == "-" else "-" + item
10086
if hasattr(item, "__iter__"):
101-
if isinstance(item[0], Expression):
87+
if item and isinstance(item[0], Expression):
10288
item = iter_apply(item, lambda o: o.run())
10389
return iter_apply(item, Negate)
10490

10591

10692
def Abs(item):
10793
if isinstance(item, int) or isinstance(item, float):
10894
return abs(item)
109-
if isinstance(item, str):
110-
return abs_str(item)
11195
if isinstance(item, Expression):
11296
item = item.run()
11397
if isinstance(item, String):
114-
return String(abs_str(str(item)))
98+
item = str(item)
99+
if isinstance(item, str):
100+
return item[1:] if item[:1] == "-" else item
115101
if hasattr(item, "__iter__"):
116-
if isinstance(item[0], Expression):
102+
if item and isinstance(item[0], Expression):
117103
item = iter_apply(item, lambda o: o.run())
118104
return iter_apply(item, Abs)
119105

@@ -170,8 +156,8 @@ def Product(item):
170156
float(c) if "." in c else int(c)
171157
for c in re.findall("\d+\.?\d*|\.\d+", item)
172158
)
173-
if hasattr(item, "__iter__") and item:
174-
if isinstance(item[0], Expression):
159+
if hasattr(item, "__iter__"):
160+
if item and isinstance(item[0], Expression):
175161
item = iter_apply(item, lambda o: o.run())
176162
# TODO: cartesian product?
177163
# if isinstance(item[0], list):
@@ -223,95 +209,104 @@ def vectorized(left, right, c):
223209

224210

225211
def Incremented(item):
226-
if isinstance(item, float) or isinstance(item, int):
227-
return round(item + 1, 15)
228212
if isinstance(item, Expression):
229213
item = item.run()
230214
if isinstance(item, String):
231215
item = str(item)
232216
if isinstance(item, str):
233217
item = float(item) if "." in item else int(item)
234-
return Incremented(item)
235-
if hasattr(item, "__iter__") and item:
236-
if isinstance(item[0], Expression):
218+
if isinstance(item, float) or isinstance(item, int):
219+
return item + 1
220+
if hasattr(item, "__iter__"):
221+
if item and isinstance(item[0], Expression):
237222
item = iter_apply(item, lambda o: o.run())
238223
return iter_apply(item, Incremented)
239224

240225

241226
def Decremented(item):
242-
if isinstance(item, float) or isinstance(item, int):
243-
return round(item - 1, 15)
244227
if isinstance(item, Expression):
245228
item = item.run()
246229
if isinstance(item, String):
247230
item = str(item)
248231
if isinstance(item, str):
249232
item = float(item) if "." in item else int(item)
250-
return Decremented(item)
251-
if hasattr(item, "__iter__") and item:
252-
if isinstance(item[0], Expression):
233+
if isinstance(item, float) or isinstance(item, int):
234+
return item - 1
235+
if hasattr(item, "__iter__"):
236+
if item and isinstance(item[0], Expression):
253237
item = iter_apply(item, lambda o: o.run())
254238
return iter_apply(item, Decremented)
255239

256240

257241
def Doubled(item):
258-
if isinstance(item, float) or isinstance(item, int):
259-
return round(item * 2, 15)
260242
if isinstance(item, Expression):
261243
item = item.run()
262244
if isinstance(item, String):
263245
item = str(item)
264246
if isinstance(item, str):
265247
item = float(item) if "." in item else int(item)
266-
return Doubled(item)
267-
if hasattr(item, "__iter__") and item:
268-
if isinstance(item[0], Expression):
248+
if isinstance(item, float) or isinstance(item, int):
249+
return item * 2
250+
if hasattr(item, "__iter__"):
251+
if item and isinstance(item[0], Expression):
269252
item = iter_apply(item, lambda o: o.run())
270253
return iter_apply(item, Doubled)
271254

272255

273256
def Halved(item):
274-
if isinstance(item, float) or isinstance(item, int):
275-
return round(item / 2, 15)
276257
if isinstance(item, Expression):
277258
item = item.run()
278259
if isinstance(item, String):
279260
item = str(item)
280261
if isinstance(item, str):
281262
item = float(item) if "." in item else int(item)
282-
return Halved(item)
283-
if hasattr(item, "__iter__") and item:
284-
if isinstance(item[0], Expression):
263+
if isinstance(item, float) or isinstance(item, int):
264+
return item / 2 if item % 2 else item // 2
265+
if hasattr(item, "__iter__"):
266+
if item and isinstance(item[0], Expression):
285267
item = iter_apply(item, lambda o: o.run())
286268
return iter_apply(item, Halved)
287269

288270

271+
def SquareRoot(item):
272+
if isinstance(item, Expression):
273+
item = item.run()
274+
if isinstance(item, String):
275+
item = str(item)
276+
if isinstance(item, str):
277+
item = float(item)
278+
if isinstance(item, float) or isinstance(item, int):
279+
return item ** 0.5
280+
if hasattr(item, "__iter__"):
281+
if item and isinstance(item[0], Expression):
282+
item = iter_apply(item, lambda o: o.run())
283+
return iter_apply(item, SquareRoot)
284+
285+
289286
def Lower(item):
290287
if isinstance(item, int) or isinstance(item, float):
291288
return str(item)
292-
if isinstance(item, str):
293-
return item.lower()
294289
if isinstance(item, Expression):
295290
item = item.run()
296291
if isinstance(item, String):
297-
item = String(str(item).lower())
292+
item = str(item)
298293
if isinstance(item, str):
299294
return item.lower()
300-
if hasattr(item, "__iter__") and item:
301-
if isinstance(item[0], Expression):
295+
if hasattr(item, "__iter__"):
296+
if item and isinstance(item[0], Expression):
302297
item = iter_apply(item, lambda o: o.run())
303298
return iter_apply(item, Lower)
304299

305300

306301
def Min(item):
307302
if isinstance(item, int) or isinstance(item, float):
308303
return floor(item)
309-
if isinstance(item, str):
310-
return chr(min(map(ord, item)))
311304
if isinstance(item, Expression):
312305
item = item.run()
313306
if isinstance(item, String):
314-
return String(Min(str(item)))
307+
item = str(item)
308+
if isinstance(item, str):
309+
return item and min(item)
315310
if hasattr(item, "__iter__") and item:
316311
if isinstance(item[0], Expression):
317312
item = iter_apply(item, lambda o: o.run())
@@ -321,14 +316,12 @@ def Min(item):
321316
def Max(item):
322317
if isinstance(item, int) or isinstance(item, float):
323318
return ceil(item)
324-
if isinstance(item, str):
325-
return chr(max(map(ord, item)))
326319
if isinstance(item, Expression):
327320
item = item.run()
328321
if isinstance(item, String):
329-
item = String(str(item).lower())
322+
item = str(item)
330323
if isinstance(item, str):
331-
return item.lower()
324+
return item and max(item)
332325
if hasattr(item, "__iter__") and item:
333326
if isinstance(item[0], Expression):
334327
item = iter_apply(item, lambda o: o.run())
@@ -338,14 +331,14 @@ def Max(item):
338331
def Upper(item):
339332
if isinstance(item, int) or isinstance(item, float):
340333
return str(item)
341-
if isinstance(item, str):
342-
return item.upper()
343334
if isinstance(item, Expression):
344335
item = item.run()
345336
if isinstance(item, String):
346-
item = String(str(item).upper())
347-
if hasattr(item, "__iter__") and item:
348-
if isinstance(item[0], Expression):
337+
item = str(item)
338+
if isinstance(item, str):
339+
return item.upper()
340+
if hasattr(item, "__iter__"):
341+
if item and isinstance(item[0], Expression):
349342
item = iter_apply(item, lambda o: o.run())
350343
return iter_apply(item, Upper)
351344

@@ -572,16 +565,7 @@ def direction(dir):
572565
lambda r: lambda c: c.y
573566
],
574567
CT.Unary: [
575-
lambda r: lambda item, c: (
576-
iter_apply(item, lambda x: -x)
577-
if hasattr(item, "__iter__") else
578-
(-item)
579-
if (
580-
isinstance(item, int) or isinstance(item, float) or
581-
isinstance(item, Number)
582-
) else
583-
negate_str(str(item))
584-
),
568+
lambda r: lambda item, c: Negate(item),
585569
lambda r: lambda item, c: (
586570
len(item) if hasattr(item, "__iter__") else len(str(item))
587571
),
@@ -598,11 +582,15 @@ def direction(dir):
598582
lambda r: lambda item, c: (
599583
item[::-1]
600584
if hasattr(item, "__iter__") else
601-
int(str(item)[::-1])
585+
int(
586+
("-" + str(item)[:0:-1])
587+
if str(item)[:1] == "-" else
588+
str(item)[::-1]
589+
)
602590
if isinstance(item, int) else
603591
float(
604592
("-" + str(item)[:0:-1])
605-
if item[-1] == "-" else
593+
if str(item)[:1] == "-" else
606594
str(item)[::-1]
607595
)
608596
if isinstance(item, float) else
@@ -623,9 +611,9 @@ def direction(dir):
623611
list(map(chr, range(ord(item))))
624612
),
625613
lambda r: lambda item, c: (
626-
~item
614+
~int(item)
627615
if isinstance(item, int) or isinstance(item, float) else
628-
(~(float(str(item)) if "." in item else int(str(item))))
616+
(~int(float(str(item)) if "." in item else str(item)))
629617
),
630618
lambda r: lambda item, c: Abs(item),
631619
lambda r: lambda item, c: Sum(item),
@@ -635,7 +623,7 @@ def direction(dir):
635623
lambda r: lambda item, c: Doubled(item),
636624
lambda r: lambda item, c: Halved(item),
637625
lambda r: lambda item, c: eval(item),
638-
lambda r: lambda item, c: item ** 0.5
626+
lambda r: lambda item, c: SquareRoot(item)
639627
],
640628
CT.Binary: [
641629
lambda r: lambda left, right, c: c.Add(left, right),
@@ -671,8 +659,6 @@ def direction(dir):
671659
),
672660
lambda r: vectorize(lambda left, right, c: left ** right),
673661
lambda r: lambda left, right, c: (
674-
lambda value: "" if value == "\x00" else value
675-
)(
676662
(left[right] if right in left else None)
677663
if isinstance(left, dict) else
678664
left[int(right) % len(left)]
@@ -684,26 +670,26 @@ def direction(dir):
684670
)
685671
),
686672
lambda r: lambda left, right, c: left.append(right) or left,
687-
lambda r: lambda left, right, c: right.join(map(str, left)),
673+
lambda r: lambda left, right, c: str(right).join(map(str, left)),
688674
lambda r: lambda left, right, c: (
689-
itersplit(left, int(right))
690-
if isinstance(right, int) or isinstance(right, float) else
691675
list(map(int, str(left).split(str(right))))
692676
if isinstance(left, int) or isinstance(left, float) else
677+
itersplit(left, int(right))
678+
if isinstance(right, int) or isinstance(right, float) else
693679
left.split(right)
694680
if isinstance(left, str) and isinstance(right, str) else
695681
[item.split(right) for item in left]
696682
if hasattr(left, "__getitem__") and isinstance(right, str) else
697-
re.split(left, "|".join(map(re.escape, right)))
683+
re.split("|".join(map(re.escape, map(str, right))), left)
698684
),
699685
lambda r: lambda left, right, c: FindAll(left, right),
700686
lambda r: lambda left, right, c: (
701687
left.find(right)
702688
if isinstance(left, str) else
703689
ListFind(left, right)
704690
),
705-
lambda r: lambda left, right, c: " " * (int(right) - len(left)) + left,
706-
lambda r: lambda left, right, c: left + " " * (int(right) - len(left)),
691+
lambda r: lambda left, right, c: " " * (int(right) - len(str(left))) + str(left),
692+
lambda r: lambda left, right, c: str(left) + " " * (int(right) - len(str(left))),
707693
lambda r: lambda left, right, c: list(left.values()).count(right) if isinstance(left, dict) else left.count(right),
708694
lambda r: lambda left, right, c: Rule(left, right),
709695
lambda r: lambda left, right, c: DelayedRule(left, right),

0 commit comments

Comments
 (0)