mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-20 11:30:18 +00:00
add unpack builder
This commit is contained in:
parent
636dbdd64a
commit
754808412b
@ -343,13 +343,21 @@ class Compiler {
|
|||||||
match_newlines_repl();
|
match_newlines_repl();
|
||||||
if (curr().type == TK("}")) break;
|
if (curr().type == TK("}")) break;
|
||||||
EXPR();
|
EXPR();
|
||||||
if(curr().type == TK(":")) parsing_dict = true;
|
int star_level = ctx()->s_expr.top()->star_level();
|
||||||
|
if(star_level==2 || curr().type == TK(":")){
|
||||||
|
parsing_dict = true;
|
||||||
|
}
|
||||||
if(parsing_dict){
|
if(parsing_dict){
|
||||||
consume(TK(":"));
|
|
||||||
EXPR();
|
|
||||||
auto dict_item = make_expr<DictItemExpr>();
|
auto dict_item = make_expr<DictItemExpr>();
|
||||||
dict_item->key = ctx()->s_expr.popx();
|
if(star_level == 2){
|
||||||
dict_item->value = ctx()->s_expr.popx();
|
dict_item->key = nullptr;
|
||||||
|
dict_item->value = ctx()->s_expr.popx();
|
||||||
|
}else{
|
||||||
|
consume(TK(":"));
|
||||||
|
EXPR();
|
||||||
|
dict_item->key = ctx()->s_expr.popx();
|
||||||
|
dict_item->value = ctx()->s_expr.popx();
|
||||||
|
}
|
||||||
items.push_back(std::move(dict_item));
|
items.push_back(std::move(dict_item));
|
||||||
}else{
|
}else{
|
||||||
items.push_back(ctx()->s_expr.popx());
|
items.push_back(ctx()->s_expr.popx());
|
||||||
|
@ -366,7 +366,7 @@ struct SliceExpr: Expr{
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct DictItemExpr: Expr{
|
struct DictItemExpr: Expr{
|
||||||
Expr_ key;
|
Expr_ key; // maybe nullptr if it is **kwargs
|
||||||
Expr_ value;
|
Expr_ value;
|
||||||
std::string str() const override { return "DictItem()"; }
|
std::string str() const override { return "DictItem()"; }
|
||||||
|
|
||||||
@ -374,6 +374,7 @@ struct DictItemExpr: Expr{
|
|||||||
|
|
||||||
void emit(CodeEmitContext* ctx) override {
|
void emit(CodeEmitContext* ctx) override {
|
||||||
if(is_starred()){
|
if(is_starred()){
|
||||||
|
PK_ASSERT(key == nullptr);
|
||||||
value->emit(ctx);
|
value->emit(ctx);
|
||||||
}else{
|
}else{
|
||||||
value->emit(ctx);
|
value->emit(ctx);
|
||||||
|
@ -75,3 +75,12 @@ assert a == [8, 2, 4, 2, 9]
|
|||||||
b = [(1, 2), (3, 3), (5, 1)]
|
b = [(1, 2), (3, 3), (5, 1)]
|
||||||
b.sort(key=lambda x:x[1])
|
b.sort(key=lambda x:x[1])
|
||||||
assert b == [(5, 1), (1, 2), (3,3)]
|
assert b == [(5, 1), (1, 2), (3,3)]
|
||||||
|
|
||||||
|
# unpack expression
|
||||||
|
a = [1, 2, 3]
|
||||||
|
b = [*a, 4, 5]
|
||||||
|
assert b == [1, 2, 3, 4, 5]
|
||||||
|
|
||||||
|
a = []
|
||||||
|
b = [*a, 1, 2, 3, *a, *a]
|
||||||
|
assert b == [1, 2, 3]
|
@ -6,3 +6,12 @@ a,b = b,a
|
|||||||
assert a == 2
|
assert a == 2
|
||||||
assert b == 1
|
assert b == 1
|
||||||
assert len(tup) == 6
|
assert len(tup) == 6
|
||||||
|
|
||||||
|
# unpack expression
|
||||||
|
a = 1, 2, 3
|
||||||
|
b = *a, 4, 5
|
||||||
|
assert b == (1, 2, 3, 4, 5)
|
||||||
|
|
||||||
|
a = tuple([])
|
||||||
|
b = *a, 1, 2, 3, *a, *a
|
||||||
|
assert b == (1, 2, 3)
|
@ -53,3 +53,17 @@ assert a.pop(1) == 2
|
|||||||
assert a == {3: 4}
|
assert a == {3: 4}
|
||||||
assert a.pop(3) == 4
|
assert a.pop(3) == 4
|
||||||
assert a == {}
|
assert a == {}
|
||||||
|
|
||||||
|
# unpack expression
|
||||||
|
a = {1:2, 3:4}
|
||||||
|
b = {**a, 5:6, **a}
|
||||||
|
assert b == {1: 2, 3: 4, 5: 6}
|
||||||
|
|
||||||
|
a = {}
|
||||||
|
b = {**a, 1:2, 3:4}
|
||||||
|
assert b == {1: 2, 3: 4}
|
||||||
|
|
||||||
|
a = {1:2, 3:4, 7:8}
|
||||||
|
b = {**a, 1:5, 3:6}
|
||||||
|
c = {**a, **b}
|
||||||
|
assert c == {1: 5, 3: 6, 7: 8}
|
@ -77,3 +77,12 @@ assert {1,2}.issubset({1,2,3})
|
|||||||
assert {1,2,3}.issuperset({1,2})
|
assert {1,2,3}.issuperset({1,2})
|
||||||
assert {1,2,3}.isdisjoint({4,5,6})
|
assert {1,2,3}.isdisjoint({4,5,6})
|
||||||
assert not {1,2,3}.isdisjoint({2,3,4})
|
assert not {1,2,3}.isdisjoint({2,3,4})
|
||||||
|
|
||||||
|
# unpack expression
|
||||||
|
a = {1, 2, 3}
|
||||||
|
b = {*a, 4, 5, *a, *a}
|
||||||
|
assert b == {1, 2, 3, 4, 5}
|
||||||
|
|
||||||
|
a = set()
|
||||||
|
b = {*a, 1, 2, 3, *a, *a}
|
||||||
|
assert b == {1, 2, 3}
|
Loading…
x
Reference in New Issue
Block a user