Erlang. Строки. Работа со списками.

Strings (строки)

Символы в erlang представляются целыми числами, а строки – списками числовых значений ASCII символов. Это связано с тем что erlang пришел из телекома, а там, работа со строками это почти экзотика. Поскольку символы это ASCII, то в 32х разрядной версии для сравнения символа в памяти используется два байта, а в x64 – четыре, что не эффективно, но, насколько я понимаю, эта проблема решается в новых версиях. Разница между атомами, рассмотренными прежде, и строками в том что атомы можно только сравнивать (на манер констант), в то время как со строками можно производить всевозможные операции. Другая разница заключается в объеме памяти, занимаемой эрлангом атомом и строками, а также скорости операции сравнения, – атомы тут, безусловно выигрывают.

Цифровое представление символов можно получить добавив “$” перед символом:

1> $1.
49
2> $1+1.
50
3> $a.
97
4> $a+1.
98

Вот, что представляют из себя строки:

1> "hello".
"hello"
2> "HELLO".
"HELLO"
3> [$H,$e,$l,$l,$o].
"Hello"
4> [$H,$e,108,$l,$n+1].
"Hello"

Обработка списков

Как уже упоминалось разница между кортежами и списками, в первую очередь, в том как они обрабатываются. Кортежи можно разбирать только поэлементно, с то время как списки можно разбивать на списки с “головой” и “хвостом”, пока лист не будет пуст. Это очень популярная в эрланге операция и является чем-то типа аналога цикла.

Например, для списка [1, 2, 3], головой будет являться 1, а хвостом 2, 3. Таким образом все эти списки эквивалентны:

[1, 2, 3] == [1 | [2, 3]] == [1 | [2 | [3]]] == [1 | [2 | [3 | []]]]

Вот еще хороший пример, иллюстрирующий то, как работает оператор “|”

1> [First | Rest] = [1,2,3,4,5].
[1,2,3,4,5]
2> First.
1
3> Rest.
[2,3,4,5]

И еще один, отлично иллюстрирующий идею:

sum([]) -> 0;
sum([Head | Tail]) -> Head + sum(Tail).

sum([2,3,4] = 2 + sum([3,4])
sum([2,3,4] = 2 + sum([3,4]) = 5 + sum([4]) = 9

Функции для работы со списками

1> lists:max([1,2,5,8,4]).
8
2> lists:sort([2,4,1,3,5]).
[1,2,3,4,5]
3> lists:split(2, [1,2,3,4,5]).
{[1,2],[3,4,5]}
4> lists:sum([1,2,3]).
6
5> lists:zip([1,2,3],[5,6,7]).
[{1,5},{2,6},{3,7}]
6> lists:delete(2,[1,2,3]).
[1,3]
7> lists:last([1,2,4,8,5]).
5
8> lists:member(2,[1,3,2]).
true
9> length([1,2,3]).
3

Для работы со списками также есть два оператора ++ и –. Первый складывает два списка, элементы второго списка добавляются в конец первого, а второй извлекает из первого списка элементы переданные во втором. Проще увидеть это на примере:

1> [1,2,3] -- [2,3].
[1]
2> [1,2,3] -- [3,1].
[2]
3> [1,2,3] ++ [3,1].
[1,2,3,3,1]
4> [1,2,3] ++ [1,3,1].
[1,2,3,1,3,1]

Site Footer

Sliding Sidebar

About Me

About Me

For whom this blog for?

For those who are interested in modern Internet technologies, IT business, startups, management, quality control, personal effectiveness, motivation. Here I write about what is interesting, about problems I faced and solutions I found. I hope it will be interesting to you either.

What motivates me to write?

The desire to improve, to study deeper topics that interest me. Find people with similar problems and tasks, together look for ways out and solutions.

Feel free to contact if you have anything to say to me

Old Flash site with my artistic works and misuc.