Eldono de la programlingvo Nim 1.6.0

Post jaro da evoluo, la eldono de la sistema programlingvo Nim 1.6 estis publikigita, kiu uzas statikan tajpadon kaj estis kreita kun okulo sur Pascal, C++, Python kaj Lisp. Nim fontkodo estas kompilita en C, C++, aŭ JavaScript-reprezentantaron. Poste, la rezulta C/C++-kodo estas kompilita en ruleblan dosieron uzante ajnan disponeblan kompililon (clang, gcc, icc, Visual C++), kio ebligas al vi atingi rendimenton proksime al C, se vi ne konsideras la kostojn de funkciado. la rubkolektisto. Simila al Python, Nim uzas indentaĵon kiel bloklimigilojn. Metaprogramadaj iloj kaj kapabloj por krei domajn-specifajn lingvojn (DSL) estas subtenataj. La projektkodo estas disponigita sub la MIT-licenco.

Rimarkindaj ŝanĝoj en la nova eldono inkluzivas:

  • Aldonita la iterebla[T] klaso kun tipefektivigo por iterantoj. ŝablona sumo[T](a: iterebla[T]): T = var rezulto: T por ai en a: rezulto += ai rezulto aserto sumo(iota(3)) == 0 + 1 + 2 # aŭ 'iota( 3).sum'
  • Aldonita eksperimenta subteno por ".effectsOf" komentarioj por selekteme apliki efikojn. kiam difinita(nimHasEffectsOf): {.experimental: "strictEffects".} else: {.pragma: effectsOf.} proc mysort(s: seq; cmp: proc(a, b: T): int) {.effectsOf: cmp. }
  • Nova importa sintakso "import foo {.all.}" estis proponita, ebligante vin importi ne nur publikajn, sed ankaŭ privatajn simbolojn. Por aliri privatajn kampojn de objektoj, la modulo std/importutils kaj la privateAccess API estis aldonitaj. el sistemo {.all.} kiel system2 import nil echo system2.ThisIsSystem import os {.all.} echo weirdTarget
  • Aldonita eksperimenta subteno por punktofunkciigistoj, kiuj povas esti uzataj por efektivigi dinamikajn kampojn. importi std/json ŝablonon '.?'(a: JsonNode, b: netajpitaj{ident}): JsonNode = a[astToStr(b)] let j = %*{“a1”: {“a2”: 10}} asert j.?a1.?a2.getInt == 10
  • Pliaj parametroj povas esti specifitaj en blokargumentoj. ŝablono fn(a = 1, b = 2, korpo1, korpo2) = forĵeti fn(a = 1): bar1 do: bar2
  • Subteno por uzant-difinitaj literaloj estis efektivigita (ekzemple, "-128'bignum'"). func `'granda`*(num: cstring): JsBigInt {.importjs: "BigInt(#)".} asert 0xffffffffffffff'big == (1'granda shl 64'granda) - 1'granda
  • La kompililo efektivigas la komandon “—eval:cmd” por rekte ruli Nim-komandojn de la komandlinio, ekzemple ‘nim —eval:”echo 1″‘.
  • Provizis subtenon por krei viajn proprajn etendaĵojn por la nimscript backend.
  • Erarmesaĝoj estis multe vastigitaj por montri la kuntekston asociitan kun la eraro. Efektivigitaj kutimaj kompililaj avertoj.
  • Signife plibonigita agado de la "--gc:arc" kaj "--gc:orc" rubokolektantoj.
  • Ĉiuj backends plibonigis la precizecon kaj rendimenton de kodo por analizado de entjeroj kaj glitkomaj nombroj.
  • Plibonigita kongruo de JS, VM kaj nimscript backends kun moduloj kiuj antaŭe nur funkciis kun la C backend (ekzemple, la std/prelude modulo). Testado de stdlib-moduloj kun C, JS kaj VM-backends estis establita.
  • Aldonita subteno por Apple Silicon/M1-blato, 32-bita RISC-V, armv8l kaj CROSSOS-sistemoj.
  • Aldonitaj moduloj std/jsbigints, std/tempfiles kaj std/sysrand. Signifaj plibonigoj estis faritaj al la moduloj de sistemo, matematiko, hazarda, json, jsonutils, os, typetraits, wrapnils, listoj kaj hashes.

fonto: opennet.ru

Aldoni komenton