Advertisement
Guest User

Untitled

a guest
Aug 17th, 2017
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.96 KB | None | 0 0
  1. defmodule Binar do
  2.  
  3. defmacro define_extractor(args) do
  4. signature_patterns =
  5. args
  6. |> Enum.map(fn item -> IO.inspect item end)
  7. |> Enum.map(fn {variable, sized} ->
  8. {:::, [], [{variable, [], __MODULE__}, {:size, [], [sized]}]}
  9. end)
  10. |> Enum.reduce([], fn (pat, acc) -> [ pat | acc ] end)
  11. |> Enum.reverse
  12. return_patterns =
  13. args
  14. |> Enum.map(fn {variable, _} -> {variable, {variable, [], __MODULE__}} end)
  15. |> Enum.reverse # not that it matters
  16.  
  17. signature = {:<<>>, [], signature_patterns}
  18. returns = {:%{}, [], return_patterns}
  19. quote do
  20. def extract(unquote(signature)) do
  21. unquote(returns)
  22. end
  23. end
  24. end
  25.  
  26. end
  27.  
  28. defmodule Extractors do
  29. require Binar
  30. Binar.define_extractor(x: 8, y: 8)
  31. Binar.define_extractor(a: 24, b: 16, c: 8)
  32. end
  33.  
  34. IO.inspect Extractors.extract("hi")
  35. IO.inspect Extractors.extract("hellow")
  36. IO.inspect Extractors.extract("no match here. crash.")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement