feat: add Array.update_nth!

This commit is contained in:
Shunsuke Shibayama 2023-08-28 15:33:58 +09:00
parent 07e37c878c
commit 74bca70017
7 changed files with 87 additions and 15 deletions

View file

@ -2423,7 +2423,7 @@ impl Context {
NoneType,
)
.quantify();
array_mut_.register_py_builtin(PROC_PUSH, t, Some(FUNC_APPEND), 14);
array_mut_.register_py_builtin(PROC_PUSH, t, Some(FUNC_APPEND), 15);
let t_extend = pr_met(
ref_mut(
array_mut_t.clone(),
@ -2438,7 +2438,7 @@ impl Context {
NoneType,
)
.quantify();
array_mut_.register_py_builtin(PROC_EXTEND, t_extend, Some(FUNC_EXTEND), 23);
array_mut_.register_py_builtin(PROC_EXTEND, t_extend, Some(FUNC_EXTEND), 24);
let t_insert = pr_met(
ref_mut(
array_mut_t.clone(),
@ -2453,7 +2453,7 @@ impl Context {
NoneType,
)
.quantify();
array_mut_.register_py_builtin(PROC_INSERT, t_insert, Some(FUNC_INSERT), 32);
array_mut_.register_py_builtin(PROC_INSERT, t_insert, Some(FUNC_INSERT), 33);
let t_remove = pr_met(
ref_mut(
array_mut_t.clone(),
@ -2468,7 +2468,7 @@ impl Context {
NoneType,
)
.quantify();
array_mut_.register_py_builtin(PROC_REMOVE, t_remove, Some(FUNC_REMOVE), 41);
array_mut_.register_py_builtin(PROC_REMOVE, t_remove, Some(FUNC_REMOVE), 42);
let t_pop = pr_met(
ref_mut(
array_mut_t.clone(),
@ -2483,7 +2483,7 @@ impl Context {
T.clone(),
)
.quantify();
array_mut_.register_py_builtin(PROC_POP, t_pop, Some(FUNC_POP), 51);
array_mut_.register_py_builtin(PROC_POP, t_pop, Some(FUNC_POP), 52);
let t_clear = pr0_met(
ref_mut(
array_mut_t.clone(),
@ -2492,7 +2492,7 @@ impl Context {
NoneType,
)
.quantify();
array_mut_.register_py_builtin(PROC_CLEAR, t_clear, Some(FUNC_CLEAR), 60);
array_mut_.register_py_builtin(PROC_CLEAR, t_clear, Some(FUNC_CLEAR), 61);
let t_sort = pr_met(
ref_mut(array_mut_t.clone(), None),
vec![],
@ -2504,9 +2504,9 @@ impl Context {
NoneType,
)
.quantify();
array_mut_.register_py_builtin(PROC_SORT, t_sort, Some(FUNC_SORT), 77);
array_mut_.register_py_builtin(PROC_SORT, t_sort, Some(FUNC_SORT), 78);
let t_reverse = pr0_met(ref_mut(array_mut_t.clone(), None), NoneType).quantify();
array_mut_.register_py_builtin(PROC_REVERSE, t_reverse, Some(FUNC_REVERSE), 86);
array_mut_.register_py_builtin(PROC_REVERSE, t_reverse, Some(FUNC_REVERSE), 87);
let t = pr_met(
array_mut_t.clone(),
vec![kw(KW_FUNC, nd_func(vec![anon(T.clone())], None, T.clone()))],
@ -2515,7 +2515,16 @@ impl Context {
NoneType,
)
.quantify();
array_mut_.register_py_builtin(PROC_STRICT_MAP, t, None, 95);
array_mut_.register_py_builtin(PROC_STRICT_MAP, t, None, 96);
let t_update_nth = pr_met(
ref_mut(array_mut_t.clone(), None),
vec![kw(KW_IDX, Nat), kw(KW_FUNC, func1(T.clone(), T.clone()))],
None,
vec![],
NoneType,
)
.quantify();
array_mut_.register_py_builtin(PROC_UPDATE_NTH, t_update_nth, Some(FUNC_UPDATE_NTH), 105);
let f_t = kw(
KW_FUNC,
func(vec![kw(KW_OLD, arr_t.clone())], None, vec![], arr_t.clone()),

View file

@ -228,6 +228,8 @@ const PY_MODULE: &str = "PyModule";
const GENERIC_ARRAY: &str = "GenericArray";
const ARRAY: &str = "Array";
const MUT_ARRAY: &str = "Array!";
const FUNC_UPDATE_NTH: &str = "update_nth";
const PROC_UPDATE_NTH: &str = "update_nth!";
const FUNC_PARTITION: &str = "partition";
const FUNC_DEDUP: &str = "dedup";
const FUNC_CONCAT: &str = "concat";
@ -427,6 +429,8 @@ const FUNDAMENTAL_LEN: &str = "__len__";
const FUNDAMENTAL_CONTAINS: &str = "__contains__";
const FUNDAMENTAL_CALL: &str = "__call__";
const FUNDAMENTAL_NAME: &str = "__name__";
const FUNDAMENTAL_FILE: &str = "__file__";
const FUNDAMENTAL_PACKAGE: &str = "__package__";
const FUNDAMENTAL_STR: &str = "__str__";
const FUNDAMENTAL_HASH: &str = "__hash__";
const FUNDAMENTAL_INT: &str = "__int__";
@ -1075,6 +1079,20 @@ impl Context {
vis.clone(),
Some(FUNDAMENTAL_NAME),
);
self.register_builtin_py_impl(
FUNDAMENTAL_FILE,
Str,
Immutable,
vis.clone(),
Some(FUNDAMENTAL_FILE),
);
self.register_builtin_py_impl(
FUNDAMENTAL_PACKAGE,
Str | NoneType,
Immutable,
vis.clone(),
Some(FUNDAMENTAL_PACKAGE),
);
if ERG_MODE {
self.register_builtin_py_impl(
FUNC_MODULE,

View file

@ -94,3 +94,12 @@ array = pyimport "Array"
assert arr == [3, 4]
'''
strict_map!: |T, N: Nat|(self: Array!(T, N), f: T -> T) => NoneType
'''
Update `index`-th element of the array according to the passed function `f`.
'''
'''erg
arr = ![1, 2]
arr.udpate_nth! 0, x -> x + 1
assert arr == [2, 2]
'''
update_nth!: |T, N: Nat|(self: Array!(T, N), index: Nat, f: T -> T) => NoneType

View file

@ -69,3 +69,6 @@ class Array(list):
if not contains_operator(elem_t, elem):
return False
return True
def update_nth(self, index, f):
self[index] = f(self[index])