17 KiB
v1.6.x - yyyy-mm-dd
Changes affecting backward compatibility
-
cucharnow aliasesuint8instead ofchar -
reprnow doesn't insert trailing newline; previous behavior was very inconsistent, see #16034. Use-d:nimLegacyReprWithNewlinefor previous behavior. -
An enum now can't be converted to another enum directly, you must use
ord(orcast, but compiler won't help if you misuse it).type A = enum a1, a2 type B = enum b1, b2 doAssert not compiles(a1.B) doAssert compiles(a1.ord.B)for a transition period, use
-d:nimLegacyConvEnumEnum. -
Type mismatch errors now show more context, use
-d:nimLegacyTypeMismatchfor previous behavior. -
echoanddebugEchowill now raiseIOErrorif writing to stdout fails. Previous behavior silently ignored errors. See #16366. Use-d:nimLegacyEchoNoRaisefor previous behavior. -
math.roundnow is rounded "away from zero" in JS backend which is consistent with other backends. See #9125. Use-d:nimLegacyJsRoundfor previous behavior. -
Changed the behavior of
uri.decodeQuerywhen there are unencoded=characters in the decoded values. Prior versions would raise an error. This is no longer the case to comply with the HTML spec and other languages implementations. Old behavior can be obtained with-d:nimLegacyParseQueryStrict.cgi.decodeDatawhich uses the same underlying code is also updated the same way. -
Custom pragma values have now an API for use in macros.
-
In
std/os,getHomeDir,expandTilde,getTempDir,getConfigDirnow do not include trailingDirSep, unless-d:nimLegacyHomeDiris specified (for a transition period). -
On POSIX systems, the default signal handlers used for Nim programs (it's used for printing the stacktrace on fatal signals) will now re-raise the signal for the OS default handlers to handle.
This lets the OS perform its default actions, which might include core dumping (on select signals) and notifying the parent process about the cause of termination.
-
On POSIX systems, we now ignore
SIGPIPEsignals, use-d:nimLegacySigpipeHandlerfor previous behavior. -
hashes.hashnow supportsobjectandref(can be overloaded in user code). For a transition period, use-d:nimLegacyNoHashRefto avoid defininghash(ref). -
hashes.hash(proc|ptr|ref|pointer)now callshash(int)and honors-d:nimIntHash1,hashes.hash(closure)has also been improved. -
The unary slice
..bwas removed, use0..binstead or use-d:nimLegacyUnarySlicefor a deprecation period. -
Removed
.travis.yml,appveyor.yml.disabled,.github/workflows/ci.yml.disabled. -
Nim compiler now adds ASCII unit separator
\31before a newline for every generated message (potentially multiline), so tooling can tell when messages start and end.
Standard library additions and changes
-
Added support for parenthesized expressions in
strformat -
Fixed buffer overflow bugs in
net -
Added
sectionsiterator inparsecfg. -
Make custom op in macros.quote work for all statements.
-
On Windows the SSL library now checks for valid certificates. It uses the
cacert.pemfile for this purpose which was extracted fromhttps://curl.se/ca/cacert.pem. Besides the OpenSSL DLLs (e.g. libssl-1_1-x64.dll, libcrypto-1_1-x64.dll) you now also need to shipcacert.pemwith your.exefile. -
Make
{.requiresInit.}pragma to work fordistincttypes. -
Added a macros
enumLenfor returning the number of items in an enum to thetypetraits.nimmodule. -
preludenow works with the JavaScript target. Addedsequtilsimport toprelude.preludecan now be used viainclude std/prelude, butinclude preludestill works. -
Added
almostEqualinmathfor comparing two float values using a machine epsilon. -
Added
clampinmathwhich allows using aSliceto clamp to a value. -
The JSON module can now handle integer literals and floating point literals of arbitrary length and precision. Numbers that do not fit the underlying
BiggestIntorBiggestFloatfields are kept as string literals and one can use external BigNum libraries to handle these. TheparseFloatfamily of functions also has now optionalrawIntegersandrawFloatsparameters that can be used to enforce that all integer or float literals remain in the "raw" string form so that client code can easily treat small and large numbers uniformly. -
Added
BackwardsIndexoverload forJsonNode. -
added
jsonutils.jsonTooverload withopt = Joptions()param. -
json.%,json.to,jsonutils.formJson,jsonutils.toJsonnow work withuint|uint64instead of raising (as in 1.4) or giving wrong results (as in 1.2). -
Added an overload for the
collectmacro that inferes the container type based on the syntax of the last expression. Works with std seqs, tables and sets. -
jsonutilsnow handlescstring(including as Table key). -
Added
randStatetemplate that exposes the default random number generator. Useful for library authors. -
Added
std/enumutilsmodule. AddedgenEnumCaseStmtmacro that generates case statement to parse string to enum. Addeditemsfor enums with holes. AddedsymbolNameto return the enum symbol name ignoring the human readable name. -
Added
typetraits.HoleyEnumfor enums with holes,OrdinalEnumfor enums without holes. -
Removed deprecated
iupmodule from stdlib, it has already moved to nimble. -
various functions in
httpclientnow accepturlof typeUri. Moreoverrequestfunction'shttpMethodargument of typestringwas deprecated in favor ofHttpMethodenum type. -
nodejsbackend now supports osenv:getEnv,putEnv,envPairs,delEnv,existsEnv. -
Added
cmpMemtosystem. -
doAssertRaisesnow correctly handles foreign exceptions. -
Added
asyncdispatch.activeDescriptorsthat returns the number of currently active async event handles/file descriptors. -
Added
getPorttoasynchttpserver. -
--gc:orcis now 10% faster than previously for common workloads. If you have trouble with its changed behavior, compile with-d:nimOldOrc. -
os.FileInfo(returned bygetFileInfo) now containsblockSize, determining preferred I/O block size for this file object. -
Added a simpler to use
io.readCharsoverload. -
Added
**to jsffi. -
writeStackTraceis available in JS backend now. -
Added
decodeQuerytostd/uri. -
strscans.scanfnow supports parsing single characters. -
strscans.scanTupleadded which usesstrscans.scanfinternally, returning a tuple which can be unpacked for easier usage ofscanf. -
Added
setutils.toSetthat can take any iterable and convert it to a built-inset, if the iterable yields a built-in settable type. -
Added
setutils.fullSetwhich returns a full built-insetfor a valid type. -
Added
setutils.complementwhich returns the complement of a built-inset. -
Added
setutils.[]=. -
Added
math.isNaN. -
Added
jsbigintsmodule, arbitrary precision integers for JavaScript target. -
Added
math.copySign. -
Added new operations for singly- and doubly linked lists:
lists.toSinglyLinkedListandlists.toDoublyLinkedListconvert fromopenArrays;lists.copyimplements shallow copying;lists.addconcatenates two lists - an O(1) variation that consumes its argument,addMoved, is also supplied. -
Added
euclDivandeuclModtomath. -
Added
httpcore.is1xxand missing HTTP codes. -
Added
jsconsole.jsAssertfor JavaScript target. -
Added
posix_utils.osReleaseFileto get system identification fromos-releasefile on Linux and the BSDs. https://www.freedesktop.org/software/systemd/man/os-release.html -
Added
socketstreammodule that wraps sockets in the stream interface -
Added
sugar.dumpToStringwhich improves onsugar.dump. -
Added
math.signbit. -
Removed the optional
longestMatchparameter of thecritbits._WithPrefixiterators (it never worked reliably) -
In
lists: renamedappendtoaddand retainedappendas an alias; addedprependandprependMovedanalogously toaddandaddMoved; addedremoveforSinglyLinkedLists. -
Deprecated
any. See https://github.com/nim-lang/RFCs/issues/281 -
Added
std/sysrandmodule to get random numbers from a secure source provided by the operating system. -
Added optional
optionsargument tocopyFile,copyFileToDir, andcopyFileWithPermissions. By default, on non-Windows OSes, symlinks are followed (copy files symlinks point to); on Windows,optionsargument is ignored and symlinks are skipped. -
On non-Windows OSes,
copyDirandcopyDirWithPermissionscopy symlinks as symlinks (instead of skipping them as it was before); on Windows symlinks are skipped. -
On non-Windows OSes,
moveFileandmoveDirmove symlinks as symlinks (instead of skipping them sometimes as it was before). -
Added optional
followSymlinksargument tosetFilePermissions. -
Added
os.isAdminto tell whether the caller's process is a member of the Administrators local group (on Windows) or a root (on POSIX). -
Added
random.initRand()overload with no argument which uses the current time as a seed. -
Added experimental
linenoise.readLineStatusto get line and status (e.g. ctrl-D or ctrl-C). -
Added
compilesettings.SingleValueSetting.libPath. -
std/wrapnilsdoesn't useexperimental:dotOperatorsanymore, avoiding issues like https://github.com/nim-lang/Nim/issues/13063 (which affected error messages) for modules importingstd/wrapnils. Added??.macro which returns anOption. -
Added
math.frexpoverload procs. Deprecatedc_frexp, usefrexpinstead. -
parseopt.initOptParserhas been made available andparseopthas been added back topreludefor all backends. PreviouslyinitOptParserwas unavailable if theosmodule did not haveparamCountorparamStr, but the use of these ininitOptParserwere conditionally to the runtime arguments passed to it, soinitOptParserhas been changed to raiseValueErrorwhen the real command line is not available.parseoptwas previously excluded frompreludefor JS, as it could not be imported. -
Added
system.prepareStrMutationfor better support of low levelmoveMem,copyMemoperations for Orc's copy-on-write string implementation. -
Added
std/strbasicsfor high performance string operations. Addedstrip,setSlice,add(a: var string, b: openArray[char]). -
Added to
wrapnilsan option-like API via??.,isSome,get. -
std/optionschanged$some(3)to"some(3)"instead of"Some(3)"and$none(int)to"none(int)"instead of"None[int]". -
Added
algorithm.merge. -
Added
std/jsfetchmodule Fetch wrapper for JavaScript target. -
Added
std/jsheadersmodule Headers wrapper for JavaScript target. -
Added
std/jsformdatamodule FormData wrapper for JavaScript target. -
system.addEscapedCharnow renders\ras\rinstead of\c, to be compatible with most other languages. -
Removed support for named procs in
sugar.=>. -
Added
jscore.debuggerto call any available debugging functionality, such as breakpoints.. -
Added
std/channels. -
Added
htmlgen.portalfor making "SPA style" pages using HTML only. -
Added
ZZZandZZZZpatterns totimes.nimDateTimeparsing, to match time zone offsets without colons, e.g.UTC+7 -> +0700. -
Added
jsconsole.dir,jsconsole.dirxml,jsconsole.timeStamp. -
Added dollar
$andlenforjsre.RegExp. -
Added
std/tasks. -
Added
hasDataBufferedtoasyncnet. -
Added
hasClosuretostd/typetraits. -
Added
std/tempfiles. -
Added
genasts.genAstthat avoids the problems inherent withquote doand can be used as a replacement.
Language changes
-
nimscriptnow handlesexcept Exception as e. -
The
cstringdoesn't support[]=operator in JS backend. -
nil dereference is not allowed at compile time.
cast[ptr int](nil)[]is rejected at compile time. -
typetraits.distinctBasenow is identity instead of error for non distinct types. -
os.copyFileis now 2.5x faster on OSX, by usingcopyfilefromcopyfile.h; use-d:nimLegacyCopyFilefor OSX < 10.5. -
The required name of case statement macros for the experimental
caseStmtMacrosfeature has changed frommatchto`case`. -
typedesc[Foo]now renders as such instead oftype Fooin compiler messages. -
The unary minus in
-1is now part of the integer literal, it is now parsed as a single token. This implies that edge cases like-128'i8finally work correctly. -
Custom numeric literals (e.g.
-128'bignum) are now supported. -
Tuple expressions are now parsed consistently as
nnkTupleConstrnode. Will affect macros expecting nodes to be ofnnkPar. -
nim enow accepts arbitrary file extensions for the nimscript file, although.nimsis still the preferred extension in general. -
Added
iterable[T]type class to match called iterators, which enables writing:template fn(a: iterable)instead oftemplate fn(a: untyped) -
A new import syntax
import foo {.all.}now allows to import all symbols (public or private) fromfoo. It works in combination with all pre-existing import features. This reduces or eliminates the need for workarounds such as usinginclude(which has known issues) when you need a private symbol for testing or making some internal APIs public just because another internal module needs those. It also helps mitigate the lack of cyclic imports in some cases. -
Added a new module
std/importutils, and an APIprivateAccess, which allows access to private fields for an object type in the current scope. -
typeof(voidStmt)now works and returnsvoid.
Compiler changes
-
Added
--declaredlocsto show symbol declaration location in messages. -
Deprecated
TaintedStringand--taintmode. -
Deprecated
--nilseqswhich is now a noop. -
Added
--spellSuggestto show spelling suggestions on typos. -
Added
--filenames:abs|canonical|legacyRelProjwhich replaces --listFullPaths:on|off -
Added
--processing:dots|filenames|offwhich customizeshintProcessing -
Source+Edit links now appear on top of every docgen'd page when
nim doc --git.url:url ...is given. -
Added
nim --eval:cmdto evaluate a command directly, seenim --help. -
VM now supports
addr(mystring[ind])(index + index assignment) -
Added
--hintAsErrorwith similar semantics as--warningAsError. -
TLS: OSX now uses native TLS (
--tlsEmulation:off), TLS now works with importcpp non-POD types, such types must use.cppNonPodand--tlsEmulation:offshould be used. -
Now array literals(JS backend) uses JS typed arrays when the corresponding js typed array exists, for example
[byte(1), 2, 3]generatesnew Uint8Array([1, 2, 3]). -
docgen: rst files can now use single backticks instead of double backticks and correctly render in both rst2html (as before) as well as common tools rendering rst directly (e.g. github), by adding:
default-role:: codedirective inside the rst file, which is now handled by rst2html. -
Added
-d:nimStrictModein CI in several places to ensure code doesn't have certain hints/warnings -
Added
then,catchtoasyncjs, for now hidden behind-d:nimExperimentalAsyncjsThen. -
--newruntimeand--refchecksare deprecated. -
Added
unsafeIsolateandextracttostd/isolation. -
--hint:CCnow goes to stderr (like all other hints) instead of stdout. -
json build instructions are now generated in
$nimcache/outFileBasename.jsoninstead of$nimcache/projectName.json. This allows avoiding recompiling a given project compiled with different options if the output file differs. -
--usenimcache(implied bynim r main) now generates an output file that includes a hash of some of the compilation options, which allows caching generated binaries: nim r main # recompiles nim r -d:foo main # recompiles nim r main # uses cached binary nim r main arg1 arg2 # ditto (runtime arguments are irrelevant)
Tool changes
-
The rst parser now supports markdown table syntax. Known limitations:
- cell alignment is not supported, i.e. alignment annotations in a delimiter
row (
:---,:--:,---:) are ignored, - every table row must start with
|, e.g.| cell 1 | cell 2 |.
- cell alignment is not supported, i.e. alignment annotations in a delimiter
row (
-
fusionis now un-bundled from nim,./koch fusionwill install it via nimble at a fixed hash. -
testament: added
nimoutFull: boolspec to compare full output of compiler instead of a subset.