Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- defmodule Macra do
- @arg_names ~w[a b c d e f g h i j k l m n o p q r s t u v w x y z]a
- def take_arguments(many) do
- for arg_name <- Enum.take(@arg_names, many), do: {arg_name, [], Elixir}
- end
- defmacro defreverse({:/, _, [{name, meta, _ }, arity]} , to: {function, call_meta, _ }) do
- args = take_arguments(arity)
- function_definition = { name, meta, args}
- call = {function, call_meta, Enum.reverse(args) }
- quote do
- def unquote(function_definition), do: unquote(call)
- end
- end
- defmacro defswap({:/, _, [{name, meta, _ }, arity]} , to: {function, call_meta, _ }) do
- args = take_arguments(arity)
- function_definition = { name, meta, args}
- {first, [second]} = Enum.split(args,arity-1)
- call = {function, call_meta, [second | first] }
- quote do
- def unquote(function_definition), do: unquote(call)
- end
- end
- end
- defmodule Test do
- require Macra
- import Macra
- def test(uno, due, tres,quatro) do
- IO.inspect uno
- IO.inspect due
- IO.inspect tres
- IO.inspect quatro
- end
- defreverse test_rev/4, to: test
- defswap swapped/4, to: test
- end
- IO.inspect "Original"
- Test.test(1,2,3,4)
- IO.inspect "Reversed"
- Test.test_rev(1,2,3,4)
- IO.inspect "Swapped"
- Test.swapped(1,2,3,4)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement