thiagomajesk

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:

https://github.com/thiagomajesk/viewplex/commit/b67072f3a4e180f5117e9f8145ad27d4240d4e47#diff-9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08

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

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}]}
 ]}

Where Next?

Popular in Questions Top

greenz1
I have a phoenix application from which a user can download multiple(5-6) files of size 1MB. I couldn’t find anything related to sending ...
New
electic
Hi, I am new to Elixir. I am trying to use the DateTime component to insert a date into MySQL however the there seems to be no way to fo...
New
nobody
How to bind a phoenix app to a specific ip address? could not find anything about that, nowhere, unfortunately, but for me this is quite...
New
LegitStack
I’m trying to make a websocket server in Phoenix or raw Elixir. I heard about gun, I think I could use cowboy, but since I’m not that sma...
New
pmjoe
I have a relationship of love and hate with Elixir. Lots of things are just absolutely right, but there are some things that are kind of ...
New
SoCreat
i’m a new one to elixir which editor can i use vs code? or atom? Thanks! :smiley:
New
itssasanka
Hi all, Trying to get some more clarity over utc_datetime and naive_datetime for Ecto: The documentation above suggests that while ...
New
sergio_101
I am VERY much an elixir newbie. I have taken one elixir course and one phoenix course on Udemy. During that course, I saw the instructor...
New
nobody
Hi! In PHP: $_SERVER[‘SERVER_ADDR’] - in Elixir? Searched the docs for ip address and the web, no good results. Thanks!
New
openscript
Hello! Sorry for this astonishing simple question, but I’m really stuck. I try to set up the intellij-elixir plugin, but I don’t know ho...
New

Other popular topics Top

malloryerik
Hi, this is for people who, like me, have had some friction using .html.heex templates in VSCode. The solution seems to be, in a hyphena...
New
senggen
Erlang/OTP 25 [erts-13.2.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] 15:22:35.803 [error] gen_event {lager_file_backend...
New
albydarned
Hello all! I am typing this post from my new MacBook Pro with the M1 chip. I’m loving it so far, and will probably use it as my daily dr...
New
greenz1
I have a phoenix application from which a user can download multiple(5-6) files of size 1MB. I couldn’t find anything related to sending ...
New
josevalim
Hi everyone, One of the features added to Elixir early on to help integration with Erlang code was the idea of overridable function defi...
New
hariharasudhan94
lets say i have a sample like a = 20; b = 10; if (a &gt; b) do {:ok, "a"} end if (a &lt; b) do {:ok, b} end if (a == b) do {:ok, "equa...
New
sergio_101
I am VERY much an elixir newbie. I have taken one elixir course and one phoenix course on Udemy. During that course, I saw the instructor...
New
Qqwy
Original source of discussion: This topic on the Pragmatic Programmers’ Functional Web Development with Elixir, OTP, and Phoenix forum. ...
New
hariharasudhan94
I would like to know what is the best IDE for elixir development?
New
PeterCarter
There are pre-rolled solutions for other frameworks that do work. However, Phoenix does not seem to have these. Have people had good expe...
New

We're in Beta

About us Mission Statement