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]