This document provides an overview of the Elixir programming language, covering its key features such as being dynamic, functional, and supporting pattern matching. It summarizes Elixir's core data types, how to define modules and structs, use protocols and enumerables, pipe operators, macros, processes, and supervisors.
6. Structs
defmodule Person do
defstruct name: "Sattar", age: 40
end
me = %Person{name: "AbdulSattar"}
IO.puts me.name # Abdulsattar
%Person{name: name, age: age} = me
IO.puts(age) # 40
youngMe = %{me | age: 10}
7. Protocols
defprotocol Blank do
@doc "Returns true if data is considered blank/empty"
def blank?(data)
end
defimpl Blank, for: Integer do
def blank?(0), do: true
def blank?(_), do: false
end
defimpl Blank, for: List do
def blank?([]), do: true
def blank?(_), do: false
end
Blank.blank?(3) # false
Blank.blank?([]) # true
9. Pipe Operator
sumOfSquares = Enum.reduce(Enum.map(1..100, fn x -> x * x end), 0, &+/2)
sumOfSquares1 = 1..100
|> Enum.map(fn x -> x * x end)
|> Enum.reduce(0, &+/2)
square = fn x -> x * x end
sumOfSquares2 = 1..100
|> Enum.map(square)
|> Enum.sum
10. Macros
defmodule Unless do
defmacro macro_unless(clause, expression) do
quote do
if(!unquote(clause), do: unquote(expression))
end
end
end
Unless.macro_unless false, do: IO.puts "prints"
Unless.macro_unless true, do: IO.puts "doesn't print"
11. Processes
pid = spawn fn ->
receive do
msg -> IO.puts "Received: #{msg}"
end
end
send pid, "Hello!"
send pid, "3 times"