Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- defmodule Binar do
- defmacro define_extractor(args) do
- signature_patterns =
- args
- |> Enum.map(fn item -> IO.inspect item end)
- |> Enum.map(fn {variable, sized} ->
- {:::, [], [{variable, [], __MODULE__}, {:size, [], [sized]}]}
- end)
- |> Enum.reduce([], fn (pat, acc) -> [ pat | acc ] end)
- |> Enum.reverse
- return_patterns =
- args
- |> Enum.map(fn {variable, _} -> {variable, {variable, [], __MODULE__}} end)
- |> Enum.reverse # not that it matters
- signature = {:<<>>, [], signature_patterns}
- returns = {:%{}, [], return_patterns}
- quote do
- def extract(unquote(signature)) do
- unquote(returns)
- end
- end
- end
- end
- defmodule Extractors do
- require Binar
- Binar.define_extractor(x: 8, y: 8)
- Binar.define_extractor(a: 24, b: 16, c: 8)
- end
- IO.inspect Extractors.extract("hi")
- IO.inspect Extractors.extract("hellow")
- IO.inspect Extractors.extract("no match here. crash.")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement