Add Tuple1~Tuple8

This commit is contained in:
Shunsuke Shibayama 2022-08-29 14:36:14 +09:00
parent bdb084c4ed
commit 6fd61efc76
2 changed files with 233 additions and 4 deletions

View file

@ -623,13 +623,179 @@ impl Context {
vec![trait_("Mutable")],
Self::TOP_LEVEL,
);
// TODO: make Tuple1(A), Tuple2(A, B), ... etc.
let tuple = Self::mono_class(
// TODO: make Tuple6, Tuple7, ... etc.
let tuple_ = Self::mono_class(
"Tuple",
vec![Obj],
vec![poly_trait("Eq", vec![ty_tp(class("Tuple"))])],
Self::TOP_LEVEL,
);
let tuple1 = Self::poly_class(
"Tuple1",
vec![PS::t_nd("A")],
vec![class("Tuple"), Obj],
vec![poly_trait(
"Eq",
vec![ty_tp(poly_class("Tuple1", vec![ty_tp(mono_q("A"))]))],
)],
Self::TOP_LEVEL,
);
let tuple2 = Self::poly_class(
"Tuple2",
vec![PS::t_nd("A"), PS::t_nd("B")],
vec![class("Tuple"), Obj],
vec![poly_trait(
"Eq",
vec![ty_tp(poly_class(
"Tuple2",
vec![ty_tp(mono_q("A")), ty_tp(mono_q("B"))],
))],
)],
Self::TOP_LEVEL,
);
let tuple3 = Self::poly_class(
"Tuple3",
vec![PS::t_nd("A"), PS::t_nd("B"), PS::t_nd("C")],
vec![class("Tuple"), Obj],
vec![poly_trait(
"Eq",
vec![ty_tp(poly_class(
"Tuple3",
vec![ty_tp(mono_q("A")), ty_tp(mono_q("B")), ty_tp(mono_q("C"))],
))],
)],
Self::TOP_LEVEL,
);
let tuple4 = Self::poly_class(
"Tuple4",
vec![PS::t_nd("A"), PS::t_nd("B"), PS::t_nd("C"), PS::t_nd("D")],
vec![class("Tuple"), Obj],
vec![poly_trait(
"Eq",
vec![ty_tp(poly_class(
"Tuple4",
vec![
ty_tp(mono_q("A")),
ty_tp(mono_q("B")),
ty_tp(mono_q("C")),
ty_tp(mono_q("D")),
],
))],
)],
Self::TOP_LEVEL,
);
let tuple5 = Self::poly_class(
"Tuple5",
vec![
PS::t_nd("A"),
PS::t_nd("B"),
PS::t_nd("C"),
PS::t_nd("D"),
PS::t_nd("E"),
],
vec![class("Tuple"), Obj],
vec![poly_trait(
"Eq",
vec![ty_tp(poly_class(
"Tuple5",
vec![
ty_tp(mono_q("A")),
ty_tp(mono_q("B")),
ty_tp(mono_q("C")),
ty_tp(mono_q("D")),
ty_tp(mono_q("E")),
],
))],
)],
Self::TOP_LEVEL,
);
let tuple6 = Self::poly_class(
"Tuple6",
vec![
PS::t_nd("A"),
PS::t_nd("B"),
PS::t_nd("C"),
PS::t_nd("D"),
PS::t_nd("E"),
PS::t_nd("F"),
],
vec![class("Tuple"), Obj],
vec![poly_trait(
"Eq",
vec![ty_tp(poly_class(
"Tuple6",
vec![
ty_tp(mono_q("A")),
ty_tp(mono_q("B")),
ty_tp(mono_q("C")),
ty_tp(mono_q("D")),
ty_tp(mono_q("E")),
ty_tp(mono_q("F")),
],
))],
)],
Self::TOP_LEVEL,
);
let tuple7 = Self::poly_class(
"Tuple7",
vec![
PS::t_nd("A"),
PS::t_nd("B"),
PS::t_nd("C"),
PS::t_nd("D"),
PS::t_nd("E"),
PS::t_nd("F"),
PS::t_nd("G"),
],
vec![class("Tuple"), Obj],
vec![poly_trait(
"Eq",
vec![ty_tp(poly_class(
"Tuple7",
vec![
ty_tp(mono_q("A")),
ty_tp(mono_q("B")),
ty_tp(mono_q("C")),
ty_tp(mono_q("D")),
ty_tp(mono_q("E")),
ty_tp(mono_q("F")),
ty_tp(mono_q("G")),
],
))],
)],
Self::TOP_LEVEL,
);
let tuple8 = Self::poly_class(
"Tuple8",
vec![
PS::t_nd("A"),
PS::t_nd("B"),
PS::t_nd("C"),
PS::t_nd("D"),
PS::t_nd("E"),
PS::t_nd("F"),
PS::t_nd("G"),
PS::t_nd("H"),
],
vec![class("Tuple"), Obj],
vec![poly_trait(
"Eq",
vec![ty_tp(poly_class(
"Tuple8",
vec![
ty_tp(mono_q("A")),
ty_tp(mono_q("B")),
ty_tp(mono_q("C")),
ty_tp(mono_q("D")),
ty_tp(mono_q("E")),
ty_tp(mono_q("F")),
ty_tp(mono_q("G")),
ty_tp(mono_q("H")),
],
))],
)],
Self::TOP_LEVEL,
);
int_mut.register_const("ImmutType", ValueObj::t(Int));
let f_t = param_t("f", func(vec![param_t("old", Int)], vec![], Int));
let t = pr_met(class("Int!"), None, vec![f_t], vec![], NoneType);
@ -766,6 +932,68 @@ impl Context {
self.register_type(Type, type_, Const);
self.register_type(Module, module, Const);
self.register_type(array_t, array_, Const);
self.register_type(tuple(vec![mono_q("A")]), tuple1, Const);
self.register_type(tuple(vec![mono_q("A"), mono_q("B")]), tuple2, Const);
self.register_type(
tuple(vec![mono_q("A"), mono_q("B"), mono_q("C")]),
tuple3,
Const,
);
self.register_type(
tuple(vec![mono_q("A"), mono_q("B"), mono_q("C"), mono_q("D")]),
tuple4,
Const,
);
self.register_type(
tuple(vec![
mono_q("A"),
mono_q("B"),
mono_q("C"),
mono_q("D"),
mono_q("E"),
]),
tuple5,
Const,
);
self.register_type(
tuple(vec![
mono_q("A"),
mono_q("B"),
mono_q("C"),
mono_q("D"),
mono_q("E"),
mono_q("F"),
]),
tuple6,
Const,
);
self.register_type(
tuple(vec![
mono_q("A"),
mono_q("B"),
mono_q("C"),
mono_q("D"),
mono_q("E"),
mono_q("F"),
mono_q("G"),
]),
tuple7,
Const,
);
self.register_type(
tuple(vec![
mono_q("A"),
mono_q("B"),
mono_q("C"),
mono_q("D"),
mono_q("E"),
mono_q("F"),
mono_q("G"),
mono_q("H"),
]),
tuple8,
Const,
);
self.register_type(class("Int!"), int_mut, Const);
self.register_type(class("Nat!"), nat_mut, Const);
self.register_type(class("Float!"), float_mut, Const);
@ -774,7 +1002,7 @@ impl Context {
self.register_type(class("Str!"), str_mut, Const);
self.register_type(array_mut_t, array_mut, Const);
self.register_type(range_t, range, Const);
self.register_type(class("Tuple"), tuple, Const);
self.register_type(class("Tuple"), tuple_, Const);
self.register_type(class("Function"), func, Const);
self.register_type(class("QuantifiedFunction"), qfunc, Const);
}