defmodule ExampleApp do # Module attributes @default_timeout 5000 @version "1.0.0" # Protocol definition defprotocol Formatter do @doc "Format the data for display" def format(data) end # Protocol implementation defimpl Formatter, for: Map do def format(data) do inspect(data, pretty: true) end end # Struct definition defstruct name: "", age: 0, email: nil # Exception definition defexception message: "A custom error occurred" # Callback definition @callback process(term) :: {:ok, term} | {:error, term} @macrocallback validate(term) :: Macro.t() # Public function def calculate_age(birth_year) when is_integer(birth_year) do current_year = DateTime.utc_now().year current_year - birth_year end # Private function defp validate_email(email) do String.match?(email, ~r/^[^\s]+@[^\s]+\.[^\s]+$/) end # Function with pattern matching def handle_result({:ok, value}), do: "Success: #{value}" def handle_result({:error, reason}), do: "Error: #{reason}" def handle_result(_), do: "Unknown result" # Macro definition defmacro debug(expression) do quote do IO.puts "Debug: #{inspect(unquote(expression))}" end end # Private macro defmacrop log(message) do quote do IO.puts("[#{__MODULE__}] #{unquote(message)}") end end # Guard definition defguard is_positive(value) when is_integer(value) and value > 0 defguardp is_even(value) when is_integer(value) and rem(value, 2) == 0 # Function delegation defdelegate parse_int(string), to: String, as: :to_integer # Overridable function defoverridable [process: 1] # Using with for complex operations def create_user(params) do with {:ok, name} <- Map.fetch(params, "name"), {:ok, email} <- Map.fetch(params, "email"), true <- validate_email(email) do %ExampleApp{name: name, email: email} else :error -> {:error, "Missing required fields"} false -> {:error, "Invalid email format"} end end end