pocketpy/src/builtins.h
blueloveTH 035fe636ab Update builtins.h
Update builtins.h

Update builtins.h

Update builtins.h
2022-11-08 22:19:09 +08:00

125 lines
3.1 KiB
C++

#pragma once
const char* __BUILTINS_CODE = R"(
def len(x):
return x.__len__()
str.__mul__ = lambda self, n: ''.join([self for _ in range(n)])
def __str4split(self, sep):
if sep == "":
return list(self)
res = []
i = 0
while i < len(self):
if self[i:i+len(sep)] == sep:
res.append(self[:i])
self = self[i+len(sep):]
i = 0
else:
i += 1
res.append(self)
return res
str.split = __str4split
list.__repr__ = lambda self: '[' + ', '.join([repr(i) for i in self]) + ']'
tuple.__repr__ = lambda self: '(' + ', '.join([repr(i) for i in self]) + ')'
def __list4extend(self, other):
for i in other:
self.append(i)
list.extend = __list4extend
def __list4__mul__(self, n):
a = []
for i in range(n):
a.extend(self)
return a
list.__mul__ = __list4__mul__
def __iterable4__eq__(self, other):
if len(self) != len(other):
return False
for i in range(len(self)):
if self[i] != other[i]:
return False
return True
list.__eq__ = __iterable4__eq__
tuple.__eq__ = __iterable4__eq__
def __iterable4__contains__(self, item):
for i in self:
if i == item:
return True
return False
list.__contains__ = __iterable4__contains__
tuple.__contains__ = __iterable4__contains__
# https://github.com/python/cpython/blob/main/Objects/dictobject.c
class dict:
def __init__(self):
self._capacity = 8
self._a = [None] * self._capacity
self._len = 0
def __len__(self):
return self._len
def __probe(self, key):
i = hash(key) % self._capacity
while self._a[i] is not None:
if self._a[i][0] == key:
return True, i
i = ((5*i) + 1) % self._capacity
return False, i
def __getitem__(self, key):
ok, i = self.__probe(key)
if not ok:
raise KeyError(key)
return self._a[i][1]
def __contains__(self, key):
ok, i = self.__probe(key)
return ok
def __setitem__(self, key, value):
ok, i = self.__probe(key)
if ok:
self._a[i][1] = value
else:
self._a[i] = [key, value]
self._len += 1
if self._len > self._capacity * 0.6:
self.__resize_2x()
def __delitem__(self, key):
ok, i = self.__probe(key)
if not ok:
raise KeyError(key)
self._a[i] = None
self._len -= 1
def __resize_2x(self):
old_a = self._a
self._capacity *= 2
self._a = [None] * self._capacity
self._len = 0
for kv in old_a:
if kv is not None:
self[kv[0]] = kv[1]
def keys(self):
return [kv[0] for kv in self._a if kv is not None]
def values(self):
return [kv[1] for kv in self._a if kv is not None]
def items(self):
return [kv for kv in self._a if kv is not None]
def __repr__(self):
a = [repr(k)+': '+repr(v) for k,v in self.items()]
return '{'+ ', '.join(a) + '}'
)";