@@ -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-
7864def _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
9177def 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
10692def 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
225211def 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
241226def 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
257241def 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
273256def 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+
289286def 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
306301def 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):
321316def 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):
338331def 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