add tuple slice

This commit is contained in:
blueloveTH 2023-02-01 21:06:06 +08:00
parent 49d57703ff
commit 645320eb2f
2 changed files with 13 additions and 12 deletions

View File

@ -421,16 +421,16 @@ void __initializeBuiltinFunctions(VM* _vm) {
return vm->PyInt(_self.size()); return vm->PyInt(_self.size());
}); });
_vm->bindMethod<1>("list", "__getitem__", [](VM* vm, const pkpy::ArgList& args) { _vm->bindMethodMulti<1>({"list", "tuple"}, "__getitem__", [](VM* vm, const pkpy::ArgList& args) {
const PyVarList& _self = vm->PyList_AS_C(args[0]); bool list = args[0]->is_type(vm->_tp_list);
const PyVarList& _self = list ? vm->PyList_AS_C(args[0]) : vm->PyTuple_AS_C(args[0]);
if(args[1]->is_type(vm->_tp_slice)){ if(args[1]->is_type(vm->_tp_slice)){
_Slice s = vm->PySlice_AS_C(args[1]); _Slice s = vm->PySlice_AS_C(args[1]);
s.normalize(_self.size()); s.normalize(_self.size());
PyVarList _new_list; PyVarList _new_list;
for(size_t i = s.start; i < s.stop; i++) for(size_t i = s.start; i < s.stop; i++) _new_list.push_back(_self[i]);
_new_list.push_back(_self[i]); return list ? vm->PyList(_new_list) : vm->PyTuple(_new_list);
return vm->PyList(_new_list);
} }
int _index = (int)vm->PyInt_AS_C(args[1]); int _index = (int)vm->PyInt_AS_C(args[1]);
@ -469,13 +469,6 @@ void __initializeBuiltinFunctions(VM* _vm) {
return vm->PyInt(_self.size()); return vm->PyInt(_self.size());
}); });
_vm->bindMethod<1>("tuple", "__getitem__", [](VM* vm, const pkpy::ArgList& args) {
const PyVarList& _self = vm->PyTuple_AS_C(args[0]);
int _index = (int)vm->PyInt_AS_C(args[1]);
_index = vm->normalized_index(_index, _self.size());
return _self[_index];
});
/************ PyBool ************/ /************ PyBool ************/
_vm->bindStaticMethod<1>("bool", "__new__", CPP_LAMBDA(vm->asBool(args[0]))); _vm->bindStaticMethod<1>("bool", "__new__", CPP_LAMBDA(vm->asBool(args[0])));

View File

@ -77,6 +77,14 @@ assert l[1:4] == [2,3,4]
assert l[-1:-3] == [] assert l[-1:-3] == []
assert l[-3:-1] == [2,3] assert l[-3:-1] == [2,3]
l = (1,2,3,4)
assert l[2] == 3
assert l[-1] == 4
assert l[:32] == (1,2,3,4)
assert l[32:] == tuple([])
assert l[1:4] == (2,3,4)
assert l[-1:-3] == tuple([])
assert l[-3:-1] == (2,3)
l1 = [1];l2 = l1;l1.append(2);l3 = [1,1,2] l1 = [1];l2 = l1;l1.append(2);l3 = [1,1,2]
assert l2[1] == 2 assert l2[1] == 2