Доступен релиз тулкита Haxe 4.0, включающего одноимённый мультипарадигменный высокоуровневый язык программирования со строгой типизацией, кросс-компилятор и стандартную библиотеку функций. Проектом поддерживается трансляция в С++, HashLink/C, JavaScript, C#, Java, PHP, Python и Lua, а также компиляция в байт-код JVM, HashLink/JIT, Flash и Neko, с доступом к родным возможностям каждой целевой платформы. Код компилятора распространяется под лицензией GPLv2, а стандартной библиотеки и виртуальной машины Neko под лицензией MIT.
Язык является expression-ориентированным со строгой типизацией. Синтаксис Haxe основывается на ECMAScript и расширяет его такими возможностями, как статическая типизация, автовывод типов, сопоставление шаблонов, дженерики, основанный на итераторах цикл «for», AST-макросы, GADT, абстрактные типы и многое другое.
Основные нововведения версии 4.0:
- Новый синтаксис для указания типа функций «(name:String, age:Int)->Bool» или «(String, Int)->Bool» вместо «String->Int->Bool».
- Синтаксис стрелочных функций «(a, b) -> a + b» вместо «function(a, b) return a + b».
- Защита от проблем, связанных с использованием значений Null (экспериментальная функция, включается при желании для определённых полей, классов или пакетов).
- Ключевое слово «final» для полей классов и локальных переменных, которые являются иммутабельными. Также можно использовать для определения функций чтобы запретить их переопределение при наследовании и для классов/интерфейсов, которые не могут быть наследованы.
- Поддержка стандарта Unicode для базового типа «String» на всех целевых системах за исключением Neko.
- Встроенный интерпретатор был переписан с нуля и теперь известен как Eval, благодаря чему скрипты и макросы выполняются намного быстрее, также имеет поддержку интерактивной отладки.
- Новый таргет Hashlink — высокопроизводительный runtime, разработанный специально для Haxe, поддерживающий компиляцию в bytecode + JIT или C, имеет простую интеграцию с C, а также доступ к низкоуровневым числовым типам и указателям.
- Новый таргет JVM — позволяет генерировать jvm байт-код пропуская этап компиляции Java-кода через добавление флага «-D jvm» при таргетировании в Java.
- Возможность inline-развёртывания на месте вызова функций или конструкторов, даже если они не объявлены таковыми.
- Возможность включения статических расширений при объявлении типа (например «enum») с помощью «@:using(path.ToExtension)».
- Абстрактные типы теперь поддерживают «set»-версию оператора «@:op(a.b)» для перезагрузки выражений «obj.foo = bar».
- Синтаксис цикла «for» теперь поддерживает итерацию «ключ-значение»: «for (key => value in collection) {}»
- Поддержка использования xml-like разметки в выражениях: «var a = ‹hi/›;». Пока эта возможность доступна только для парсинга макросами и находится на этапе дизайна.
- Синтаксис для опциональных полей в «полной» нотации типов анонимных структур: «{ var ?f:Int; }» (альтернатива «краткой» «{ ?f:Int }»).
- Значения перечислений теперь могут быть значениями по умолчанию для аргументов функции: «function foo‹T›(option:Option‹T› = None)».
- Синтаксис «enum abstract Name(BasicType) {}» больше не требует префикса «@:» в «enum».
- Авто-нумерация для абстрактных перечислений:
enum abstract Foo(Int) { var A; // 0 var B; // 1 } enum abstract Bar(String) { var A; // "A" var B; // "B" }
- Ключевое слово «extern» больше не требует использование префикса «@:».
- Удалена возможность «implements Dynamic» для доступа к полям класса через строки. Доступно для extern-классов или через реализацию абстрактным типом.
- Добавлен синтаксис «A & B» для пересечения типов. На данный момент только для анонимных структур и ограничений параметров типа. Старый синтаксис ограничений удалён.
- Создание пустых экземпляров «Map» доступно теперь через синтаксис «var map:Map‹Int, String› = [];» по аналогии с массивом.
- Добавлена структура данных «haxe.ds.ReadOnlyArray».
- Метаданные теперь могут иметь пространства имен («@:prefix.name function() {…}»). Аналогично с определениями: «#if (some.flag … #end».
- Новый протокол сервисов для IDE, используемых в плагине к VSCode.
- Обновлены внешние определения (extern) для Web APIs и добавлены отсутствующие.
Источник: http://www.opennet.ru/opennews/art.shtml?num=51763