lys-lang / lys

⚜︎ A language that compiles to WebAssembly
https://lys-lang.dev
Apache License 2.0
420 stars 8 forks source link

[WIP] feat: traits, initial implementation #46

Closed menduz closed 4 years ago

menduz commented 5 years ago

Traits

Traits are an approach to polymorphism. Functions are defined in the trait and then a type can implement the trait.

In traits, functions may or may not have a function body. If the body is absent, then it will be required in the type's implementation of the trait. If the body is present in the trait, the whole implementation of the function can be skipped.

Inside the trait's scope there is a declared type called Self. It acts as a type parameter for the type used in the implementation of the trait.

trait Printable {
  fun toString(self: Self): string
}
impl Printable for i32 {
  #[method]
  fun toString(self: Self): string = ???
  //                 ^^^^ Here "Self" is literally "i32"
}

Implementation strategy

First implementation

The immediate of objective of this first implementation is to correctly implement some functions like fun is(self: ref): boolean and also to annotate types with "tag traits" for reference types. That will be used by the compiler to detect and inject reference counting in references.

Future