mirror of
https://github.com/erg-lang/erg.git
synced 2025-09-30 12:51:10 +00:00
Implement Array/SetWithLength
This commit is contained in:
parent
87bfe836ec
commit
e02def52ab
5 changed files with 55 additions and 7 deletions
|
@ -1700,6 +1700,15 @@ impl CodeGenerator {
|
||||||
self.stack_dec_n(len - 1);
|
self.stack_dec_n(len - 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Array::WithLength(arr) => {
|
||||||
|
self.emit_expr(*arr.elem);
|
||||||
|
self.write_instr(BUILD_LIST);
|
||||||
|
self.write_arg(1u8);
|
||||||
|
self.emit_expr(*arr.len);
|
||||||
|
self.write_instr(BINARY_MULTIPLY);
|
||||||
|
self.write_arg(0);
|
||||||
|
self.stack_dec();
|
||||||
|
}
|
||||||
other => todo!("{other}"),
|
other => todo!("{other}"),
|
||||||
},
|
},
|
||||||
// TODO: tuple comprehension
|
// TODO: tuple comprehension
|
||||||
|
@ -1733,7 +1742,11 @@ impl CodeGenerator {
|
||||||
self.stack_dec_n(len - 1);
|
self.stack_dec_n(len - 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
crate::hir::Set::WithLength(_) => todo!(),
|
crate::hir::Set::WithLength(st) => {
|
||||||
|
self.emit_expr(*st.elem);
|
||||||
|
self.write_instr(BUILD_SET);
|
||||||
|
self.write_arg(1u8);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
Expr::Record(rec) => self.emit_record(rec),
|
Expr::Record(rec) => self.emit_record(rec),
|
||||||
Expr::Code(code) => {
|
Expr::Code(code) => {
|
||||||
|
|
|
@ -671,6 +671,13 @@ impl Context {
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
hir::Array::WithLength(arr) => {
|
||||||
|
let loc = arr.loc();
|
||||||
|
arr.t = self.deref_tyvar(mem::take(&mut arr.t), Covariant, loc)?;
|
||||||
|
self.resolve_expr_t(&mut arr.elem)?;
|
||||||
|
self.resolve_expr_t(&mut arr.len)?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
_ => todo!(),
|
_ => todo!(),
|
||||||
},
|
},
|
||||||
hir::Expr::Tuple(tuple) => match tuple {
|
hir::Expr::Tuple(tuple) => match tuple {
|
||||||
|
@ -683,12 +690,20 @@ impl Context {
|
||||||
},
|
},
|
||||||
hir::Expr::Set(set) => match set {
|
hir::Expr::Set(set) => match set {
|
||||||
hir::Set::Normal(st) => {
|
hir::Set::Normal(st) => {
|
||||||
|
let loc = st.loc();
|
||||||
|
st.t = self.deref_tyvar(mem::take(&mut st.t), Covariant, loc)?;
|
||||||
for elem in st.elems.pos_args.iter_mut() {
|
for elem in st.elems.pos_args.iter_mut() {
|
||||||
self.resolve_expr_t(&mut elem.expr)?;
|
self.resolve_expr_t(&mut elem.expr)?;
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
hir::Set::WithLength(_) => todo!(),
|
hir::Set::WithLength(st) => {
|
||||||
|
let loc = st.loc();
|
||||||
|
st.t = self.deref_tyvar(mem::take(&mut st.t), Covariant, loc)?;
|
||||||
|
self.resolve_expr_t(&mut st.elem)?;
|
||||||
|
self.resolve_expr_t(&mut st.len)?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
},
|
},
|
||||||
hir::Expr::Dict(_dict) => {
|
hir::Expr::Dict(_dict) => {
|
||||||
todo!()
|
todo!()
|
||||||
|
|
|
@ -59,6 +59,10 @@ impl<'a> Linker<'a> {
|
||||||
self.replace_import(&mut elem.expr);
|
self.replace_import(&mut elem.expr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Array::WithLength(arr) => {
|
||||||
|
self.replace_import(&mut arr.elem);
|
||||||
|
self.replace_import(&mut arr.len);
|
||||||
|
}
|
||||||
_ => todo!(),
|
_ => todo!(),
|
||||||
},
|
},
|
||||||
Expr::Tuple(tuple) => match tuple {
|
Expr::Tuple(tuple) => match tuple {
|
||||||
|
@ -74,9 +78,11 @@ impl<'a> Linker<'a> {
|
||||||
self.replace_import(&mut elem.expr);
|
self.replace_import(&mut elem.expr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Set::WithLength(_) => todo!(),
|
Set::WithLength(st) => {
|
||||||
|
self.replace_import(&mut st.elem);
|
||||||
|
self.replace_import(&mut st.len);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
Expr::Dict(_dict) => {
|
Expr::Dict(_dict) => {
|
||||||
todo!()
|
todo!()
|
||||||
}
|
}
|
||||||
|
|
|
@ -156,6 +156,10 @@ impl OwnershipChecker {
|
||||||
self.check_expr(&a.expr, ownership, false);
|
self.check_expr(&a.expr, ownership, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Array::WithLength(arr) => {
|
||||||
|
self.check_expr(&arr.elem, ownership, false);
|
||||||
|
self.check_expr(&arr.len, ownership, false);
|
||||||
|
}
|
||||||
_ => todo!(),
|
_ => todo!(),
|
||||||
},
|
},
|
||||||
Expr::Tuple(tuple) => match tuple {
|
Expr::Tuple(tuple) => match tuple {
|
||||||
|
@ -182,12 +186,15 @@ impl OwnershipChecker {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Expr::Set(set) => match set {
|
Expr::Set(set) => match set {
|
||||||
hir::Set::Normal(set) => {
|
hir::Set::Normal(st) => {
|
||||||
for a in set.elems.pos_args.iter() {
|
for a in st.elems.pos_args.iter() {
|
||||||
self.check_expr(&a.expr, ownership, false);
|
self.check_expr(&a.expr, ownership, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
hir::Set::WithLength(_) => todo!(),
|
hir::Set::WithLength(st) => {
|
||||||
|
self.check_expr(&st.elem, ownership, false);
|
||||||
|
self.check_expr(&st.len, ownership, false);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
// TODO: capturing
|
// TODO: capturing
|
||||||
Expr::Lambda(lambda) => {
|
Expr::Lambda(lambda) => {
|
||||||
|
|
|
@ -4,5 +4,12 @@ def in_operator(x, y):
|
||||||
return True
|
return True
|
||||||
# TODO: trait check
|
# TODO: trait check
|
||||||
return False
|
return False
|
||||||
|
elif type(y) == list or type(y) == set:
|
||||||
|
# FIXME:
|
||||||
|
type_check = in_operator(x[0], y[0])
|
||||||
|
len_check = len(x) == len(y)
|
||||||
|
return type_check and len_check
|
||||||
|
elif type(y) == dict:
|
||||||
|
NotImplemented
|
||||||
else:
|
else:
|
||||||
return x in y
|
return x in y
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue