mirror of
https://github.com/erg-lang/erg.git
synced 2025-09-27 19:59:07 +00:00
92 lines
2.2 KiB
Python
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)
|