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.Componentoverrides thedefanddefpmacros to annotate function heads with some pattern matching.I believe because
defparamscreates a new method by callingModule.eval_quoted/2this is somehow evaluating the ast returned by Phoenix.Component'sdefmacro 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
defparamsmacro is usingModule.eval_quoted/2rather 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)