Phoenix.Component overrides the def and defp macros to annotate function heads with some pattern matching.
I believe because defparams creates a new method by calling Module.eval_quoted/2 this is somehow evaluating the ast returned by Phoenix.Component's def macro prematurely(? - tbh, I don't grok this perfectly yet)
But the error can be seen with code like the following:
defmodule MyMod do
use Phoenix.Component
use Params
defparams fleeno %{some: :string}
def hi do
IO.puts("Hello")
end
end
error: cannot invoke remote function Phoenix.Component.Declarative.__pattern__!/2 inside a match
nofile:1: MyMod.util_2/1
Is there a reason I'm not understanding that the defparams macro is using Module.eval_quoted/2 rather than just defining the method directly?
In other words, can't
Module.eval_quoted(__MODULE__, quote do
def unquote(name)(params) do
unquote(module_name).from(params)
end
end)
Just be written as
def unquote(name)(params) do
unquote(module_name).from(params)
end
In my own experiments it seems to work fine, but I'm not sure if I'm missing something.
(Of course, I could just call the macro before I use Phoenix.Component, but perhaps there's a more comprehensive fix)
Phoenix.Component
overrides thedef
anddefp
macros to annotate function heads with some pattern matching. I believe becausedefparams
creates a new method by callingModule.eval_quoted/2
this is somehow evaluating the ast returned by Phoenix.Component'sdef
macro prematurely(? - tbh, I don't grok this perfectly yet)But the error can be seen with code like the following:
Is there a reason I'm not understanding that the
defparams
macro is usingModule.eval_quoted/2
rather than just defining the method directly?In other words, can't
Just be written as
In my own experiments it seems to work fine, but I'm not sure if I'm missing something.
(Of course, I could just call the macro before I use Phoenix.Component, but perhaps there's a more comprehensive fix)