This commit is contained in:
blueloveTH 2023-06-04 22:20:42 +08:00
parent caadfefc01
commit f16518e439
5 changed files with 97 additions and 6 deletions

View File

@ -104,7 +104,8 @@ def sorted(iterable, reverse=False, key=None):
return a return a
##### str ##### ##### str #####
def __f(self, sep): def __f(self, sep=None):
sep = sep or ' '
if sep == "": if sep == "":
return list(self) return list(self)
res = [] res = []
@ -130,6 +131,22 @@ def __f(self, *args):
return self return self
str.format = __f str.format = __f
def __f(self, chars=None):
chars = chars or ' \t\n\r'
i = 0
while i < len(self) and self[i] in chars:
++i
return self[i:]
str.lstrip = __f
def __f(self, chars=None):
chars = chars or ' \t\n\r'
j = len(self) - 1
while j >= 0 and self[j] in chars:
--j
return self[:j+1]
str.rstrip = __f
def __f(self, chars=None): def __f(self, chars=None):
chars = chars or ' \t\n\r' chars = chars or ' \t\n\r'
i = 0 i = 0
@ -169,8 +186,37 @@ def __f(self, reverse=False, key=None):
self.reverse() self.reverse()
list.sort = __f list.sort = __f
def staticmethod(f): def __f(self, other):
return f # no effect for i, j in zip(self, other):
if i != j:
return i < j
return len(self) < len(other)
tuple.__lt__ = __f
list.__lt__ = __f
def __f(self, other):
for i, j in zip(self, other):
if i != j:
return i > j
return len(self) > len(other)
tuple.__gt__ = __f
list.__gt__ = __f
def __f(self, other):
for i, j in zip(self, other):
if i != j:
return i <= j
return len(self) <= len(other)
tuple.__le__ = __f
list.__le__ = __f
def __f(self, other):
for i, j in zip(self, other):
if i != j:
return i >= j
return len(self) >= len(other)
tuple.__ge__ = __f
list.__ge__ = __f
type.__repr__ = lambda self: "<class '" + self.__name__ + "'>" type.__repr__ = lambda self: "<class '" + self.__name__ + "'>"

View File

@ -81,3 +81,39 @@ def Counter(iterable):
else: else:
a[x] = 1 a[x] = 1
return a return a
class defaultdict:
def __init__(self, default_factory) -> None:
self.default_factory = default_factory
self._a = {}
def __getitem__(self, key):
if key not in self._a:
self._a[key] = self.default_factory()
return self._a[key]
def __setitem__(self, key, value):
self._a[key] = value
def __repr__(self) -> str:
return f"defaultdict({self.default_factory}, {self._a})"
def __eq__(self, __o: object) -> bool:
if not isinstance(__o, defaultdict):
return False
if self.default_factory != __o.default_factory:
return False
return self._a == __o._a
def __len__(self):
return len(self._a)
def keys(self):
return self._a.keys()
def values(self):
return self._a.values()
def items(self):
return self._a.items()

View File

@ -856,8 +856,10 @@ __SUBSCR_END:
consume(TK("@id")); consume(TK("@id"));
int namei = StrName(prev().str()).index; int namei = StrName(prev().str()).index;
int super_namei = -1; int super_namei = -1;
if(match(TK("(")) && match(TK("@id"))){ if(match(TK("("))){
super_namei = StrName(prev().str()).index; if(match(TK("@id"))){
super_namei = StrName(prev().str()).index;
}
consume(TK(")")); consume(TK(")"));
} }
if(super_namei == -1) ctx()->emit(OP_LOAD_NONE, BC_NOARG, prev().line); if(super_namei == -1) ctx()->emit(OP_LOAD_NONE, BC_NOARG, prev().line);

View File

@ -7,10 +7,11 @@
int main(int argc, char** argv){ int main(int argc, char** argv){
pkpy::VM* vm = pkpy_new_vm(); pkpy::VM* vm = pkpy_new_vm();
vm->bind_builtin_func<0>("input", [](pkpy::VM* vm, pkpy::ArgsView args){ pkpy::PyObject* input_f = vm->bind_builtin_func<0>("input", [](pkpy::VM* vm, pkpy::ArgsView args){
// pkpy::getline() has bugs for PIPE input on Windows // pkpy::getline() has bugs for PIPE input on Windows
return VAR(pkpy::getline()); return VAR(pkpy::getline());
}); });
vm->_modules["sys"]->attr("stdin")->attr().set("readline", input_f);
if(argc == 1){ if(argc == 1){
pkpy::REPL* repl = pkpy_new_repl(vm); pkpy::REPL* repl = pkpy_new_repl(vm);
bool need_more_lines = false; bool need_more_lines = false;

View File

@ -104,6 +104,10 @@ inline void init_builtins(VM* _vm) {
return VAR_T(VoidP, obj); return VAR_T(VoidP, obj);
}); });
_vm->bind_builtin_func<1>("staticmethod", [](VM* vm, ArgsView args) {
return args[0];
});
_vm->bind_builtin_func<1>("__import__", [](VM* vm, ArgsView args) { _vm->bind_builtin_func<1>("__import__", [](VM* vm, ArgsView args) {
return vm->py_import(CAST(Str&, args[0])); return vm->py_import(CAST(Str&, args[0]));
}); });
@ -1110,8 +1114,10 @@ inline void add_module_sys(VM* vm){
PyObject* stdout_ = vm->heap.gcnew<DummyInstance>(vm->tp_object, {}); PyObject* stdout_ = vm->heap.gcnew<DummyInstance>(vm->tp_object, {});
PyObject* stderr_ = vm->heap.gcnew<DummyInstance>(vm->tp_object, {}); PyObject* stderr_ = vm->heap.gcnew<DummyInstance>(vm->tp_object, {});
PyObject* stdin_ = vm->heap.gcnew<DummyInstance>(vm->tp_object, {});
vm->setattr(mod, "stdout", stdout_); vm->setattr(mod, "stdout", stdout_);
vm->setattr(mod, "stderr", stderr_); vm->setattr(mod, "stderr", stderr_);
vm->setattr(mod, "stdin", stdin_);
vm->bind_func<1>(stdout_, "write", [](VM* vm, ArgsView args) { vm->bind_func<1>(stdout_, "write", [](VM* vm, ArgsView args) {
vm->_stdout(vm, CAST(Str&, args[0])); vm->_stdout(vm, CAST(Str&, args[0]));