Let’s demystify the frequently used use keyword in Elixir.
We can use the use keyword in Elixir to package behaviour and implementation for use in other modules, similar to abstract base classes or mixins in other languages. Mixins reduce the amount of boilerplate in your modules, especially for library authors.
Mixins in Elixir are similar on the surface to Concerns in Ruby and Traits in Scala. Before we start, you should be somewhat familiar with behaviours and macros.
An Elixir program can be represented by its own data structures as an abstract syntax tree (AST) of tuples with three elements. For example, the function call run(1, 2, 3) is represented internally as:
Macros in Elixir lets you perform syntactic extensions, which are expanded to before a program executes. We use macros to transform our internal program structure by treating code as data, and thus metaprogram.
Many of Elixir’s language features such as if and def are in fact macros, which are translated away into lower-level abstractions during compilation. Armed with the same tools that José utilized to write Elixir’s standard libraries, you can extend Elixir to suit your needs using macros.
While Elixir is dynamically typed, we can supply optional typespecs to make sure
our programs are type-safe.
Preventing type errors ensures that there’s no discrepancy between differing types of our program’s constants,
variables, and functions. Typespecs are also useful as documentation.
If you’ve used type systems in OCaml or F#, Elixir’s type system should feel familiar to you.