Learn macro -- day01: how to define macro `break`
macro is defined as
use it in another module like:
mix compile shows error:
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
enddefmodule 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
enduse 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
enddefmodule 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
endmix compile shows error:
error: undefined variable "break"error: undefined variable "break".