Часть 1 — Основы

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

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

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

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

Экосистема Erlang обширна и включает в себя Elixir, LFE, Alpaca, Prolog, Luerl (Lua).
Некоторые компании используют Elixir в производстве, например Heroku, Discord и change.org. Apple и Adobe также используют Elixir в некоторых своих API.

Установить эликсир

Для macOS использовать Homebrew очень просто:

Для Ubuntu или Debian это тоже очень просто:

После установки Elixir мы можем использовать его командную строку или интерактивную консоль Elixir, просто написав iex.

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

Живая книга (Jupyter для Elixir)

Это весьма полезно для прототипирования кодовых решений, как и Jupyter с Python. Есть много способов установить Livebook на Mac. Файлы уже упакованы в dmg, поэтому просто скачайте их и переместите в папку приложений.

Установить его с помощью Elixir тоже очень просто. Эликсир поставляется с менеджером пакетов, таким как npm или pip, который называется mix (а для Erlang есть hex).

Отличительной особенностью Livebook является то, что мы можем добавлять подключения к базам данных и графикам в ячейках, отличных от ячеек кода. Их называют умными ячейками.

Основные типы данных

Давайте рассмотрим несколько примеров с основными типами Эликсира:

Сложения, вычитания и умножения точно такие же, как и в других языках программирования; однако подразделения всегда возвращают число с плавающей запятой. Чтобы избежать этого, мы используем функцию модуля ядра (которая импортируется самостоятельно) с именем div/2.

Как и в Ruby, в функциях скобки необязательны, например:

Функции хранятся в модулях. Чтобы идентифицировать и задокументировать их, анатомия выглядит следующим образом:

Единственный модуль, который является самоимпортирующимся, как я уже упоминал, — это модуль ядра.

Внутри Livebook некоторые помощники позволяют нам просматривать документацию очень интуитивно понятным и удобным способом. Размещаем название модуля, и наводим мышкой. Это приносит нам не только документацию, но и неплохие примеры.

Атомы или символы

Это переменные, значение которых совпадает с именем переменной. Вот пример кода:

С атомами можно производить несколько операций, например, сравнения.

В Elixir и Erlang атомы обычно выражают статус операции, чаще всего с помощью :ok и :error.

Логические значения являются атомами, но для удобства они обрабатываются без двоеточия в начале.

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

Струны

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

Для обработки строк мы используем модуль String. Например, они могут помочь нам узнать длину строки и несколько интересных функций, таких как верхний регистр.

Анонимные функции, списки и кортежи

Анонимные функции разделены ключевыми словами fn и end. Эти анонимные функции, как и в JavaScript, мы можем сохранить в переменной. Давайте посмотрим на пример:

Способ выполнения этой функции — с помощью точки и аргументов в скобках.

Как и в случае с логическими значениями, мы можем проверить, является ли наша переменная add функцией, с помощью другой функции с именем is_function.

Мы также можем видеть, сколько аргументов получает функция. Чтобы проверить количество аргументов, мы передаем ему следующее:

Закрытия

Они могут обращаться к переменным в рамках исходной функции. Например:

Объем функций

Функция не может переопределить переменную, которая не входит в область действия той же функции, давайте сделаем анонимную функцию, не получающую никакого параметра, и выполним ее в той же строке.

Это возвращает значение «привет» (и предупреждение, потому что мы не используем переменную). Мы можем добавить подчеркивание, чтобы избавиться от этого предупреждения.

Если за пределами области действия функции, мы инициализируем переменную другим значением, и мы не будем изменять значение переменной за пределами области действия функции.

Списки

Эликсир использует скобки для указания списка. Вот пример:

В ядре есть функции, которые сообщают нам информацию о наших списках. Код может выглядеть так:

Чтобы объединить два списка, мы используем оператор ++, поэтому у нас есть следующее:

Мы также можем вычесть список из другого списка. Это может выглядеть так:

Однако при этом удаляются только первые элементы, отображаемые в списке. Например:

возвращается к нам:

Операторы над списками в Эликсире всегда возвращают новый список. То есть они не модифицируют существующий список, структуры данных в Эликсире неизменяемы.

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

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

Кортежи

Кортежи — это структуры, подобные спискам. Однако они хранятся в памяти непрерывно, поэтому работают намного быстрее, чем списки. Функция put_elem/3 возвращает новый кортеж с новым элементом в заданной позиции.

Дополнительные операторы и логические значения

Операции с and и or строгие. То есть они оценивают только логические значения. Однако && и || оценивают полное выражение. Давайте посмотрим на пример ниже:

&& у ||

Используется для истинных и ложных значений

Нет

Сравнение

В Эликсире мы можем сравнивать разные типы данных, используя операторы < и >. Причина этого чисто прагматическая, поэтому внутренние алгоритмы Elixir не заботятся о различных типах данных при их упорядочении. Порядок следующий:

В следующем выпуске мы рассмотрим сопоставление с образцом, классный инструмент Elixir.

Ваше здоровье.

Важные ссылки