Выпуск языка программирования Crystal 1.5

Опубликован релиз языка программирования Crystal 1.5, разработчики которого пытаются совместить удобство разработки на языке Ruby с высокой производительностью приложений, свойственной языку Си. Синтаксис Crystal близок к языку Ruby, но не полностью совместим с ним, несмотря на то, что без переработки выполняются некоторые ruby-программы. Код компилятора написан на языке Crystal и распространяется под лицензией Apache 2.0.

В языке применяется статическая проверка типов, реализованная без необходимости явного указания типов переменных и аргументов методов в коде. Программы на Crystal компилируются в исполняемые файлы, с вычислением макросов и генерацией кода во время компиляции. В программах на языке Crystal допускается подключение биндингов, написанных на языке Си. Распараллеливание выполнения кода осуществляется при помощи ключевого слова «spawn», которое позволяет запустить фоновую задачу в асинхронном режиме, не блокируя основной поток, в виде легковесных потоков, именуемых файберами (Fiber).

Стандартная библиотека предоставляет большой набор типовых функций, в том числе средства для обработки CSV, YAML, и JSON, компоненты для создания HTTP-серверов и поддержки WebSocket. В процессе разработки удобно использовать команду «crystal play» которая формирует web-интерфейс (по умолчанию localhost:8080) для интерактивного выполнения кода на языке Crystal.

Основные изменения:

  • В компилятор добавлена проверка соответствия имён аргументов в реализации абстрактного метода и в его определении. В случае несоответствия имён теперь выводится предупреждение:
       abstract class FooAbstract
         abstract def foo(number : Int32) : Nil
       end
    
       class Foo ‹ FooAbstract
         def foo(name : Int32) : Nil
           p name
         end
       end
    
       6 | def foo(name : Int32) : Nil
                   ^---
       Warning: positional parameter 'name' corresponds to parameter 'number' 
       of the overridden method FooAbstract#foo(number : Int32), which has a different 
       name and may affect named argument passing
    
  • При присвоении аргументу нетипизированного метода значения переменной, данный аргумент теперь ограничивается типом этой переменной.
       class Foo
         @x : Int64
    
         def initialize(x)
           @x = x # параметр x получит тип @x
         end
       end
    
  • Разрешено добавление аннотаций в параметры методов или макросов.
       def foo(@[MaybeUnused] x); end  # OK
    
  • Добавлена поддержка использования констант в качестве индексов и имён в кортежах.
       KEY = "s"
       foo = {s: "String", n: 0}
    
       puts foo[KEY].size
    
  • В API File для удаления файлов и каталогов добавлены новые методы File#delete? и Dir#delete?, возвращающие false в случае отсутствия файла или каталога.

  • Усилена защита метода File.tempfile, который теперь не допускает нулевые символы в стоках, формирующих имя файла.

  • Добавлена переменная окружения NO_COLOR, отключающая выделение цветом в выводе компилятора и интерпретатора.

  • Значительно улучшена работа в режиме интерпретатора.



Источник: http://www.opennet.ru/opennews/art.shtml? num=57549

© OpenNet