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
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
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".
1 Reply
hyperion_zw
hyperion_zwOP4mo ago
when use macro, if I use it as break(), it could compile, but I want the user use it as break. The code is my practise to following book: "Metaprogramming Elixir_ Write Less Code, Get More Done"

Did you find this page helpful?