Ash FrameworkAF
Ash Framework7mo ago
1 reply
hyperion_zw

Learn macro -- day01: how to define macro `break`

macro is defined as
defmodule Macros.Loop do
  defmacro while(expression, do: block) do
    quote do
      try do
        for _ <- Stream.cycle([:ok]) do
          if unquote(expression) do
            unquote(block)
          else
            unquote(__MODULE__).break
          end
        end
      catch
        :break -> :ok
      end
    end
  end

  def break do
    throw(:break)
  end
end


use it in another module like:
defmodule Macros.Playground do
  require Macros.Loop
  import Macros.Loop

  def case03_generate_loop do
    spawn(fn ->
      while true do
        receive do
          :stop ->
            IO.puts("Stopping")
            break

          message ->
            IO.puts("Got #{inspect(message)}")
        end
      end
    end)
  end
end

mix compile shows error: error: undefined variable "break".
Was this page helpful?