When using the iex
console from my Phoenix application, as follows:
iex -S mix phx.server
I cant seem to call System
functions, such as System.stop(1)
or System.halt(1)
as it forces a namespace to the front of the module. An error results as that namespaced module doesnt exist.
** (UndefinedFunctionError) function MyApp.SomeNamespace.System.stop/1 is undefined or private
Why does it prepend a namespace to this core module? Why does it produce this error with a module like System
, but not with modules like Enum
, List
, or Map
?
Also, if I use iex
outside of my application source, I can call System.any_function
as expected.
On further inspection, I can get it to work by calling Elixir.System.stop/1
. Why do I need to prepend the System
module with Elixir.
but I dont need to do that for other Elixir modules?
Within my application code, I call things like System.backtrace
or System.get_env
with no aliasing or namespacing required. I also have no modules named System
in the application (i.e., there is no Myapp.System
or similar module defined).
Look for an iex.exs file. If there is such a file it is automatically run when iex is run. If you reference namespaces in iex.exs that would explain this behavior.
You can find out more in the docs https://hexdocs.pm/iex/IEx.html#module-the-iex-exs-file