То, что вы будете делать с циклами в других языках, выполняется с помощью рекурсивных вызовов функций в Erlang. Так что попробуйте что-то вроде этого:
run_forever() ->
Output = os:cmd("curl -v -k -X POST 'https://localhost:8243/raspberrypi/1.0.0/device/vf98e6a7atyp/bulb?state=on' -H 'accept: application/json' -H 'Authorization: Bearer 38180797-3181-3839-900d-bdaf259f056a'"),
io:format("Output from command:~n~s~n", [Output]),
%% Don't want to repeat too quickly! Sleep for five seconds
timer:sleep(5000),
run_forever().
Итак, эта функция что-то делает, а затем вызывает себя в конце. В некоторых других языках вы бы беспокоились о бесконечном росте стека вызовов, но в Erlang есть нечто, называемое «оптимизация хвостового вызова», что означает, что если последнее, что делает функция, это вызывает другую функцию (возможно, саму себя), то стек фрейм текущей функции просто заменяется на фрейм вызываемой функции, а размер стека остается неизменным.
error, = exc.args
Это - случай распаковки последовательности.
Более читаемый способ записать то же и стиль, который я лично одобряю:
[error] = exc.args
Существует два бита, требуемые понять предыдущий пример:
(foo,)
. В большинстве контекстов может быть опущена круглая скобка. В частности, они могут быть опущены рядом с оператором присваивания.Запятая служит для распаковки кортежа, т.е. это извлекает единственный объект кортежа и связывает его с error
. Без запятой Вы связали бы сам кортеж, а не его содержание.
http://www.python.org/doc/2.5.2/tut/node7.html
Ищите "распаковку последовательности" в разделе 5.3.