Книжная полка Сохранить
Размер шрифта:
А
А
А
|  Шрифт:
Arial
Times
|  Интервал:
Стандартный
Средний
Большой
|  Цвет сайта:
Ц
Ц
Ц
Ц
Ц

Введение в Elixir: введение в функциональное программирование

Покупка
Артикул: 688699.02.99
Доступ онлайн
699 ₽
В корзину
Красивый, мощный и компактный, язык программирования Elixir отлично подходит для изучения функционального программирования, и это практическое руководство покажет, насколько широкими возможностями он обладает. В книге рассказано, как Elixir сочетает в себе надежность языка функционального программирования Erlang с подходом, свойственным языку Ruby, а также мощную поддержку макросов для метапрограммирования. В итоге вы поймете, почему на Elixir так просто писать параллельные, надежные и отказоустойчивые программы, которые легко масштабируются как вверх, так и вниз!
Сенлорен, С. Введение в Elixir: введение в функциональное программирование / С. Сенлорен Д. Эйзенберг ; пер. с анг. А.Н. Киселева. - Москва : ДМК Пресс, 2017. - 262 с. - ISBN 978-5-97060-518-9. - Текст : электронный. - URL: https://znanium.com/catalog/product/1027766 (дата обращения: 07.05.2024). – Режим доступа: по подписке.
Фрагмент текстового слоя документа размещен для индексирующих роботов. Для полноценной работы с документом, пожалуйста, перейдите в ридер.
Симон Сенлорен и Дэвид Эйзенберг

Введение в Elixir

Simon St. Laurent and J. David Eisenberg

INTRODUCING ELIXIR

Getting Started  
in Functional Programming 

Second Edition

Beijing • Boston • Farnham • Sebastopol • Tokyo   

Симон Сенлорен и Дэвид Эйзенберг

ВВЕДЕНИЕ В ELIXIR

Введение в функциональное  

программирование

Москва, 2017

УДК 004.438Elixir
ББК 32.973.3

С31

Сенлорен С., Эйзенберг Д.

C31
Введение в Elixir: введение в функциональное программирование / пер. с анг. А. Н. Киселева – М.: ДМК Пресс, 2017. – 262 с.: 
ил.

ISBN 978-5-97060-518-9

Красивый, мощный и компактный, язык программирования Elixir отлично 

подходит для изучения функционального программирования, и это практическое 
руководство покажет, насколько широкими возможностями он обладает. В книге 
рассказано, как Elixir сочетает в себе надежность языка функционального программирования Erlang с подходом, свойственным языку Ruby, а также мощную 
поддержку макросов для метапрограммирования.

В итоге вы поймете, почему на Elixir так просто писать параллельные, надеж
ные и отказоустойчивые программы, которые легко масштабируются как вверх, 
так и вниз!

УДК 004.438Elixir
ББК 32.973.3

Authorized Russian translation of the English edition of Introducing Elixir, 

2nd Edition, ISBN 9781491956779 © 2017 Simon St. Laurent, J. David Eisenberg. 
This translation is published and sold by permission of O’Reilly Media, Inc., which 
owns or controls all rights to publish and sell the same. 

Все права защищены. Любая часть этой книги не может быть воспроиз
ведена в какой бы то ни было форме и какими бы то ни было средствами без 
письменного разрешения владельцев авторских прав.

Материал, изложенный в данной книге, многократно проверен. Но по
скольку вероятность технических ошибок все равно существует, издательство 
не может гарантировать абсолютную точность и правильность приводимых 
сведений. В связи с этим издательство не несет ответственности за возможные 
ошибки, связанные с использованием книги.

ISBN 978-1-491-95677-9 (анг.)
© 2017 Simon St. Laurent and J. David Eisenberg

ISBN 978-5-97060-518-9 (рус.)
© Оформление, издание, ДМК Пресс, 2017

Содержание

Предисловие .......................................................................................................10

Глава 1. Устраиваемся поудобнее .................................................19
Установка ......................................................................................................................19

Установка Erlang ...................................................................................................19
Установка Eli xir .....................................................................................................20

Запуск ............................................................................................................................21
Первые шаги ................................................................................................................22

Навигация по тексту и истории команд .......................................................23
Навигация по файлам .........................................................................................23

Сделаем что-нибудь ..................................................................................................24
Вызов функций ...........................................................................................................25
Числа в Eli xir ...............................................................................................................26
Работа с переменными в оболочке .......................................................................28

Глава 2. Функции и модули ...................................................................31
Игры с fn ........................................................................................................................31
И & ..................................................................................................................................33
Определение модулей ..............................................................................................34
От модулей к свободным функциям ...................................................................38
Деление кода на модули ..........................................................................................38
Комбинирование функций с помощью оператора конвейера ....................40
Импортирование функций .....................................................................................41
Значения по умолчанию для аргументов ..........................................................42
Документирование кода ..........................................................................................43

Документирование функций ............................................................................44
Документирование модулей .............................................................................46

Глава 3. Атомы, кортежи и сопоставление  
с образцом ............................................................................................................48
Атомы .............................................................................................................................48
Сопоставление с образцом и атомы .....................................................................49
Логические атомы ......................................................................................................50

 Содержание

Ограничители ..............................................................................................................52
Обозначайте подчеркиванием все, что не важно ............................................55
Структуры данных: кортежи ..................................................................................57

Сопоставление с образцом и кортежи ...........................................................58
Обработка кортежей ............................................................................................59

Глава 4. Логика и рекурсия ...................................................................62
Логика внутри функций ..........................................................................................62

Конструкция case ..................................................................................................62
Конструкция cond .................................................................................................65
if или else ..................................................................................................................66
Присваивание значений переменным в конструкциях case и if ...........68

Самый желательный побочный эффект: IO.puts ............................................69
Простая рекурсия .......................................................................................................71

Обратный отсчет ...................................................................................................71
Прямой отсчет ........................................................................................................73
Рекурсия с возвратом значения .......................................................................74

Глава 5. Взаимодействие с человеком .....................................79
Строки ............................................................................................................................79
Многострочные строки ............................................................................................82
Юникод ..........................................................................................................................82
Списки символов .......................................................................................................83
Строковые метки ........................................................................................................84
Запрос информации у пользователя ...................................................................85

Ввод символов .......................................................................................................85
Чтение строк текста .............................................................................................86

Глава 6. Списки .................................................................................................91
Основы списков ..........................................................................................................91
Деление списков на головы и хвосты .................................................................93
Обработка содержимого списков .........................................................................94
Создание списка из головы и хвоста ...................................................................96
Смешивание списков и кортежей ........................................................................99
Создание списка списков ........................................................................................99

Глава 7. Пары имя/значение ............................................................103
Списки ключей ........................................................................................................103
Списки кортежей с несколькими ключами ...................................................105

Содержание  7

Словари ......................................................................................................................106
От списков к отображениям ................................................................................107

Создание отображений ....................................................................................108
Изменение отображений .................................................................................108
Чтение отображений .........................................................................................109

От отображений к структурам ...........................................................................109

Объявление структур ........................................................................................110
Создание и чтение экземпляров структур .................................................110
Использование структур в сопоставлениях с образцом .......................111
Использование структур в функциях..........................................................112
Добавление поведения в структуры .............................................................114
Расширение существующих протоколов....................................................116

Глава 8. Функции высшего порядка  
и генераторы списков ..............................................................................118
Простые функции высшего порядка .................................................................118
Создание новых списков с помощью функций высшего порядка .........121

Получение информации о списке ................................................................121
Обработка элементов списка с помощью функций ...............................122
Фильтрация значений в списках ..................................................................123

За пределами возможностей генераторов списков .....................................124

Проверка списков ..............................................................................................124
Разбиение списков ............................................................................................125
Свертка списков .................................................................................................126

Глава 9. Процессы ......................................................................................129
Интерактивная оболочка – это процесс ..........................................................129
Порождение процессов из модулей ..................................................................132
Легковесные процессы ..........................................................................................135
Регистрация процесса ............................................................................................136
Когда процесс останавливается .........................................................................137
Взаимодействие между процессами .................................................................138
Наблюдение за процессами .................................................................................141

Наблюдение за движением сообщений между процессами ................143

Разрыв и установка связей между процессами ............................................145

Глава 10. Исключения, ошибки и отладка ...........................152
Виды ошибок ............................................................................................................152
Восстановление работоспособности после ошибок времени  
выполнения ...............................................................................................................153

 Содержание

Журналирование результатов выполнения и ошибок ...............................156
Трассировка сообщений ........................................................................................157
Трассировка вызовов функций ..........................................................................159

Глава 11. Статический анализ, спецификации  
типов и тестирование ..............................................................................161
Статический анализ ...............................................................................................161
Спецификации типов ............................................................................................164
Модульные тесты ....................................................................................................167
Настройка тестов ....................................................................................................170
Встраивание тестов в документацию ...............................................................172

Глава 12. Хранение структурированных данных ..........173
Записи: структурирование данных до появления структур ....................173

Определение записей .......................................................................................174
Создание и чтение записей .............................................................................175
Использование записей в функциях ...........................................................177

Сохранение данных в долговременном хранилище Erlang ......................179

Создание и заполнение таблицы ..................................................................181
Простые запросы ................................................................................................187
Изменение значений .........................................................................................187
Таблицы ETS и процессы ................................................................................188
Следующие шаги ................................................................................................190

Хранение записей в Mnesia .................................................................................191

Настройка базы данных Mnesia ....................................................................191
Создание таблиц.................................................................................................192
Чтение данных ....................................................................................................196

Глава 13. Основы OTP ..............................................................................198
Создание служб с помощью GenServer ...........................................................199
Простой супервизор ...............................................................................................204
Упаковка приложения с помощью Mix ...........................................................209

Глава 14. Расширение языка Eli xir  
с помощью макросов ...............................................................................213
Функции и макросы ...............................................................................................213
Простой макрос .......................................................................................................214
Создание новой логики .........................................................................................216
Программное создание функций .......................................................................217
Когда (не) следует использовать макросы .....................................................219

Содержание  9

Глава 15. Phoenix .........................................................................................221
Установка базовых компонентов фреймворка ..............................................221
Структура простого Phoenix-приложения .....................................................224
Представление страницы .....................................................................................224

Маршрутизация .................................................................................................225
Простой контроллер .........................................................................................227
Простое представление ....................................................................................228

Вычисления ...............................................................................................................230
Продвижение Eli xir ................................................................................................237

Приложение А. Каталог элементов языка Eli xir .............239
Команды интерактивной оболочки ..................................................................239
Зарезервированные слова ....................................................................................240
Операторы .................................................................................................................241
Ограничители ...........................................................................................................243
Часто используемые функции ............................................................................244

Приложение В. Создание документации  
с помощью ExDoc ........................................................................................247
Использование ExDoc вместе с Mix .................................................................247

Предметный указатель ..........................................................................251

Об авторах ..........................................................................................................259

Колофон ................................................................................................................260

Предисловие

Язык Eli xir предлагает разработчикам мощь функционального и конкурентного языка программирования Erlang, но с более дружественным синтаксисом, обширным набором библиотек и средствами 
метапрограммирования. Программный код на языке Eli xir компилируется в байт-код Erlang, что позволяет объединять его с программным кодом, написанным на Erlang, и использовать инструменты Erlang. Однако, несмотря на общий фундамент, Eli xir создает ощущение 
совершенно другого языка, более похожего, пожалуй, на Ruby, чем на 
Prolog, предшественника Erlang.
Книга «Введение в Eli xir» познакомит вас с этим мощным языком. 

 Это издание книги «Введение в Eli xir» охватывает версию 1.4 языка. 
Мы будем обновлять и дополнять его по мере развития Eli xir. Если 
вы найдете ошибки или опечатки, сообщите нам, воспользовавшись 
системой учета ошибок.

Кому адресована эта книга

Эта книга адресована в основном тем, кто имеет опыт программирования на других языках, но ищет чего-то нового. Может быть, вас 
интересует весьма практичная и распределенная модель программирования, обладающая преимуществами масштабирования и высокой надежности. Может быть, вы хотите увидеть и понять, что такое 
«функциональное программирование». Или просто желаете познакомиться с чем-то новым без конкретной цели.
Мы полагаем, что функциональный стиль программирования стал 
намного более доступным гораздо раньше, чем вы научились программировать с использованием других парадигм. Однако знакомство с Eli xir – а иногда даже просто его установка – требует немалых 
навыков. Поэтому, если вы вообще не имеете опыта программирования, добро пожаловать на борт, но имейте в виду, что по пути вам 
встретится немало сложностей.

Что даст вам эта книга  11

Для кого эта книга не предназначена

Эта книга не предназначена тем, кто торопится достичь поставленной 
цели.
Если вы уже знакомы с языком Eli xir, эта книга, скорее всего, вам 
не нужна, только если вы не ищете неторопливого, постепенного введения.
Если вы уже знакомы с языком Erlang, эта книга поможет вам 
увидеть отличия, но, скорее всего, ключевые понятия, обсуждаемые 
здесь, вам уже знакомы.
Если вы уже знакомы с функциональными языками программирования, это введение покажется вам слишком медленным. Если вы заскучаете, читая эту книгу, смело откладывайте ее в сторону и обратитесь к какой-нибудь другой книге или к электронной документации, 
рассказывающей о языке в более быстром темпе.

Что даст вам эта книга

С помощью этой книги вы научитесь писать простые программы на 
Eli xir. Узнаете, почему Eli xir упрощает создание надежных и легко 
масштабируемых программ. Здесь вы познакомитесь с терминологией, благодаря чему сможете читать другие ресурсы с информацией 
о языке Eli xir, которые требуют определенного опыта для их понимания.
В теоретическом отношении вы познакомитесь с функциональным 
программированием. Узнаете, как проектировать программы, основанные на передаче сообщений и рекурсии, и как создавать программы для обработки потоков данных.
Самое важное: эта книга откроет ворота в мир разработки конкурентных программ. Даже притом, что это введение познакомит вас 
лишь с самыми основами открытой телекоммуникационной платформы (Open Telecom Platform, OTP), знание этих основ поможет 
вам открыть для себя новый, удивительный мир. После овладения 
синтаксисом и приемами структурирования программ на языке Elixir вы сможете приступить к созданию надежных и масштабируемых 
приложений, и это потребует от вас намного меньше усилий, чем при 
использовании других подходов!

 Предисловие

Как читать эту книгу

Эта книга рассказывает историю появления языка Eli xir. Наибольшую пользу вы получите, если будете читать все по порядку, хотя бы 
первый раз, однако вы можете читать выборочно и возвращаться к непрочитанным главам, если почувствуете, что это необходимо.
Сначала вы установите Eli xir и опробуете его интерактивную оболочку IEx. В этой оболочке вы будете проводить много времени, поэтому постарайтесь овладеть ею в полной мере, чтобы чувствовать 
себя в ней уютно. Затем вы научитесь загружать программный код 
в оболочку, чтобы получить возможность писать программы за ее 
пределами, и узнаете, как вызывать и смешивать этот код.
Вы детально изучите числа, потому что это самые простые представители базовых структур в Eli xir. Затем вы познакомитесь с атомами, 
конструкциями сопоставления с образцом и ограничителями – наиболее распространенными элементами программ. После этого вы перейдете к строкам, спискам и рекурсии, лежащей в основе Eli xir. Преодолев несколько тысяч рекурсий вниз и назад, вы перейде те к процессам, 
ключевым элементам Eli xir, которые используют модель обмена сообщениями для поддержки конкуренции и отказоустойчивости.
После освоения основ вы займетесь более детальным изучением приемов отладки и хранения данных, а затем познакомитесь с комп лектом 
инструментов, которые пригодятся вам в разработке программ на языке Eli xir: открытой телекоммуникационной платформой (Open Telecom 
Platform, OTP) языка Erlang, которая охватывает не только телефоны.
Наконец, вы освоите макросы, средства, придающие языку Eli xir 
огромную гибкость и позволяющие расширять его.
Некоторые предпочитают изучать языки программирования, знакомясь с его словарем, списками операторов, управляющих структур 
и типов данных. Эти списки также приводятся в книге, но они находятся не в основном тексте книги, а в приложении A.
Главное, что должна дать вам эта книга, – научить вас программированию на языке Eli xir. Если вы этого не получили, дайте нам знать!

Другие ресурсы

Эта книга, возможно, не лучший для вас способ изучить язык Eli xir. 
Все зависит от того, чему вы хотите научиться и как вы привыкли 
осваи вать что-то новое. Если вы ищете скоростное введение в язык, 
обратите внимание на книгу «Programming Eli xir» (Pragmatic Publishers), в которой вы быстро познакомитесь с отличительными чер
Другие ресурсы

13

тами Elixir. Похожее быстрое и более глубокое введение в Elixir вы 
также найдете в книгах «Elixir in Action» (Manning) и «The Little 
Elixir & OTP Guidebook» (Manning). Книга «Metaprogramming Elixir» (Pragmatic Publishers) исследует ключевые возможности языка, 
а книга «Programming Phoenix» (Pragmatic Publishers) подробно опи­
сывает мощный фреймворк на основе Elixir.

Если вам понравятся неспешность и основательность этой книги 

и у вас появится желание продолжить обучение в том же духе, обратите внимание на книгу «Études for Elixir» (O’Reilly). В ней вы найдете описания коротких программ, которые сможете сами написать 
на Elixir, более сложные, чем примеры в данной книге. Кроме того, ее 
структура очень похожа на структуру данной книги.
Существует также множество книг, но посвященных не Elixir, 

а языку Erlang. Однако мы надеемся, что в ближайшее время появится множество новых книг об Elixir. На сайте проекта Elixir вы найдете 
много руководств, документацию и ссылки на другие ресурсы.

Если в изучении Elixir вами движет желание вырваться из наезженной колеи, обязательно прочитайте книгу Брюса Тейта (Bruce Tate) 
«Seven Languages in Seven Weeks» (Pragmatic Publishers)1, в которой 
дается обзор языков Ruby, Io, Prolog, Scala, Erlang, Clojure и Haskell. 
Описание Erlang в ней занимает всего 30 с небольшим страниц, но 
вполне возможно, что это именно то, что вам нужно.

Книги о языке Erlang тоже могут помочь понять, что делает Elixir 
таким замечательным.

Простое введение в Erlang, во многом похожее на эту книгу, вы найдете в книге «Introducing Erlang» (O’Reilly), которая познакомит вас 
с Erlang и функциональным программированием.

Попробуйте прочитать электронную версию книги (которую можно также приобрести в бумажном варианте, выпущенном издательством No Starch Books) с остроумными и забавными иллюстрациями 
«Learn You Some Erlang for Great Good»2!

Также можно порекомендовать классические книги об Erlang 

с похожими названиями: «Programming Erlang» (Pragmatic Publishers) и «Erlang Programming»3 (O’Reilly). Они очень похожи и во 

1
Тeйт Б. Семь языков за семь недель. М.: ДМК Пресс, 2014. 384 с. – Прим. 
перев.

2
Хеберт Ф. Изучай Erlang во имя добра! М.: ДМК Пресс, 2014. 688 c. – 
Прим. перев.

3
Чезарини Ф. Программирование в Erlang. М.: ДМК Пресс, 2015. 488 с. – 
Прим. перев.

 Предисловие

многом перекликаются друг с другом, и обе могут послужить прекрасными руководствами, если эта книга покажется вам слишком 
медлительной или если вам требуется руководство, которое можно 
использовать как справочник. «Erlang Programming» имеет более 
практическую направленность, тогда как «Programming Erlang» описывает множество деталей, касающихся настройки окружения для 
программирования на Erlang.
Более продвинутое руководство «Erlang and OTP in Action» (Manning) начинается с краткого 72-страничного введения в Erlang и затем обстоятельно описывает применение открытой телекоммуникационной платформы, фреймворка на языке Erlang для создания легко 
обслуживаемых и расширяемых конкурентных приложений. «Designing for Scalability with Erlang/OTP»1 (O’Reilly) исследует применение OTP и Erlang для решения задач, которые выглядят чрезвычайно сложными в других окружениях.
Посетите также веб-сайт проекта Erlang2, где вы найдете последние 
обновления, документацию, примеры и многое другое.

Eli xir изменит вас

Прежде чем вы продолжите, мы хотим предупредить вас, что использование языка Eli xir может кардинально изменить ваши взгляды на 
программирование. Обычное для этого языка сочетание функционального кода, обработки, ориентированной на процессы, и распределенных вычислений в первый момент может показаться чем-то чужеродным. Однако знакомство с Eli xir может изменить ваши подходы 
к решению задач (причем они могут существенно отличаться от подходов, принятых в языке Erlang) и даже осложнить возврат к другим 
языкам, окружениям и культурам программирования.

Типографские соглашения

В этой книге приняты следующие типографские соглашения:

Курсив
Используется для обозначения новых терминов, адресов электронной почты, имен файлов и расширений имен файлов. 

1 Чезарини Ф., Виноски С. Проектирование масштабируемых систем с помощью Erlang/OTP. М.: ДМК Пресс, 2017. 486 c. – Прим. перев.

2 http://www.erlang.org/.

Использование программного кода примеров  15

Моноширинный шрифт
Применяется для оформления листингов программ и программных элементов внутри обычного текста, таких как имена переменных 
и функций, инструкций и ключевых слов.

Моноширинный жирный
Обозначает команды или другой текст, который должен вводиться 
пользователем.

Моноширинный курсив
Обозначает текст, который должен замещаться фактическими 
значениями, вводимыми пользователем или определяемыми из контекста.

 Так обозначаются советы, предложения и примечания общего характера.

 Так обозначаются предупреждения и предостережения.

 Так выделяются советы и предложения.

Использование программного кода 
примеров

В этой книге приводится множество примеров, цель которых – познакомить вас с основными идеями. Примеры сделаны максимально 
короткими, чтобы вам проще было видеть отличия между ними. Вы 
можете свободно использовать примеры программного кода из этой 
книги, как посчитаете нужным, но вы не сможете взять код из этой 
книги и составить из него законченное приложение (если только не 
испытываете особую нежность к вычислениям скоростей свободно 
падающих объектов). Тем не менее примеры помогут вам выяснить 
шаги, которые необходимо проделать для создания приложения. Код 
примеров можно загрузить из репозитория GitHub1. (Он также доступен по ссылке Examples в каталоге издательства2.)
Данная книга призвана оказать вам помощь в решении ваших задач. Вам не нужно обращаться в издательство за разрешением, если 

1 https://github.com/simonstl/introducing-elixir.

2 http://shop.oreilly.com/product/0636920050612.do.

Доступ онлайн
699 ₽
В корзину