Начало работы с языком программирования Elixir
Опубликовано: 2022-03-11Если вы читали сообщения в блогах, хакерские новости, ваши любимые твиты разработчиков или слушали подкасты, вы, вероятно, уже слышали о языке программирования Elixir. Язык был создан Хосе Валимом, известным разработчиком в мире открытого исходного кода. Вы можете знать его по фреймворку Ruby on Rails MVC или по рубиновым гемам devise и simple_form, над которыми он и его коллеги из Plataformatec работали последние несколько лет.
По словам Хосе Валима, Elixir родился в 2011 году. У него возникла идея создать новый язык из-за отсутствия хороших инструментов для решения проблем параллелизма в мире ruby. В то время, потратив время на изучение параллелизма и ориентированных на распределенные языки, он нашел два языка, которые ему понравились, Erlang и Clojure, которые работают в JVM. Ему нравилось все, что он видел в языке Erlang (Erlang VM), и он ненавидел то, чего не видел, например, полиморфизм, метапрограммирование и атрибуты расширяемости языка, в которых Clojure был хорош. Итак, Elixir родился с учетом этого, чтобы иметь альтернативу Clojure и динамический язык, который работает на виртуальной машине Erlang с хорошей поддержкой расширяемости.
Elixir описывает себя как динамический, функциональный язык с неизменяемым состоянием и основанным на акторах подходом к параллелизму, предназначенным для создания масштабируемых и удобных в сопровождении приложений с простым, современным и аккуратным синтаксисом. Язык работает в виртуальной машине Erlang, надежной, высокопроизводительной и распределенной виртуальной машине, известной своей малой задержкой и характеристиками отказоустойчивости.
Прежде чем мы увидим код, стоит сказать, что Elixir был принят растущим сообществом. Если вы хотите изучить Эликсир сегодня, вы легко найдете книги, библиотеки, конференции, встречи, подкасты, сообщения в блогах, информационные бюллетени и всевозможные источники обучения, как это было принято создателями Erlang.
Давайте посмотрим код!
Установить Эликсир:
Установка Elixir очень проста на всех основных платформах и на большинстве из них выполняется в одну строку.
Арх Линукс
Эликсир доступен для Arch Linux через официальные репозитории:
pacman -S elixir
Убунту
Установка Elixir в Ubuntu немного утомительна. Но тем не менее это достаточно легко.
wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb && sudo dpkg -i erlang-solutions_1.0_all.deb apt-get update apt-get install esl-erlang apt-get install elixir
ОС Х
Установите Elixir в OS X с помощью Homebrew.
brew install elixir
Встречайте IEx
После завершения установки пришло время открыть вашу оболочку. Вы проведете много времени в своей оболочке, если захотите развиваться в Эликсире.
Интерактивная оболочка Elixir, или IEx, представляет собой REPL (цикл чтения, оценки и печати), в котором вы можете исследовать Elixir. Вы можете вводить туда выражения, и они будут оцениваться, давая вам немедленную обратную связь. Имейте в виду, что ваш код действительно оценивается, а не компилируется, поэтому не запускайте профилирование или тесты производительности в оболочке.
Команда «Перерыв»
Прежде чем запускать IEx REPL, вам нужно знать одну важную вещь — как выйти из него.
Вы, вероятно, привыкли нажимать CTRL+C
, чтобы закрывать программы, работающие в терминале. Если вы нажмете CTRL+C
в IEx REPL, вы откроете меню перерыва. Оказавшись в меню перерыва, вы можете снова нажать CTRL+C
, чтобы выйти из оболочки, а a
нажать .
Я не буду углубляться в функции меню перерыва. Но давайте посмотрим на несколько помощников IEx!
Помощники
IEx предоставляет кучу помощников, чтобы перечислить их все, введите: h()
.
И это то, что вы должны увидеть:
Это одни из моих любимых, думаю, они придутся и вам.
-
h
, как мы только что видели, эта функция напечатает вспомогательное сообщение. -
h/1
— та же самая функция, но теперь она принимает один аргумент.
Например, всякий раз, когда вы хотите увидеть документацию метода String
strip/2
, вы можете легко сделать это:
Вероятно, вторым наиболее полезным помощником IEx, который вы собираетесь использовать при программировании на Эликсире, является c/2
, который компилирует заданный файл эликсира (или список) и ожидает в качестве второго параметра путь для записи скомпилированных файлов.
Допустим, вы работаете над одним из http://exercism.io/ упражнений Эликсира, упражнением Анаграммы.
Итак, вы реализовали модуль Anagram
, у которого есть метод match/2
в файле anagram.exs. Как хороший разработчик, вы написали несколько спецификаций, чтобы убедиться, что все работает так, как вы ожидаете.
Вот как выглядит ваш текущий каталог:
Теперь, чтобы запустить ваши тесты для модуля Anagram, вам нужно запустить/скомпилировать тесты.
Как вы только что видели, чтобы скомпилировать файл, просто вызовите исполняемый файл elixir
, передав в качестве аргумента путь к файлу, который вы хотите скомпилировать.
Теперь предположим, что вы хотите запустить IEx REPL с модулем Anagram, доступным в контексте сеанса. Есть два часто используемых варианта. Во-первых, вы можете запросить файл, используя параметры -r
, что-то вроде iex -r anagram.exs
. Второй можно скомпилировать прямо из сеанса IEx.
Просто, вот так!
Хорошо, а если вы хотите перекомпилировать модуль? Следует ли выйти из IEx, снова запустить его и снова скомпилировать файл? Неа! Если у вас хорошая память, вы помните, что когда мы перечисляли все помощники, доступные в IEx REPL, мы видели что-то о команде перекомпиляции. Давайте посмотрим, как это работает.
Обратите внимание, что на этот раз вы передали в качестве аргумента сам модуль, а не путь к файлу.
Как мы видели, в IEx есть множество других полезных помощников, которые помогут вам лучше изучить и понять, как работает программа на Эликсире.

Основы типов эликсиров
Числа
Есть два типа чисел. Целые числа произвольного размера и числа с плавающей запятой.
Целые числа
Целые числа могут быть записаны в десятичной системе счисления, шестнадцатеричной, восьмеричной и двоичной.
Как и в Ruby, вы можете использовать подчеркивание для разделения групп из трех цифр при написании больших чисел. Например, вы можете получить сто миллионов следующим образом:
100_000_000
Восьмеричный:
0o444
Шестнадцатеричный:
0xabc
Бинарный:
0b1011
Плавает
Floare имеют двойную точность IEEE 754. Они имеют 16-значную точность и максимальный показатель порядка 10308.
Поплавки записываются с использованием десятичной точки. До и после точки должна быть хотя бы одна цифра. Вы также можете добавить конечную экспоненту. Например, 1.0, 0.3141589e1 и 314159.0-e.
Атомы
Атомы — это константы, представляющие имена. Это неизменяемые ценности. Вы пишете атом с начальным двоеточием :
и последовательностью букв, цифр, знаков подчеркивания и знаков @
. Вы также можете написать их с начальным двоеточием :
и произвольной последовательностью символов, заключенной в кавычки.
Атомы — очень мощный инструмент, они используются для ссылки на функции erlang, а также на ключи и методы Elixir.
Вот несколько действительных атомов.
:name, :first_name, :"last name", :===, :is_it_@_question?
Булевы значения
Конечно, логические значения — это истинные и ложные значения. Но самое приятное в них то, что в конце концов они всего лишь атомы.
Струны
По умолчанию строки в Elixir совместимы с UTF-8. Чтобы использовать их, вы можете иметь произвольное количество символов, заключенных в "
или '
. Вы также можете иметь интерполированные выражения внутри строки, а также экранированные символы.
Имейте в виду, что строки в одинарных кавычках на самом деле представляют собой список двоичных файлов.
Анонимные функции
Как функциональный язык, Эликсир имеет анонимные функции в качестве базового типа. Простой способ написать функцию — fn (argument_list) -> body end
. Но у функции может быть несколько тел с несколькими списками аргументов, защитными предложениями и т. д.
Дэйв Томас в книге Programming Elixir предлагает рассматривать fn…end как кавычки, окружающие строковый литерал, где вместо строкового значения мы возвращаем функцию.
Кортежи
Tuple — это неизменяемый индексированный массив. Они быстро возвращают свой размер и медленно добавляют новые значения из-за своей неизменной природы. При обновлении кортежа вы фактически создаете совершенно новую копию самого кортежа.
Кортежи очень часто используются в качестве возвращаемого значения массива. При написании кода на Эликсире вы очень часто будете видеть это {:ok, something_else_here}
.
Вот как мы пишем кортеж: {?a,?b,?c}
.
Сопоставление с образцом
Я не смогу объяснить все, что вам нужно знать о сопоставлении с образцом, однако то, что вы собираетесь прочитать, охватывает многое из того, что вам нужно знать, чтобы начать.
Эликсир использует =
в качестве оператора сопоставления. Чтобы понять это, нам как бы нужно разучиться тому, что мы знаем о =
в других традиционных языках. В традиционных языках оператор равенства используется для присваивания. В Эликсире операторы равенства предназначены для сопоставления с образцом.
Итак, вот как это работает со значениями в левой части. Если они являются переменными, они привязаны к правой части, если они не являются переменными, elixir пытается сопоставить их с правой частью.
Пин-оператор
Эликсир предоставляет способ всегда принудительно сопоставлять шаблоны с переменной в левой части, оператором булавки.
Списки
В Эликсире списки выглядят как массивы, какими мы знаем их из других языков, но это не так. Списки — это связанные структуры, состоящие из головы и хвоста.
Списки ключевых слов
Списки ключевых слов — это список пар кортежей.
Вы просто записываете их в виде списков. Например: [{:один, 1}, 2, {:три, 3}]. Есть ярлык для определения списков, вот как он выглядит: [один: 1, три: 3].
Чтобы получить элемент из списка ключевых слов, вы можете использовать:
Keyword.get([{:one, 1}, 2, {:three, 3}], :one)
Или используйте ярлык:
[{:one, 1}, 2, {:three, 3}][:one]
Поскольку списки ключевых слов медленны при извлечении значения, это дорогостоящая операция, поэтому, если вы храните данные, требующие быстрого доступа, вы должны использовать карту.
Карты
Карты — это эффективный набор пар ключ/значение. Ключ может иметь любое значение, которое вы хотите использовать в качестве ключа, но обычно он должен быть того же типа. В отличие от списков ключевых слов, Карты допускают только одну запись для данного ключа. Они эффективны по мере роста, и их можно использовать в сопоставлении шаблонов Elixir в картах общего назначения, когда вам нужен ассоциативный массив.
Вот как вы можете написать карту:
%{ :one => 1, :two => 2, 3 => 3, "four" => 4, [] => %{}, {} => [k: :v]}
Заключение
Эликсир великолепен, прост для понимания, имеет простые, но мощные типы и очень полезные инструменты, которые помогут вам в начале обучения. В этой первой части мы рассмотрели различные типы данных, на которых построены программы Elixir, и операторы, которые их приводят в действие. В последующих частях мы углубимся в мир Эликсира — функционального и параллельного программирования.