christopheradams/elixir_style_guide
{ "createdAt": "2013-09-24T09:35:30Z", "defaultBranch": "master", "description": "A community driven style guide for Elixir", "fullName": "christopheradams/elixir_style_guide", "homepage": null, "language": "Elixir", "name": "elixir_style_guide", "pushedAt": "2024-05-10T03:55:51Z", "stargazersCount": 4417, "topics": [ "elixir", "elixir-lang", "style-guide", "styleguide" ], "updatedAt": "2025-11-25T10:32:23Z", "url": "https://github.com/christopheradams/elixir_style_guide"}[The Elixir Style Guide][Elixir Style Guide]
Section titled “[The Elixir Style Guide][Elixir Style Guide]”Table of Contents
Section titled “Table of Contents”- [Prelude]!(#prelude)
- [About]!(#about)
- [Formatting]!(#formatting)
- [Whitespace]!(#whitespace)
- [Indentation]!(#indentation)
- [Parentheses]!(#parentheses)
- [The Guide]!(#the-guide)
- [Expressions]!(#expressions)
- [Naming]!(#naming)
- [Comments]!(#comments)
- [Comment Annotations]!(#comment-annotations)
- [Modules]!(#modules)
- [Documentation]!(#documentation)
- [Typespecs]!(#typespecs)
- [Structs]!(#structs)
- [Exceptions]!(#exceptions)
- [Collections]!(#collections)
- [Strings]!(#strings)
- Regular Expressions
- [Metaprogramming]!(#metaprogramming)
- [Testing]!(#testing)
- [Resources]!(#resources)
- [Alternative Style Guides]!(#alternative-style-guides)
- [Tools]!(#tools)
- [Getting Involved]!(#getting-involved)
- [Contributing]!(#contributing)
- [Spread the Word]!(#spread-the-word)
- [Copying]!(#copying)
- [License]!(#license)
- [Attribution]!(#attribution)
Prelude
Section titled “Prelude”Liquid architecture. It’s like jazz — you improvise, you work together, you play off each other, you make something, they make something.
—Frank Gehry
Style matters. [Elixir] has plenty of style but like all languages it can be stifled. Don’t stifle the style.
This is community style guide for the [Elixir programming language][Elixir]. Please feel free to make pull requests and suggestions, and be a part of Elixir’s vibrant community.
If you’re looking for other projects to contribute to please see the [Hex package manager site][Hex].
Translations of the guide are available in the following languages:
- [Chinese Simplified]
- [Chinese Traditional]
- [French]
- [Japanese]
- [Korean]
- [Portuguese]
- [Russian]
- [Spanish]
- [Thai]
Formatting
Section titled “Formatting”Elixir v1.6 introduced a [Code Formatter] and [Mix format] task. The formatter should be preferred for all new projects and source code.
The rules in this section are applied automatically by the code formatter, but are provided here as examples of the preferred style.
Whitespace
Section titled “Whitespace”-
Use Unix-style line endings (*BSD/Solaris/Linux/OSX users are covered by default, Windows users have to be extra careful). [[link]!(#line-endings)]
-
If you’re using Git you might want to add the following configuration setting to protect your project from Windows line endings creeping in: [[link]!(#autocrlf)]
Terminal window git config --global core.autocrlf true -
Limit lines to 98 characters. Otherwise, set the
:line_lengthoption in your.formatter.exsfile. [[link]!(#line-length)] -
Use spaces around operators, after commas, colons and semicolons. Do not put spaces around matched pairs like brackets, parentheses, etc. Whitespace might be (mostly) irrelevant to the Elixir runtime, but its proper use is the key to writing easily readable code. [[link]!(#spaces)]
sum = 1 + 2{a, b} = {2, 3}[first | rest] = [1, 2, 3]Enum.map(["one", <<"two">>, "three"], fn num -> IO.puts(num) end) -
Do not use spaces after non-word operators that only take one argument; or around the range operator. [[link]!(#no-spaces)]
0 - 1 == -1^pinned = some_func()5 in 1..10 -
Use blank lines between
defs to break up a function into logical paragraphs. [[link]!(#def-spacing)]def some_function(some_data) dosome_data |> other_function() |> List.first()enddef some_function doresultenddef some_other_function doanother_resultenddef a_longer_function doonetwothreefourend -
Don’t put a blank line after
defmodule. [[link]!(#defmodule-spacing)] -
If the function head and
do:clause are too long to fit on the same line, putdo:on a new line, indented one level more than the previous line. [[link]!(#long-dos)]def some_function([:foo, :bar, :baz] = args),do: Enum.map(args, fn arg -> arg <> " is on a very long line!" end)When the
do:clause starts on its own line, treat it as a multiline function by separating it with blank lines.# not preferreddef some_function([]), do: :emptydef some_function(_),do: :very_long_line_here# preferreddef some_function([]), do: :emptydef some_function(_),do: :very_long_line_here -
Add a blank line after a multiline assignment as a visual cue that the assignment is ‘over’. [[link]!(#add-blank-line-after-multiline-assignment)]
# not preferredsome_string ="Hello"|> String.downcase()|> String.trim()another_string <> some_string# preferredsome_string ="Hello"|> String.downcase()|> String.trim()another_string <> some_string# also not preferredsomething =if x == 2 do"Hi"else"Bye"endString.downcase(something)# preferredsomething =if x == 2 do"Hi"else"Bye"endString.downcase(something) -
If a list, map, or struct spans multiple lines, put each element, as well as the opening and closing brackets, on its own line. Indent each element one level, but not the brackets. [[link]!(#multiline-enums)]
# not preferred[:first_item, :second_item, :next_item,:final_item]# preferred[:first_item,:second_item,:next_item,:final_item] -
When assigning a list, map, or struct, keep the opening bracket on the same line as the assignment. [[link]!(#multiline-list-assign)]
# not preferredlist =[:first_item,:second_item]# preferredlist = [:first_item,:second_item] -
If any
caseorcondclause needs more than one line (due to line length, multiple expressions in the clause body, etc.), use multi-line syntax for all clauses, and separate each one with a blank line. [[link]!(#multiline-case-clauses)]# not preferredcase arg dotrue -> IO.puts("ok"); :okfalse -> :errorend# not preferredcase arg dotrue ->IO.puts("ok"):okfalse -> :errorend# preferredcase arg dotrue ->IO.puts("ok"):okfalse ->:errorend -
Place comments above the line they comment on. [[link]!(#comments-above-line)]
String.first(some_string) # not preferred# preferredString.first(some_string) -
Use one space between the leading
#character of the comment and the text of the comment. [[link]!(#comment-leading-spaces)]#not preferredString.first(some_string)# preferredString.first(some_string)
Indentation
Section titled “Indentation”-
Indent and align successive
withclauses. Put thedo:argument on a new line, aligned with the previous clauses. [[link]!(#with-clauses)]with {:ok, foo} <- fetch(opts, :foo),{:ok, my_var} <- fetch(opts, :my_var),do: {:ok, foo, my_var} -
If the
withexpression has adoblock with more than one line, or has anelseoption, use multiline syntax. [[link]!(#with-else)]with {:ok, foo} <- fetch(opts, :foo),{:ok, my_var} <- fetch(opts, :my_var) do{:ok, foo, my_var}else:error ->{:error, :bad_arg}end
Parentheses
Section titled “Parentheses”-
Use parentheses for one-arity functions when using the pipe operator (
|>). [[link]!(#parentheses-pipe-operator)]# not preferredsome_string |> String.downcase |> String.trim# preferredsome_string |> String.downcase() |> String.trim() -
Never put a space between a function name and the opening parenthesis. [[link]!(#function-names-with-parentheses)]
# not preferredf (3 + 2)# preferredf(3 + 2) -
Use parentheses in function calls, especially inside a pipeline. [[link]!(#function-calls-and-parentheses)]
# not preferredf 3# preferredf(3)# not preferred and parses as rem(2, (3 |> g)), which is not what you want.2 |> rem 3 |> g# preferred2 |> rem(3) |> g() -
Omit square brackets from keyword lists whenever they are optional. [[link]!(#keyword-list-brackets)]
# not preferredsome_function(foo, bar, [a: "baz", b: "qux"])# preferredsome_function(foo, bar, a: "baz", b: "qux")
The Guide
Section titled “The Guide”The rules in this section may not be applied by the code formatter, but they are generally preferred practice.
Expressions
Section titled “Expressions”-
Run single-line
defs that match for the same function together, but separate multilinedefs with a blank line. [[link]!(#single-line-defs)]def some_function(nil), do: {:error, "No Value"}def some_function([]), do: :okdef some_function([first | rest]) dosome_function(rest)end -
If you have more than one multiline
def, do not use single-linedefs. [[link]!(#multiple-function-defs)]def some_function(nil) do{:error, "No Value"}enddef some_function([]) do:okenddef some_function([first | rest]) dosome_function(rest)enddef some_function([first | rest], opts) dosome_function(rest, opts)end -
Use the pipe operator to chain functions together. [[link]!(#pipe-operator)]
# not preferredString.trim(String.downcase(some_string))# preferredsome_string |> String.downcase() |> String.trim()# Multiline pipelines are not further indentedsome_string|> String.downcase()|> String.trim()# Multiline pipelines on the right side of a pattern match# should be indented on a new linesanitized_string =some_string|> String.downcase()|> String.trim()While this is the preferred method, take into account that copy-pasting multiline pipelines into IEx might result in a syntax error, as IEx will evaluate the first line without realizing that the next line has a pipeline. To avoid this, you can wrap the pasted code in parentheses.
-
Avoid using the pipe operator just once. [[link]!(#avoid-single-pipelines)]
# not preferredsome_string |> String.downcase()System.version() |> Version.parse()# preferredString.downcase(some_string)Version.parse(System.version()) -
Use bare variables in the first part of a function chain. [[link]!(#bare-variables)]
# not preferredString.trim(some_string) |> String.downcase() |> String.codepoints()# preferredsome_string |> String.trim() |> String.downcase() |> String.codepoints() -
Use parentheses when a
defhas arguments, and omit them when it doesn’t. [[link]!(#fun-def-parentheses)]# not preferreddef some_function arg1, arg2 do# body omittedenddef some_function() do# body omittedend# preferreddef some_function(arg1, arg2) do# body omittedenddef some_function do# body omittedend -
Use
do:for single lineif/unlessstatements. [[link]!(#do-with-single-line-if-unless)]# preferredif some_condition, do: # some_stuff -
Never use
unlesswithelse. Rewrite these with the positive case first. [[link]!(#unless-with-else)]# not preferredunless success doIO.puts('failure')elseIO.puts('success')end# preferredif success doIO.puts('success')elseIO.puts('failure')end -
Use
trueas the last condition of thecondspecial form when you need a clause that always matches. [[link]!(#true-as-last-condition)]# not preferredcond do1 + 2 == 5 ->"Nope"1 + 3 == 5 ->"Uh, uh":else ->"OK"end# preferredcond do1 + 2 == 5 ->"Nope"1 + 3 == 5 ->"Uh, uh"true ->"OK"end -
Use parentheses for calls to functions with zero arity, so they can be distinguished from variables. Starting in Elixir 1.4, the compiler will warn you about locations where this ambiguity exists. [[link]!(#parentheses-and-functions-with-zero-arity)]
defp do_stuff, do: ...# not preferreddef my_func do# is this a variable or a function call?do_stuffend# preferreddef my_func do# this is clearly a function calldo_stuff()end
Naming
Section titled “Naming”This guide follows the [Naming Conventions] from the Elixir docs,
including the use of snake_case and CamelCase to describe the casing
rules.
-
Use
snake_casefor atoms, functions and variables. [[link]!(#snake-case)]# not preferred:"some atom":SomeAtom:someAtomsomeVar = 5def someFunction do...end# preferred:some_atomsome_var = 5def some_function do...end -
Use
CamelCasefor modules (keep acronyms like HTTP, RFC, XML uppercase). [[link]!(#camel-case)]# not preferreddefmodule Somemodule do...enddefmodule Some_Module do...enddefmodule SomeXml do...end# preferreddefmodule SomeModule do...enddefmodule SomeXML do...end -
Functions that return a boolean (
trueorfalse) should be named with a trailing question mark. [[link]!(#predicate-function-trailing-question-mark)]def cool?(var) doString.contains?(var, "cool")end -
Boolean checks that can be used in guard clauses should be named with an
is_prefix. For a list of allowed expressions, see the [Guard][Guard Expressions] docs. [[link]!(#predicate-function-is-prefix)]defguard is_cool(var) when var == "cool"defguard is_very_cool(var) when var == "very cool" -
Private functions should not have the same name as public functions. Also, the
def nameanddefp do_namepattern is discouraged.Usually one can try to find more descriptive names focusing on the differences. [[link]!(#private-functions-with-same-name-as-public)]
def sum(list), do: sum_total(list, 0)# private functionsdefp sum_total([], total), do: totaldefp sum_total([head | tail], total), do: sum_total(tail, head + total)
Comments
Section titled “Comments”-
Write expressive code and try to convey your program’s intention through control-flow, structure and naming. [[link]!(#expressive-code)]
-
Comments longer than a word are capitalized, and sentences use punctuation. Use [one space][Sentence Spacing] after periods. [[link]!(#comment-grammar)]
# not preferred# these lowercase comments are missing punctuation# preferred# Capitalization example# Use punctuation for complete sentences. -
Limit comment lines to 100 characters. [[link]!(#comment-line-length)]
Comment Annotations
Section titled “Comment Annotations”-
Annotations should usually be written on the line immediately above the relevant code. [[link]!(#annotations)]
-
The annotation keyword is uppercase, and is followed by a colon and a space, then a note describing the problem. [[link]!(#annotation-keyword)]
# TODO: Deprecate in v1.5.def some_function(arg), do: {:ok, arg} -
In cases where the problem is so obvious that any documentation would be redundant, annotations may be left with no note. This usage should be the exception and not the rule. [[link]!(#exceptions-to-annotations)]
start_task()# FIXMEProcess.sleep(5000) -
Use
TODOto note missing features or functionality that should be added at a later date. [[link]!(#todo-notes)] -
Use
FIXMEto note broken code that needs to be fixed. [[link]!(#fixme-notes)] -
Use
OPTIMIZEto note slow or inefficient code that may cause performance problems. [[link]!(#optimize-notes)] -
Use
HACKto note code smells where questionable coding practices were used and should be refactored away. [[link]!(#hack-notes)] -
Use
REVIEWto note anything that should be looked at to confirm it is working as intended. For example:REVIEW: Are we sure this is how the client does X currently?[[link]!(#review-notes)] -
Use other custom annotation keywords if it feels appropriate, but be sure to document them in your project’s
READMEor similar. [[link]!(#custom-keywords)]
Modules
Section titled “Modules”-
Use one module per file unless the module is only used internally by another module (such as a test). [[link]!(#one-module-per-file)]
-
Use
snake_casefile names forCamelCasemodule names. [[link]!(#underscored-filenames)]# file is called some_module.exdefmodule SomeModule doend -
Represent each level of nesting within a module name as a directory. [[link]!(#module-name-nesting)]
# file is called parser/core/xml_parser.exdefmodule Parser.Core.XMLParser doend -
List module attributes, directives, and macros in the following order: [[link]!(#module-attribute-ordering)]
@moduledoc@behaviouruseimportrequirealias@module_attributedefstruct@type@callback@macrocallback@optional_callbacksdefmacro,defmodule,defguard,def, etc.
Add a blank line between each grouping, and sort the terms (like module names) alphabetically. Here’s an overall example of how you should order things in your modules:
defmodule MyModule do@moduledoc """An example module"""@behaviour MyBehaviouruse GenServerimport Somethingimport SomethingElserequire Integeralias My.Long.Module.Namealias My.Other.Module.Example@module_attribute :foo@other_attribute 100defstruct [:name, params: []]@type params :: [{binary, binary}]@callback some_function(term) :: :ok | {:error, term}@macrocallback macro_name(term) :: Macro.t()@optional_callbacks macro_name: 1@doc falsedefmacro __using__(_opts), do: :no_op@doc """Determines when a term is `:ok`. Allowed in guards."""defguard is_ok(term) when term == :ok@impl truedef init(state), do: {:ok, state}# Define other functions here.end -
Use the
__MODULE__pseudo variable when a module refers to itself. This avoids having to update any self-references when the module name changes. [[link]!(#module-pseudo-variable)]defmodule SomeProject.SomeModule dodefstruct [:name]def name(%__MODULE__{name: name}), do: nameend -
If you want a prettier name for a module self-reference, set up an alias. [[link]!(#alias-self-referencing-modules)]
defmodule SomeProject.SomeModule doalias __MODULE__, as: SomeModuledefstruct [:name]def name(%SomeModule{name: name}), do: nameend -
Avoid repeating fragments in module names and namespaces. This improves overall readability and eliminates [ambiguous aliases][Conflicting Aliases]. [[link]!(#repetitive-module-names)]
# not preferreddefmodule Todo.Todo do...end# preferreddefmodule Todo.Item do...end
Documentation
Section titled “Documentation”Documentation in Elixir (when read either in iex with h or generated with
[ExDoc]) uses the [Module Attributes] @moduledoc and @doc.
-
Always include a
@moduledocattribute in the line right afterdefmodulein your module. [[link]!(#moduledocs)]# not preferreddefmodule AnotherModule douse SomeModule@moduledoc """About the module"""...end# preferreddefmodule AThirdModule do@moduledoc """About the module"""use SomeModule...end -
Use
@moduledoc falseif you do not intend on documenting the module. [[link]!(#moduledoc-false)]defmodule SomeModule do@moduledoc false...end -
Separate code after the
@moduledocwith a blank line. [[link]!(#moduledoc-spacing)]# not preferreddefmodule SomeModule do@moduledoc """About the module"""use AnotherModuleend# preferreddefmodule SomeModule do@moduledoc """About the module"""use AnotherModuleend -
Use heredocs with markdown for documentation. [[link]!(#heredocs)]
# not preferreddefmodule SomeModule do@moduledoc "About the module"enddefmodule SomeModule do@moduledoc """About the moduleExamples:iex> SomeModule.some_function:result"""end# preferreddefmodule SomeModule do@moduledoc """About the module## Examplesiex> SomeModule.some_function:result"""end
Typespecs
Section titled “Typespecs”Typespecs are notation for declaring types and specifications, for documentation or for the static analysis tool Dialyzer.
Custom types should be defined at the top of the module with the other directives (see [Modules]!(#modules)).
-
Place
@typedocand@typedefinitions together, and separate each pair with a blank line. [[link]!(#typedocs)]defmodule SomeModule do@moduledoc false@typedoc "The name"@type name :: atom@typedoc "The result"@type result :: {:ok, term} | {:error, term}...end -
If a union type is too long to fit on a single line, put each part of the type on a separate line, indented one level past the name of the type. [[link]!(#union-types)]
# not preferred@type long_union_type ::some_type | another_type | some_other_type | one_more_type | a_final_type# preferred@type long_union_type ::some_type| another_type| some_other_type| one_more_type| a_final_type -
Name the main type for a module
t, for example: the type specification for a struct. [[link]!(#naming-main-types)]defstruct [:name, params: []]@type t :: %__MODULE__{name: String.t() | nil,params: Keyword.t()} -
Place specifications right before the function definition, after the
@doc, without separating them by a blank line. [[link]!(#spec-spacing)]@doc """Some function description."""@spec some_function(term) :: resultdef some_function(some_data) do{:ok, some_data}end
Structs
Section titled “Structs”-
Use a list of atoms for struct fields that default to
nil, followed by the other keywords. [[link]!(#nil-struct-field-defaults)]# not preferreddefstruct name: nil, params: nil, active: true# preferreddefstruct [:name, :params, active: true] -
Omit square brackets when the argument of a
defstructis a keyword list. [[link]!(#struct-def-brackets)]# not preferreddefstruct [params: [], active: true]# preferreddefstruct params: [], active: true# required - brackets are not optional, with at least one atom in the listdefstruct [:name, params: [], active: true] -
If a struct definition spans multiple lines, put each element on its own line, keeping the elements aligned. [[link]!(#multiline-structs)]
defstruct foo: "test",bar: true,baz: false,qux: false,quux: 1If a multiline struct requires brackets, format it as a multiline list:
defstruct [:name,params: [],active: true]
Exceptions
Section titled “Exceptions”-
Make exception names end with a trailing
Error. [[link]!(#exception-names)]# not preferreddefmodule BadHTTPCode dodefexception [:message]enddefmodule BadHTTPCodeException dodefexception [:message]end# preferreddefmodule BadHTTPCodeError dodefexception [:message]end -
Use lowercase error messages when raising exceptions, with no trailing punctuation. [[link]!(#lowercase-error-messages)]
# not preferredraise ArgumentError, "This is not valid."# preferredraise ArgumentError, "this is not valid"
Collections
Section titled “Collections”-
Always use the special syntax for keyword lists. [[link]!(#keyword-list-syntax)]
# not preferredsome_value = [{:a, "baz"}, {:b, "qux"}]# preferredsome_value = [a: "baz", b: "qux"] -
Use the shorthand key-value syntax for maps when all of the keys are atoms. [[link]!(#map-key-atom)]
# not preferred%{:a => 1, :b => 2, :c => 0}# preferred%{a: 1, b: 2, c: 3} -
Use the verbose key-value syntax for maps if any key is not an atom. [[link]!(#map-key-arrow)]
# not preferred%{"c" => 0, a: 1, b: 2}# preferred%{:a => 1, :b => 2, "c" => 0}
Strings
Section titled “Strings”-
Match strings using the string concatenator rather than binary patterns: [[link]!(#strings-matching-with-concatenator)]
# not preferred<<"my"::utf8, _rest::bytes>> = "my string"# preferred"my" <> _rest = "my string"
Regular Expressions
Section titled “Regular Expressions”No guidelines for regular expressions have been added yet.
Metaprogramming
Section titled “Metaprogramming”Testing
Section titled “Testing”-
When writing [ExUnit] assertions, put the expression being tested to the left of the operator, and the expected result to the right, unless the assertion is a pattern match. [[link]!(#testing-assert-order)]
# preferredassert actual_function(1) == true# not preferredassert true == actual_function(1)# required - the assertion is a pattern matchassert {:ok, expected} = actual_function(3)
Resources
Section titled “Resources”Alternative Style Guides
Section titled “Alternative Style Guides”-
Aleksei Magusev’s Elixir Style Guide — An opinionated Elixir style guide stemming from the coding style practiced in the Elixir core libraries. Developed by Aleksei Magusev and Andrea Leopardi, members of Elixir core team. While the Elixir project doesn’t adhere to any specific style guide, this is the closest available guide to its conventions.
-
Credo’s Elixir Style Guide — Style Guide for the Elixir language, implemented by Credo static code analysis tool.
Refer to [Awesome Elixir][Code Analysis] for libraries and tools that can help with code analysis and style linting.
Getting Involved
Section titled “Getting Involved”Contributing
Section titled “Contributing”It’s our hope that this will become a central hub for community discussion on best practices in Elixir. Feel free to open tickets or send pull requests with improvements. Thanks in advance for your help!
Check the [contributing guidelines][Contributing] for more information.
Spread the Word
Section titled “Spread the Word”A community style guide is meaningless without the community’s support. Please tweet, [star][Stargazers], and let any Elixir programmer know about [this guide][Elixir Style Guide] so they can contribute.
Copying
Section titled “Copying”License
Section titled “License”
This work is licensed under a
[Creative Commons Attribution 3.0 Unported License][License]
Attribution
Section titled “Attribution”The structure of this guide, bits of example code, and many of the initial points made in this document were borrowed from the [Ruby community style guide]. A lot of things were applicable to Elixir and allowed us to get some document out quicker to start the conversation.
Here’s the [list of people who have kindly contributed][Contributors] to this project.
[Chinese Simplified] !: https://github.com/geekerzp/elixir_style_guide/blob/master/README-zhCN.md [Chinese Traditional] !: https://github.com/elixirtw/elixir_style_guide/blob/master/README_zhTW.md [Code Analysis] !: https://github.com/h4cc/awesome-elixir#code-analysis [Code Of Conduct] !: https://github.com/elixir-lang/elixir/blob/master/CODE_OF_CONDUCT.md [Code Formatter] !: https://hexdocs.pm/elixir/Code.html#format_string!/2 [Conflicting Aliases] !: https://elixirforum.com/t/using-aliases-for-fubar-fubar-named-module/1723 [Contributing] !: https://github.com/christopheradams/elixir_style_guide/blob/master/CONTRIBUTING.md [Contributors] !: https://github.com/christopheradams/elixir_style_guide/graphs/contributors [Elixir Style Guide] !: https://github.com/christopheradams/elixir_style_guide [Elixir] !: http://elixir-lang.org [ExDoc] !: https://github.com/elixir-lang/ex_doc [ExUnit] !: https://hexdocs.pm/ex_unit/ExUnit.html [French] !: https://github.com/ronanboiteau/elixir_style_guide/blob/master/README_frFR.md [Guard Expressions] !: https://hexdocs.pm/elixir/patterns-and-guards.html#list-of-allowed-functions-and-operators [Hex] !: https://hex.pm/packages [Japanese] !: https://github.com/kenichirow/elixir_style_guide/blob/master/README-jaJP.md [Korean] !: https://github.com/marocchino/elixir_style_guide/blob/new-korean/README-koKR.md [License] !: http://creativecommons.org/licenses/by/3.0/deed.en_US [Mix format] !: https://hexdocs.pm/mix/Mix.Tasks.Format.html [Module Attributes] !: http://elixir-lang.org/getting-started/module-attributes.html#as-annotations [Naming Conventions] !: https://hexdocs.pm/elixir/naming-conventions.html [Portuguese] !: https://github.com/gusaiani/elixir_style_guide/blob/master/README_ptBR.md [Ruby community style guide] !: https://github.com/bbatsov/ruby-style-guide [Russian] !: https://github.com/sofialapteva/elixir_style_guide/blob/russian/README_ru.md [Sentence Spacing] !: http://en.wikipedia.org/wiki/Sentence_spacing [Spanish] !: https://github.com/iver/elixir_style_guide/blob/spanish/i18n/README_es.md [Stargazers] !: https://github.com/christopheradams/elixir_style_guide/stargazers [Thai] !: https://github.com/tamectosphere/elixir_style_guide/blob/feat/thai-translation/README_th.md