defmodule Navigator do
def navigate(dir) do
expanded_dir = Path.expand(dir)
go_through([expanded_dir])
end
def go_through([]), do: nil
def go_through([content | rest]) do
print_and_navigate(content, File.dir?(content))
go_through(rest)
end
def print_and_navigate(_dir, false), do: nil
def print_and_navigate(dir, true) do
IO.puts(dir)
children_dirs = File.ls!(dir)
go_through(expand_dirs(children_dirs, dir))
end
def expand_dirs([], relativeto), do: []
def expand_dirs([dir | dirs], relative_to) do
expanded_dir = Path.expand(dir, relative_to)
[expanded_dir | expand_dirs(dirs, relative_to)]
end
end
in:
def print_and_navigate(dir, true) do
IO.puts(dir)
children_dirs = File.ls!(dir)
go_through(expand_dirs(children_dirs, dir))
end
children_dirs is a tuple and expand_dirs expects a list so why do i not get an error? do functions pattern match incoming arguments before throwing errors of arguments compatibility? where can i read more about where and when pattern matching happens?
What is confusing? You are using the so-called bang function – File.ls! – that does not return tuples; it either returns the values you requested, or raises a runtime error.
You seem to be mistaking it for the non-bang function – File.ls.
that’s what’s confusing. The docs say it’s the same but with the runtime error the fact that it’s not a tuple isn’t mentioned but only showed in the specs
The docs are saying that it does the same but raises an error instead of returning an error tuple IMO. But I can see how it can be confusing if you are new to Elixir.
yeah to a newbie it says: " this one does something more when errors come" when i think it could say: “this one does the same but instead of a it does b when errors come” to be clearer to who hasn’t well in mind elixirs mechanics.