Статьи

Рубиновые очки: эликсир

Сегодня выходит наш первый пост в новой продолжающейся серии под названием Ruby Coloured Glasses . Цель этой серии — кратко изучить интересные предметы вне сообщества Ruby. Эти предметы могли влиять или находились под влиянием Руби. Здесь, в Rubysource, мы считаем важным осмотреться и посмотреть, чему мы можем научиться у других сообществ. Наслаждаться.

Одна из самых приятных вещей в Ruby — это элегантный синтаксис и удобство для разработчиков. Так как же подходит Эрланг? Оказывается, блестящее бразильское имя Хосе Валим решил посмотреть на Эрланга сквозь цветные очки Руби.

Несмотря на то, что ему 25 лет, Erlang обладает некоторыми интересными характеристиками, которые характерны для современных блогов:

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

Эликсир

Хосе является лауреатом премии Rubyist и решил посвятить некоторое время изучению других языков программирования, включая Erlang. После игры вокруг, Хосе решил создать свой собственный язык, надмножество эрланга по имени Эликсир . Его описание на GitHub кратко описывает его как предоставление,

Очаровательный синтаксис, диспетчеризация методов и метапрограммирование поверх Erlang VM

Со времени первого коммита GitHub в январе 2011 года было выпущено три релиза (текущая версия 0.3.0 ). Хотя это еще рано, я думаю, что стоит изучить другие языки программирования, особенно те, которые знакомы с разработчиками Ruby.

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

Типы

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

чисел

Целые числа и числа с плавающей запятой — это единственные типы чисел, предоставляемые Elixir, тогда как Ruby имеет пять типов чисел: Integer, Fixnum, Bignum, Float и Rational. Все типичные арифметические операторы работают как положено:

3 + 2  % => 5
2 - 1 % => 1
3 * 3 % => 9
6 / 3 % => 2.0
6 / 4 % => 1.5

% Все, вероятно, выглядит нормально, за одним исключением: почему результат 6/3 в плавающей точке? Получается, что Эрланг всегда возвращает поплавки при выполнении деления . Если вы хотите выполнить целочисленное деление, вы должны использовать оператор 6 / 3divrem

 6 div 3 % => 2
7 rem 2 % => 1

Еще одна интересная особенность — это диспетчеризация методов для типов данных, очень похожих на Ruby:

 5.+ 3 % => 8

Вышеприведенный фрагмент будет работать в Elixir и Ruby, довольно мило, верно?

атомы

Если вы знакомы с символами в Ruby, то атомы уже вылизаны. Атомы — это литералы, значения которых равны их имени, которые также не являются сборщиком мусора (что является аналогичным поведением в Ruby и Erlang).

 'functional
'Functional
'so_very_functional
'"hello windows users"

Булевы

truefalse Вы ожидали чего-то еще? Ну, под покровом значения на самом деле атомы 'true'false Это звучит немного многословно и не соответствует цели Elixir по предоставлению «очаровательного синтаксиса», так что вы можете просто использовать truefalse

Кортеж

Кортежи эквивалентны неизменяемому массиву фиксированного размера.

 x = {1, 2, 3}
x.length   % => 3
x.set 0, 7  % => {7, 2, 3}
x   % => {1, 2, 3}

Обратите внимание, что после создания Tuple Предоставляется метод set В Ruby ближе всего будет замороженный Array

 x = [1, 2, 3]
x.freeze
x[0] = 5     # RuntimeError: can't modify frozen array

Списки

Списки в Elixir очень похожи на Arrays в Ruby, они могут содержать что угодно. На самом деле они имеют очень общий API, посмотрите некоторые примеры Elixir:

 x = [1, 2, 3]
x.length   % => 3
x.map do(val)  % => [3, 6, 9]
  val * 3
end
x.any? do (val)  % => true
  val > 2
end

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

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

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

Для получения дополнительной информации проверьте список источников.

Заказанный Дикт

Как вы уже догадались, OrderedDictHash Это отображение пар ключ-значение, которые упорядочены. Однако, в отличие от Ruby, ключи упорядочиваются не путем вставки, а с использованием правил упорядочения Erlang.

 x = {1: 'a, 5: 'e, 3: 'c}
x.key? 1   % => true
x.key? 9   % => false

Струны

Строки обрабатываются как двоичные файлы UTF-8. Что это обозначает? Хорошо, Elixir хранит строки в виде двоичных файлов, где каждый символ представлен от 1 до 4 байтов. Ruby 1.9, с другой стороны, решил обеспечить большую гибкость при кодировании строк. Строка может быть преобразована между списками символов и строкой с помощью to_char_listto_bin

 x = "hello"
x.to_char_list    % => [104, 101, 108, 108, 111]

[104, 101, 108, 108, 111].to_bin  % => "hello"

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

операторы

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

Срок

Доступны все стандартные операторы термина: ==!=<=<>=> Однако есть два дополнительных оператора, которые могут быть новыми для вас, если, возможно, вы не использовали JavaScript: ===!== Эти два оператора предоставляют возможность проверить, являются ли два значения точно равными или точно не равными друг другу.

 1 == 1   % => true
1 === 1 % => true
1 === 1.0 % => false

Обратите внимание, что 11.0

арифметика

Опять не много нового здесь: +-*/ Однако, если вы хотите выполнить целочисленное деление или получить модуль по модулю, вы можете использовать операторы divrem

 4 div 2   % => 2
5 rem 2  % => 1

Есть и другие операторы, такие как логические и побитовые, которые очень похожи на Ruby .

функции

Естественно, функции играют главную роль в эликсире, в конце концов, это функциональный язык. Функции можно создавать с помощью do->lambda

 sum = do(x, y)
    x + y
end
sum.call 1, 3   % => 4
sum.apply([1,3]) % => 4
sum[4, 2]   % => 6
sum.(9, 1)  % => 10

[1, 2, 3, 4].map -> (val) val * 2  % => [2, 4, 6, 8]

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

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

 strings = ["hello", "everyone", "reading", "this"]
strings.map do (val)   % => [5, 8, 7, 4]
    val.length
end

% or a bit simpler
strings.map -> (val) val.length   % => [5, 8, 7, 4]

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

 strings.map _.length    % => [5, 8, 7, 4]

Довольно мило, правда? Это оно? Конечно, нет. Функции могут быть переданы в качестве аргументов:

 sum = -> (a, b) a + b
double_sum = -> (f, a, b) f.call(a, b) * 2
double_sum.(sum, 5, 3)  % => 16

Конечно, можно узнать больше о функциях, особенно читая источник .

следующий

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

  • сопоставление с образцом
  • исключения
  • вызывая методы erlang

Пожалуйста, оставляйте отзывы о своих мыслях и открытиях, если что-то здорово, что вы уделяете время изучению языков за пределами Ruby.