thiagomajesk
Cryptic "undefined function arg0/0" error message in EEx templates
Hi! I’m working on this small lib that provides a structure to better organize components on top of Phoenix’s views (influenced by AspNet’s and Ruby’s ViewComponents)…
I was testing some use-cases today and got this compile error that only happens when I use EEx templates. I have some unit tests for function calls that do not break, but when the code goes to an actual template it does break. I have a separate branch with a commit that contains a test case that better shows the problem:
The error I get is:
== Compilation error in file test/support/page_view.ex ==
** (CompileError) test/support/page.html.eex:1: undefined function arg0/0
(elixir 1.10.4) src/elixir_locals.erl:114: anonymous fn/3 in :elixir_locals.ensure_no_undefined_local/3
(stdlib 3.13) erl_eval.erl:680: :erl_eval.do_apply/6
Also, while testing the lib in a Phoenix application, I got:
variable "arg0" does not exist and is being expanded to "arg0()", please use parentheses to remove the ambiguity or change the variable name
Marked As Solved
al2o3cr
The AST from that issue pretty-prints to:
[arg0 = case(slot(:greet) do
{:safe, [" <strong>Hello!<strong>\n"]}
end) do
{:safe, data} ->
data
bin when is_binary(bin) ->
Plug.HTML.html_escape_to_iodata(bin)
other ->
Phoenix.HTML.Safe.to_iodata(other)
end, arg1 = case(slot(:name) do
{:safe, [" <span>John</span>\n"]}
end) do
{:safe, data} ->
data
bin when is_binary(bin) ->
Plug.HTML.html_escape_to_iodata(bin)
other ->
Phoenix.HTML.Safe.to_iodata(other)
end, {:safe, [arg0, arg1, " <p>How are you?</p>\n"]}]
or distilled to its essence:
[a = 1, b = 2, a + b]
This fragment doesn’t compile either:
** (CompileError) iex:5: undefined function a/0
(stdlib 3.13.2) lists.erl:1358: :lists.mapfoldl/3
The issue is that a list of AST nodes is not the same as a block.
This version of the simplified example does compile (and returns 3):
(a = 1; b = 2; a + b)
(or you can use newlines instead of ;)
The difference is clear in their respective ASTs:
iex(9)> quote do: [a = 1, b = 2, a + b]
[
{:=, [], [{:a, [], Elixir}, 1]},
{:=, [], [{:b, [], Elixir}, 2]},
{:+, [context: Elixir, import: Kernel], [{:a, [], Elixir}, {:b, [], Elixir}]}
]
iex(10)> quote do: (a = 1; b = 2; a + b)
{:__block__, [],
[
{:=, [], [{:a, [], Elixir}, 1]},
{:=, [], [{:b, [], Elixir}, 2]},
{:+, [context: Elixir, import: Kernel], [{:a, [], Elixir}, {:b, [], Elixir}]}
]}
Popular in Questions
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #javascript
- #code-sync
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #advent-of-code
- #elixirconf-us
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #performance








