Після року розробки опубліковано реліз мови системного програмування 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. from system {.all.} як 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
- Реалізовано підтримку літералів, визначених користувачем (наприклад «-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