Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[WIP] feat: traits, initial implementation #46

Merged
merged 5 commits into from
Dec 16, 2019
Merged

[WIP] feat: traits, initial implementation #46

merged 5 commits into from
Dec 16, 2019

Conversation

menduz
Copy link
Member

@menduz menduz commented Jul 12, 2019

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.

  • Traits are only used to ensure interfaces in the implemented types.
  • No default implementations are allowed, every trait implementation must be verbose.
  • No decorations are allowed in the trait's declaration.

Future

  • Make compiler aware of Reference trait to perform automatic reference counting.
  • Traits with default implementations.
  • Annotations in trait functions.
  • Traits as type references, it will require dynamic dispatch.
  • ref is SomeTrait

@menduz menduz marked this pull request as ready for review December 10, 2019 16:09
@menduz menduz changed the title feat: traits, initial implementation [WIP] feat: traits, initial implementation Dec 10, 2019
@menduz menduz merged commit c419e44 into master Dec 16, 2019
@menduz menduz deleted the feat/traits branch December 16, 2019 03:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant