LINUX.ORG.RU

Вышел Elixir 1.8.0

 , , , ,


0

2

Elixir — динамически типизированный функциональный язык для написания распределенных и параллельных приложений разработанный как альтернатива Erlang и работающий на Erlang VM.

Версия 1.8 содержит множество изменений на уровне инфраструктуры, времени компиляции и добавляет новые возможности интроспектирования системы.

Главные изменения:

  • Кастомизированный вывод структур.

    Теперь можно использовать протокол Inspect для указания полей, которые будут использоваться для форматирования структуры в строку, так что структура

    defmodule User do
      @derive {Inspect, only: [:id, :name, :age]}
      defstruct [:id, :name, :age, :email, :encrypted_password]
    end
    

    будет напечатана следующим образом:

    #User<id: 1, name: "Jane", age: 33, ...>
    
  • Теперь Elixir поддерживает базу часовых поясов

    В языке существуют 4 типа данных для работы со временем: Time, Date, NativeDateTime(время без часового пояса) и DateTime(с часовым поясом). Развитию последнего препятствовало отсутствие поддержки базы часовых поясов.

    Теперь появился интерфейс Calendar.TimeZoneDatabase который позволит разработчикам подключать свои собственные базы часовых поясов. Так же это позволяет добавить новые возможности, в DateTime, например DateTime.shift_zone/3.

    Также добавлены функции Date.day_of_year/1, Date.quarter_of_year/1, Date.year_of_era/1 and Date.day_of_era/1.

  • Добавлен ключ $callers для улучшения возможностей инструментария

    Одним из самых распространенных способов запуска процессов является модуль Task. При этом Elixir сохраняет идентификатор процесса родителя в словаре запущенного процесса по ключу $ancestors. Это позволяет утилитам анализировать систему и прослеживать происхождение различный событий. Однако этого недостаточно, так как часто дочерний процесс запускается не напрямую, а через посредника, например supervisor. В таком случае хоть ваш код и вызывает запуск Task, однако, родителем будет указан процесс супервизора.

    В новой версии Elixir добавлен ключ $callers который указывает на оригинальный процесс, вызвывший запуск Task.

    Например, при таком вызове:

    [your code] -- calls --> [supervisor] ---- spawns --> [task]
    

    В $callers будет сохранен идентификатор изначального процесса:

    [your code]              [supervisor] <-- ancestor -- [task]
         ^                                                  |
         |--------------------- caller ---------------------|
    

>>> Полный список изменений, улучшений и багфиксов

★★★★★

Проверено: Shaman007 ()

Shaman007 перечитал, надо поправить разные моменты:

структур. => структур

Один из самых распространенных => Одним из самых распространенных

запускается не на прямую а через посредника => запускается не напрямую, а через посредника

запуск Task однако родителем => запуск Task, однако, родителем

loz ★★★★★ ()

Кастомизированный вывод структур.

Чушь. Слово «кастомизированный» не существует. Казалось бы, очевидно. Но есть подходящие слова - настраиваемый вывод, форматирование вывода.

Partisan ()
Ответ на: комментарий от Rodegast

Более простой для изучения. И более универсального назначения. Erlang рассчитан на распределённую обработку данных в основном без интерфейса пользователя. К Elixir добавлена поддержка создания веб-страниц с помощью библиотеки Phoenix.

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

Partisan ()
Ответ на: комментарий от Rodegast

У Эликсира в целом лучше инфрактруктура, субъективно тулы для сборки/тестирования/пакетирования более человечно сделаны. Как язык у него больше фич, например модули не ограничены файлами, протокоры позволяют расширения из вне, генерация кода сделана сильно проще чем parse_transform. Строки сделаны нормальным отдельным типом и поддерживают Collection интерфейс, в отличие от списков чисел в Эрланге. Есть множество библиотек адекватных в стандартной либе, например для работы с теми же датами.

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

loz ★★★★★ ()
Последнее исправление: loz (всего исправлений: 1)
Ответ на: комментарий от Partisan

Erlang рассчитан на распределённую обработку данных в основном без интерфейса пользователя. К Elixir добавлена поддержка создания веб-страниц с помощью библиотеки Phoenix.

Не уверен что понимаю что ты имеешь ввиду) что на Эрланге что на Эликсире есть веб фреймворки, а у Эрланга есть даже биндинги к WxWidgets для гуя (привет wings3d).

loz ★★★★★ ()
Ответ на: комментарий от Rodegast

Elixir — это Erlang с плюшками:

  • Гомоиконность, compile-time макросы (по умолчанию гигиеничные).
  • Тулинг (например, mix vs rebar, ExUnit).
  • Первоклассная поддержка юникода (UTF-8).
  • «Консистентная» стандартная библиотека (например, индексация всегда начинается с нуля в отличие от Эрланга с element/2) плюс плюшки типа DynamicSupervisor, ленивых коллекций, структур данных, протоколов (позволяет использовать единое API для разных структур данных).

Всё это с сохранением практически бесшовного интеропа с Эрлангом.

theNamelessOne ★★★★★ ()
Ответ на: комментарий от Partisan

Более простой для изучения. И более универсального назначения. Erlang рассчитан на распределённую обработку данных в основном без интерфейса пользователя. К Elixir добавлена поддержка создания веб-страниц с помощью библиотеки Phoenix.

Лоллирую с этого комментария. Phoenix не имеет прямого отношения к Elixir, это просто веб-фреймворк, написанный на Elixir (не самый плохой, да). На Erlang внезапно тоже существуют веб-фреймворки, так что в нём тоже есть «поддержка создания веб-страниц».

theNamelessOne ★★★★★ ()

по поводу эликсира, как-то раз его ставил, удивился чтоиз каропки просто нет команды run которая скомпилит и запустит хелло ворлд, надо компилить, потом запускать репл, там выполнять (омг, даже в кложе есть и то и другое) ну это ладно, потом поставил этот феникс и увидел там какие-то кривые рельсы с кучей скриптов и прочего, че то хз прям, на этом реально кто то пишет?

добавлю что из стандартых реп убунты оно вообще не работает, надо ставить с их репозитория, кроме того просто сесть на эликсир без знания бим и эрланга это прямо плохая идея и тебе ПРИДЕТСЯ учить оба языка + платформу что бы пользоваться эликсиром

umren ★★★★★ ()
Последнее исправление: umren (всего исправлений: 1)
Ответ на: комментарий от umren

из стандартых реп убунты оно вообще не работает

тебе дать список ААА-софта (открытого и свободного), который в жизни не работал и не заработает из стандартных реп убунты? Вообще не аргумент.

anonymous ()
Ответ на: комментарий от umren

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

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

Вобщем все вместе работает, по отдельности может не получится.

loz ★★★★★ ()
Ответ на: комментарий от umren

В какой-то степени ты прав, но все не прям так печально, для разработки используем https://github.com/asdf-vm/asdf в продакшен в докере билдим нужную версию.

удивился чтоиз каропки просто нет команды run которая скомпилит и запустит хелло ворлд

 ~/tmp > cat lor.ex
defmodule Mod do
  def hello_world() do
      IO.puts 'Hello, world!'
  end
end 

Mod.hello_world()
~/tmp > elixir lor.ex
Hello, world!

потом поставил этот феникс и увидел там какие-то кривые рельсы

Про феникс ничего не могу сказать, не использовал. Но это просто фреймворк к качеству языка его качество никак не относится.

loz ★★★★★ ()
Последнее исправление: loz (всего исправлений: 1)
Ответ на: комментарий от umren

по поводу эликсира, как-то раз его ставил, удивился чтоиз каропки просто нет команды run которая скомпилит и запустит хелло ворлд, надо компилить, потом запускать репл, там выполнять (омг, даже в кложе есть и то и другое)

4.2 же, mix run для проектов (в разработке), elixir hello_world.exs для хелловорлдов.

theNamelessOne ★★★★★ ()
Последнее исправление: theNamelessOne (всего исправлений: 1)
Ответ на: комментарий от umren

но создает огромный порог входа,

Смотря что называть порогом входа. Ты же понимаешь что у системы на эрланге и го будут разные свойства, если тебе нормально с тем что получится с го тогда бери его - нет проблем.

Но если решение на эрланге выглядит перспективнее - придется войти несмотря на порог. Ты ведь выбираешь инструмент который решит задачу а не тот у которого порог входа низкий)

loz ★★★★★ ()
Последнее исправление: loz (всего исправлений: 1)
Ответ на: комментарий от loz

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

Akka?

eao197 ★★★★★ ()
Ответ на: комментарий от Partisan

Выражение «синтаксический сахар» - бессмыслица.

Да вы, блин, отжигаете все сильнее и сильнее. Прям напалмом.

Скажите еще, что «бутылочное горлышко» такая же бессмыслица, как и «синтаксический сахар».

eao197 ★★★★★ ()
Ответ на: комментарий от eao197

Akka умеет послать сообщение на другой компьютер? Умеет регистрировать процессы по имени и делать поиск в кластере? Если да - то похоже. На самом деле есть http://www.paralleluniverse.co/quasar/ которые просто говорят что мы сделали эрланговую модель процессов на джаве. Но вопрос же еще про коммуникацию между узлами кластера.

loz ★★★★★ ()
Ответ на: комментарий от loz

Akka умеет послать сообщение на другой компьютер? Умеет регистрировать процессы по имени и делать поиск в кластере?

Вроде как да.

https://doc.akka.io/docs/akka/2.5/general/remoting.html

https://doc.akka.io/docs/akka/2.5/routing.html

https://doc.akka.io/docs/akka/current/cluster-usage.html?language=scala

На самом деле есть http://www.paralleluniverse.co/quasar/

Это другой инструмент.

Из мира .NET-а есть еще и Orleans, но там вообще модель совсем другая, на базе персистентности, тем не менее, акторы могут мигрировать с ноды на ноду.

eao197 ★★★★★ ()
Ответ на: комментарий от loz

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

Cloud Haskell ?

Rodegast ★★★★★ ()

Благодаря похожести двух-трёх слов синтаксиса на таковые из Ruby теперь любой смузихипстер может попробовать написать Hello, world или может быть даже ToDo List на «настоящем» функциональном языке программирования!

Alve ★★★★★ ()
Последнее исправление: Alve (всего исправлений: 2)
Ответ на: комментарий от Partisan

Слово «кастомизированный» не существует.

Существует. Смотри, я сейчас скажу и все поймут. Кастомизированный. Даже ты поймешь, не ври.

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

vertexua ★★★☆☆ ()
Последнее исправление: vertexua (всего исправлений: 2)
Ответ на: комментарий от hobbit

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

loz ★★★★★ ()

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

bread ()
Последнее исправление: bread (всего исправлений: 1)