Рэліз мовы праграмавання Nim 1.6.0

Пасля года распрацоўкі апублікаваны рэліз мовы сістэмнага праграмавання Nim 1.6, які выкарыстоўвае статычную тыпізацыю і створаны з аглядкай на Pascal, C++, Python і Lisp. Зыходны код на мове Nim кампілюецца ў прадстаўленне на C, C ++ або JavaScript. У далейшым атрыманы C/C++ код кампілюецца ў выкананы файл пры дапамозе любога даступнага кампілятара (clang, gcc, icc, Visual C++), што дазваляе дамагчыся прадукцыйнасці блізкай да Сі, калі не ўлічваць выдаткі на выкананне зборшчыка смецця. Па аналогіі з Python у Nim у якасці падзельнікаў блокаў ужываюцца водступы. Падтрымліваюцца сродкі метапраграмавання і магчымасці для стварэння прадметна-арыентаваных моў (DSL). Код праекту пастаўляецца пад ліцэнзіяй MIT.

Сярод прыкметных змен у новым выпуску:

  • Дададзены клас iterable[T] з рэалізацыяй тыпу для ітэратараў. template sum[T](a: iterable[T]): t = var result: t for ai in a: result += ai result assert sum(iota(3)) == 0 + 1 + 2 # або 'iota( 3).sum'
  • Дададзена эксперыментальная падтрымка анатацый ".effectsOf" для выбарачнага прымянення эфектаў. when defined(nimHasEffectsOf): {.experimental: "strictEffects".} else: {.pragma: effectsOf.} proc mysort(s: seq; cmp: proc(a, b: T): int) {.effectsOf: cmp. }
  • Прапанаваны новы сінтаксіс імпарту "import foo {.all.}", які дазваляе імпартаваць не толькі публічныя, але і прыватныя сімвалы. Для доступу да прыватных палёў аб'ектаў дададзены модуль std/importutils і API privateAccess. ад system {.all.} as system2 import nil echo system2.ThisIsSystem import os {.all.} echo weirdTarget
  • Дададзена эксперыментальная падтрымка аператараў, якія пачынаюцца з кропкі, якія можна выкарыстоўваць для рэалізацыі дынамічных палёў. import std/json template '.?'(a: JsonNode, b: untyped{ident}): JsonNode = a[astToStr(b)] let j = %*{«a1»: {«a2»: 10}} assert j.?a1.?a2.getInt == 10
  • У аргументах блока дазволена ўказанне дадатковых параметраў. template fn(a = 1, b = 2, body1, body2) = discard fn(a = 1): bar1 do: bar2
  • Рэалізаваная падтрымка літаралаў, якiя вызначаюцца карыстальнікам (напрыклад «-128'bignum'»). func `'big`*(num: cstring): JsBigInt {.importjs: "BigInt(#)".} assert 0xffffffffffffffff'big == (1'big shl 64'big) - 1'big
  • У кампілятары рэалізаваная каманда "-eval:cmd" для непасрэднага запуску каманд на мове Nim з каманднага радка, напрыклад 'nim -eval:"echo 1"'.
  • Дадзена падтрымка стварэння ўласных пашырэнняў для бэкенда nimscript.
  • Значна пашыраны паведамленні аб памылках, у якіх забяспечаны паказ звязанага з памылкай кантэксту. Рэалізаваны наладжвальныя папярэджанні кампілятара.
  • Значна палепшана праца зборшчыкаў смецця "-gc:arc" і "-gc:orc".
  • Ва ўсіх бэкендах палепшана дакладнасць і прадукцыйнасць кода для парсінгу цэлых лікаў і лікаў з якая плавае коскі.
  • Палепшана сумяшчальнасць бэкэндаў JS, VM і nimscript з модулямі, якія раней працавалі толькі з бэкэндам C (напрыклад, модуль std/prelude). Наладжана тэсціраванне модуляў stdlib з бэкендамі C, JS і VM.
  • Дададзена падтрымка чыпа Apple Silicon/M1, 32-разрадных сістэм RISC-V, armv8l і CROSSOS.
  • Дададзеныя модулі std/jsbigints, std/tempfiles і std/sysrand. Унесены значныя паляпшэнні ў модулі system, math, random, json, jsonutils, os, typetraits, wrapnils, lists і hashes.

Крыніца: opennet.ru

Дадаць каментар