debajit
Quickest way to call a function with command line arguments?
I have a module with a function that applies a transformation on a string e.g. (this is for an Advent of Code problem, where I need to do this often)
defmodule M do
def f(some_string) do
# apply transformation on some_string
end
end
I need to run M.f with a string passed from the command line. What is the quickest way to do this?
Please note that
- This script will never be deployed to production
- I just need an easy way to call an Elixir function with some arguments from the command line
Option 1: escript
This is clean but requires some extra code (which I’d like to avoid if possible):
# mix.exs
defmodule M.Mixfile do
def project do
[
...,
escript: escript(),
default_task: "escript.build",
]
end
defp escript do
[main_module: M.CLI]
end
end
# in m.ex
defmodule M do
...
end
defmodule M.CLI do
def main(args) do
string = hd(args)
IO.puts M.f(string)
end
end
Option 2: mix run
This requires a little extra typing — I would like to move the IO.puts inside the code if possible. This approach avoids having to update mix.exs which is nice.
From the shell
% mix run -e 'IO.puts M.f "some_user_string"'
Is there an easier / quicker way to do this?
Marked As Solved
NobbZ
Option 3: an *.exs
Just write an *.exs.
# foo.exs
defmodule M do
def f(arg), do: IO.inspect arg
end
System.argv()
|> Enum.inspect(&M.f/1)
Then run it with elixir foo.exs print me
Also Liked
debajit
Just for reference, I ended up using a slightly tweaked syntax:
# foo.exs
defmodule M do
def f(arg) do
"transformed #{arg}"
end
end
[arg1, arg2] = System.argv
IO.puts M.f(arg1)
This allows pattern matching for the command line args, and it fails when an incorrect number of args is specified.







