Quick reference for Elixir basics — structures, functions, loops, and concurrency.
| Structure | Syntax | Notes |
|---|---|---|
| List | [1, 2, 3] |
Linked list, prepend is O(1) |
| Tuple | {1, :ok, "msg"} |
Fixed-size, indexed |
| Map | %{a: 1, b: 2} |
Key-value |
| MapSet | MapSet.new([1, 2]) |
Unique values |
| Keyword | [a: 1, b: 2] |
List of 2-tuples, keys are atoms |
# Named function
def greet(name) do
"Hello, #{name}"
end
# Pattern matching in args
def handle({:ok, result}), do: result
def handle({:error, reason}), do: {:error, reason}
# Default arguments
def connect(host \\ "localhost", port \\ 3000) do
"#{host}:#{port}"
end
# Anonymous function
square = fn x -> x * x end
square.(4) # => 16
# Pipe operator
"hello"
|> String.upcase()
|> String.slice(0..2)
# Guards
def adult?(age) when age >= 18, do: true
def adult?(_), do: false
# Enum.each (side effects)
Enum.each([1, 2, 3], &IO.puts/1)
# Enum.map
doubled = Enum.map([1, 2, 3], &(&1 * 2))
# Enum.filter
evens = Enum.filter(1..10, &rem(&1, 2) == 0)
# Enum.reduce
sum = Enum.reduce([1, 2, 3], 0, &(&1 + &2))
# Comprehension
for n <- 1..5, n > 2, do: n * n
# Recursion (idiomatic)
defmodule Loop do
def each([]), do: :ok
def each([h | t]) do
IO.puts(h)
each(t)
end
end
# Spawn a process
pid = spawn(fn -> IO.puts("hello from process") end)
# Task (supervised async)
task = Task.async(fn -> expensive_work() end)
result = Task.await(task)
# Task.async_stream (parallel map)
results = Task.async_stream(collection, &process/1, max_concurrency: 4)
|> Enum.to_list()
# Agent (shared state)
{:ok, agent} = Agent.start_link(fn -> 0 end)
Agent.update(agent, &(&1 + 1))
Agent.get(agent, & &1) # => 1
# GenServer (OTP server)
defmodule Counter do
use GenServer
def init(_), do: {:ok, 0}
def handle_call(:get, _from, count), do: {:reply, count, count}
def handle_cast(:inc, count), do: {:noreply, count + 1}
end
# ETS (in-memory store)
:ets.new(:cache, [:set, :public, :named_table])
:ets.insert(:cache, {:key, "value"})
:ets.lookup(:cache, :key)