On peut utiliser des atomes dès qu'on a un ensemble de constantes à exprimer. Les atomes offrent un moyen sûr au niveau des types de comparer des valeurs. Un atome est défini par son nom, précédé d'un deux-points :
# Atoms start with a ':',
# followed by alphanumeric snake_cased characters
:an_atom
De nombreuses fonctions de la bibliothèque standard d'Elixir renvoient un atome pour annoter le résultat :
Enum.fetch([1], 0)
# => {:ok, 1}
Enum.fetch([1], 2)
# => :error
Les atomes sont représentés en interne par un entier dans une table de correspondance, attribué automatiquement. Comparer des atomes est donc plus rapide que comparer des strings. Il n'est pas possible de modifier cette valeur interne. Il est généralement considéré comme un anti-pattern de créer dynamiquement des atomes à partir d'entrées fournies par l'utilisateur. L'environnement d'exécution ne dispose que d'un espace limité pour les atomes : générer de nouveaux atomes à l'exécution peut échouer si la table des atomes est pleine.