Как передать отрицательное число в качестве параметра консольной программе erlang

Недавно писал консольную программу, принимающую в качестве аргументов два числа. Столкнулся с тем, что в Erlang не так очевидно и просто передать аргументом отрицательное число. Представим, что у нас есть программа prog, которая вызывается так: erl -noshell -s program 1 -2

В Erlang всё, что начинается с символа "-" рассматривается как флаг: Any argument starting with character - (hyphen) is interpreted as a flag http://erlang.org/doc/man/erl.html#exports

Есть несколько вариантов решения, из них наиболее приемлемые:

1. Использовать флаг -extra.

Всё, что следует за этим флагом, рассматривается как "простые" аргументы и может быть получено через init:get_plain_arguments/0. В свою очередь init:get_plain_arguments() возвращает список. Далее список/строка может быть сконвертировано в число при помощи list_to_integer().

По сути вызов из примера выше необходимо преобразовать в erl -noshell -s program -extra 1 -2

Обработка в функции может быть примерно такой:

args_to_ints() ->
    [FirstArg|SecondArg] = init:get_plain_arguments(),
    FirstNum = list_to_integer(FirstArg),
    SecondNum = list_to_integer(SecondArg),
    [FirstNum, SecondNum].

2. Использовать флаг -eval

-s флаг работает для простых сценариев, но если нужны какие-то более сложные вызовы, то можно попробовать -eval флаг. -s конвертирует все аргументы в атомы, поэтому для чисел это может быть не очень удобно. Можно использовать -run флаг, чтобы передать строки (например, -run program -2, что вызовет program:start("-2")), но передавая строки их придётся парсить самостоятельно. Самый простой и в то же время гибкий способ - это использовать -eval:

erl -noshell -eval "program:start(1, -2)"

Тогда можно исполнять любое Erlang выражение и система самостоятельно распарсит значения.