erg/crates/erg_compiler/lib/std/_prelude.er
2023-01-15 12:03:19 +09:00

92 lines
2.2 KiB
Python

@Attach NeImpl
Eq(R := Self) = Trait {
.`==` = (self: Self, R) -> Bool
}
NeImpl R = Patch Eq R
NeImpl(R).
`!=`(self, other: R): Bool = not(self == other)
@Attach EqImpl, LeImpl, LtImpl, GeImpl, GtImpl
PartialOrd(R := Self) = Trait {
.cmp = (self: Self, R) -> Option Ordering
}
Ord = Subsume PartialOrd()
EqForOrd R = Patch Ord
EqForOrd(R)|<: Eq()|.
`==`(self, other: R): Bool = self.cmp(other) == Ordering.Equal
LeForOrd = Patch Ord
LeForOrd.
`<=`(self, other: Self): Bool = self.cmp(other) == Ordering.Less or self == other
LtForOrd = Patch Ord
LtForOrd.
`<`(self, other: Self): Bool = self.cmp(other) == Ordering.Less
GeForOrd = Patch Ord
GeForOrd.
`>=`(self, other: Self): Bool = self.cmp(other) == Ordering.Greater or self == other
GtForOrd = Patch Ord
GtForOrd.
`>`(self, other: Self): Bool = self.cmp(other) == Ordering.Greater
Add(R := Self) = Trait {
.Output = Type
.`_+_` = (self: Self, R) -> Self.Output
}
Sub(R := Self) = Trait {
.Output = Type
.`-` = (self: Self, R) -> Self.Output
}
Mul(R := Self) = Trait {
.Output = Type
.`*` = (self: Self, R) -> Self.Output
}
Div(R := Self) = Trait {
.Output = Type
.`/` = (self: Self, R) -> Self.Output or Panic
}
Num = Add and Sub and Mul
Seq T = Trait {
.__len__ = (self: Ref(Self)) -> Nat
.get = (self: Ref(Self), Nat) -> T
}
AddForInt = Patch Int
AddForInt|<: Add(Int)|.
AddO = Int
`_+_`(self: Self, other: Int): Int = magic("Add.`_+_`")
# TODO: Mul and Div
NumForInterval M, N, O, P: Int = Patch M..N
NumForInterval(M, N, O, P)|<: Add(O..P)|.
Output = M+O..N+P
__add__(self: Self, other: O..P) = magic("NumForInterval.`_+_`")
NumForInterval(M, N, O, P)|<: Sub(O..P)|.
Output = M-P..N-O
__sub__(self: Self, other: O..P) = magic("NumForInterval.`_-_`")
Read = Trait {
.read = (self: Ref(Self),) -> Str
}
Read! = Trait {
.read! = (self: Ref!(Self),) => Str
}
Write! = Trait {
.write! = (self: Ref!(Self), Str) => ()
}
discard _x = None
discard 1
# if: |T, U|(Bool, T, U) -> T or U
cond|T: Type|(c: Bool, then: T, else: T): T =
if c:
do then
do else
assert cond(False, 1, 2) == 2
# assert cond(True, 1, 3) == "a"
# assert "a" == cond(True, 1, 3)