Последние несколько дней понемногу читаю книженцию по ерлангу (давно собирался, но начал вот только-только). Очень рад, что я знаю и пользуюсь Питоном, а не каким-нибудь Перлом или C# - намного легче воспринимается передача функции в функцию, сами высокоуровневые функции - все эти filter
, map
.
Однако одна штука заставила меня попотеть - в книге lists:filter (кстати, интересно, что в ерланге не надо, как в питоне, очевидно импортировать модули - просто вызываешь, и всё) всегда вызывался вместе с fun
(анонимной функцией, та же lambda
, только покруче ;). Т.е.
lists:filter(fun(X) -> X rem 2 == 0, lists:seq(1, 10)).
И когда я пытался кинуть туда свою функцию, оно мне говорило invalid expression
. :\ Такой вот код никак не работал:
is_even(X) -> X rem 2 == 0.
lists:filter(is_even, lists:seq(1, 10)).
И поиски мануала, как всегда в первый раз, приводили к тому, чему я знаю. :( Когда что-то знаешь - найти легко, а когда не понимаешь сути проблемы - начинается подбор кода к гуглю, чтоб выдал необходимое. :) В конце-концов, разобрался:
lists:filter(fun is_even/1, lists:seq(1, 10)).
Вообще вот эта штука - /1
(arity
, как её в ерланге называют, или просто количество параметров) - довольно прикольная вещь. В питоне это всё реализуется опциональными параметрами, а в ерланге - просто разные функции для разного количества параметров (практически перегрузка из ООП). В некоторых случаях это будет давать несколько больше кода, в некоторых - меньше, но в сочетании с pattern matching
‘ом это всё пока для меня выглядит феноменально. :)
P.S. Самое смешное, что у меня пока не получается создавать функции в интерпретаторе. Только написав отдельные модули. :(
P.P.S. Немного не хватает фич ipython’а и самодокументируемости.
P.P.P.S. Решение первых двух задач из проекта Эйлера помогает запомнить основные приёмы и синтаксис очень порядочно. :)