mirror of
https://github.com/erg-lang/erg.git
synced 2025-08-04 18:58:30 +00:00
feat: support Array
, Str
, Bytes
slice
This commit is contained in:
parent
579615d76e
commit
0152e368ab
14 changed files with 170 additions and 19 deletions
|
@ -897,7 +897,7 @@ impl Context {
|
|||
Immutable,
|
||||
Visibility::BUILTIN_PUBLIC,
|
||||
);
|
||||
let str_getitem_t = fn1_kw_met(Str, kw(KW_IDX, Nat), Str);
|
||||
let str_getitem_t = fn1_kw_met(Str, kw(KW_IDX, Nat | poly(RANGE, vec![ty_tp(Int)])), Str);
|
||||
str_.register_builtin_erg_impl(
|
||||
FUNDAMENTAL_GETITEM,
|
||||
str_getitem_t,
|
||||
|
@ -1240,11 +1240,16 @@ impl Context {
|
|||
Predicate::le(var, N.clone() - value(1usize)),
|
||||
);
|
||||
// __getitem__: |T, N|(self: [T; N], _: {I: Nat | I <= N}) -> T
|
||||
let array_getitem_t = fn1_kw_met(
|
||||
// and (self: [T; N], _: Range(Int)) -> [T; _]
|
||||
let array_getitem_t = (fn1_kw_met(
|
||||
array_t(T.clone(), N.clone()),
|
||||
anon(input.clone()),
|
||||
T.clone(),
|
||||
)
|
||||
) & fn1_kw_met(
|
||||
array_t(T.clone(), N.clone()),
|
||||
anon(poly(RANGE, vec![ty_tp(Int)])),
|
||||
unknown_len_array_t(T.clone()),
|
||||
))
|
||||
.quantify();
|
||||
let get_item = ValueObj::Subr(ConstSubr::Builtin(BuiltinConstSubr::new(
|
||||
FUNDAMENTAL_GETITEM,
|
||||
|
@ -1540,6 +1545,29 @@ impl Context {
|
|||
Str,
|
||||
);
|
||||
bytes.register_py_builtin(FUNC_DECODE, decode_t, Some(FUNC_DECODE), 6);
|
||||
let bytes_getitem_t = fn1_kw_met(mono(BYTES), kw(KW_IDX, Nat), Int)
|
||||
& fn1_kw_met(
|
||||
mono(BYTES),
|
||||
kw(KW_IDX, poly(RANGE, vec![ty_tp(Int)])),
|
||||
mono(BYTES),
|
||||
);
|
||||
bytes.register_builtin_erg_impl(
|
||||
FUNDAMENTAL_GETITEM,
|
||||
bytes_getitem_t,
|
||||
Immutable,
|
||||
Visibility::BUILTIN_PUBLIC,
|
||||
);
|
||||
bytes
|
||||
.register_marker_trait(self, poly(INDEXABLE, vec![ty_tp(Nat), ty_tp(Int)]))
|
||||
.unwrap();
|
||||
let mut bytes_eq = Self::builtin_methods(Some(mono(EQ)), 2);
|
||||
bytes_eq.register_builtin_erg_impl(
|
||||
OP_EQ,
|
||||
fn1_met(mono(BYTES), mono(BYTES), Bool),
|
||||
Const,
|
||||
Visibility::BUILTIN_PUBLIC,
|
||||
);
|
||||
bytes.register_trait(mono(BYTES), bytes_eq);
|
||||
/* GenericTuple */
|
||||
let mut generic_tuple = Self::builtin_mono_class(GENERIC_TUPLE, 1);
|
||||
generic_tuple.register_superclass(Obj, &obj);
|
||||
|
|
|
@ -242,7 +242,7 @@ pub(crate) fn structural_func(mut args: ValueArgs, ctx: &Context) -> EvalValueRe
|
|||
pub(crate) fn __array_getitem__(mut args: ValueArgs, ctx: &Context) -> EvalValueResult<ValueObj> {
|
||||
let slf = ctx
|
||||
.convert_value_into_array(args.remove_left_or_key("Self").unwrap())
|
||||
.unwrap();
|
||||
.unwrap_or_else(|err| panic!("{err}, {args}"));
|
||||
let index = enum_unwrap!(args.remove_left_or_key("Index").unwrap(), ValueObj::Nat);
|
||||
if let Some(v) = slf.get(index as usize) {
|
||||
Ok(v.clone())
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue