Writing a wrapper function in Elixir

I have the following code

 import Process 

 defmodule MC2Elixir do 
	def p(u) do 
		pid1 = spawn_link( fn -> (send(u,{:m,"Hello"})) end)
		 pid2 = spawn_link( fn -> (receive do
			{_tag, message} -> message
 end 
exit(self(), :terminated)) end)
end 

def q(u) do 
		pid1 = spawn_link( fn -> (send(u,{:m,"v"})) end)
		 pid2 = spawn_link( fn -> (receive do
			{_tag, message} -> message
 end 
exit(self(), :terminated)) end)
end 

def main() do 
		pid1 = spawn_link( fn -> sleep(1) (MC2Elixir.p(q)) end)
		 pid2 = spawn_link( fn -> sleep(1) (MC2Elixir.q(p)) end)
		register(pid1, :p)
		register(pid2, :q)
end
end

and every time I run it

 [error] Process #PID<0.221.0> raised an exception
** (ArgumentError) argument error
    :erlang.send(:p, {:m, "v"})
    mc2elixir.exs:13: anonymous fn/1 in MC2Elixir.q/1

an error pops up.

What could the problem be please?

Some context into what you’re trying to do might be necessary but, at a glance, you may need to re-arrange main from:

def main() do 
		pid1 = spawn_link( fn -> sleep(1) (MC2Elixir.p(q)) end)
		 pid2 = spawn_link( fn -> sleep(1) (MC2Elixir.q(p)) end)
		register(pid1, :p)
		register(pid2, :q)
end

to

def main() do 
		pid1 = spawn_link( fn -> sleep(1) (MC2Elixir.p(q)) end)
		register(pid1, :p)
		 pid2 = spawn_link( fn -> sleep(1) (MC2Elixir.q(p)) end)
		register(pid2, :q)
end

and I think also change from MC2Elixir.p(q) to MC2Elixir.p(:q) and same thing for p to :p

Thanks a lot for your help.