Апублікаваны рэліз мовы праграмавання 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 def foo(name : Int32) : Nil ^— Warning: positional parameter 'name' corresponds to parameter 'number' of overredden method
- Пры прысваенні аргументу нетыпізаванага метаду значэння зменнай, дадзены аргумент зараз абмяжоўваецца тыпам гэтай зменнай. 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, якая адключае вылучэнне колерам у выснове кампілятара і інтэрпрэтатара.
- Значна палепшана праца ў рэжыме інтэрпрэтатара.
Крыніца: opennet.ru