erg/examples/class.er
2024-02-08 02:42:49 +09:00

54 lines
1.3 KiB
Python

Empty = Class()
empty = Empty.new()
print! empty
# Inheritance is prohibited by default. Remove this decorator and check for errors.
@Inheritable
Point2D = Class {::[<: Self]x = Int; ::[<: Self]y = Int}
Point2D::
one = 1
Point2D.
zero = Point2D::one - 1
'''erg
p = Point2D.new {x = 1; y = 2}
assert p.norm() == 5
'''
norm self = self::x**2 + self::y**2
Point3D = Inherit Point2D, Additional := {z = Int}
Point3D.
# Overloading is prohibited by default. Remove this decorator and check for errors.
@Override
new x, y, z =
Point3D {x; y; z}
@Override
norm self = self::x**2 + self::y**2 + self::z**2
# `Point2D::__new__` is private, use `Point2D.new` instead
p = Point2D.new {x = 1; y = 2}
print! p, p.norm()
print! Point2D.zero
# print! Point2D::one # cannot access private variables
q = Point3D.new 1, 2, 3
print! q, q.norm()
# Newtype notation
# Shorthand of `IorS = Class {base = Int or Str}`
IorS = Class(Int or Str)
IorS.
is_int self =
# self: IorS
# self::base: Int or Str
match self::base:
(_: Int) -> True
_ -> False
is_str self =
match self::base:
(_: Str) -> True
_ -> False
# `.new` is of type `Int or Str -> IorS`, not `{base = Int or Str} -> IorS`
x = IorS.new 1
print! x
assert x.is_int()
assert not x.is_str()