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]

Comments

comments


Bookmark and Share