Version 0.19.0 released

The Nim team is happy to announce that the latest release of Nim, version 0.19.0, is now available. Nim is a systems programming language that focuses on performance, portability and expressiveness.

Installing 0.19.0

If you have installed a previous version of Nim using choosenim , getting Nim 0.19.0 is as easy as:

$ choosenim update stable

If you don’t have it already, you can get choosenim by following these instructions or you can install Nim by following the instructions on our install page.

What’s new in 0.19.0

The nil state for strings/seqs is gone. Instead the default value for these is "" / @[] . Use --nilseqs:on for a transition period. This eliminates a large class of bugs that used to plague the average Nim code out there, including Nim’s standard library.

Accessing the binary zero terminator in Nim’s native strings is now invalid. Internally a Nim string still has the trailing zero for zero-copy interoperability with cstring . Compile your code with the new switch --laxStrings:on if you need a transition period.

These changes to strings and seqs give us more flexibility in how they are implemented and indeed alternative implementations are in development.

experimental is now a pragma and a command line switch that can enable specific language extensions, it is not an all-or-nothing switch anymore. We think this leads to a more robust development process where it’s clearly documented which parts of Nim are bleeding edge and which parts can be relied upon.

Other notable language additions:

Dot calls combined with explicit generic instantiations can now be written as x.y[:z] which is transformed into y[z](x) by the parser.

which is transformed into by the parser. func is now an alias for proc {.noSideEffect.} .

is now an alias for . Anonymous tuples with a single element can now be written as (1,) with a trailing comma.

In order to make for loops and iterators more flexible to use Nim now supports so called “for-loop macros”. See the manual for more details. This feature enables a Python-like generic enumerate implementation.

Case statements can now be rewritten via macros. See the manual for more information. This feature enables custom pattern matching.

The command syntax now supports keyword arguments after the first comma.

Thread-local variables can now be declared inside procs. This implies all the effects of the global pragma.

Nim now supports the except clause in the export statement.

Range float types, example range[0.0 .. Inf] . More details in language manual.

Breaking changes to be mindful of

The default location of nimcache for the native code targets was changed. Read the compiler user guide for more information.

for the native code targets was changed. Read the compiler user guide for more information. Lots of deprecated symbols in the standard library that have been deprecated for quite some time now like system.expr or the old type aliases starting with a T or P prefix have been removed.

or the old type aliases starting with a or prefix have been removed. The exception hierarchy was slightly reworked, SystemError was renamed to CatchableError and is the new base class for any exception that is guaranteed to be catchable. This change should have minimal impact on most existing Nim code.

Async improvements

The “closure iterators” that Nim’s async macro is based on has been rewritten from the ground up and so async works completely with exception handling. Finally it is possible to use await in a try statement!

Nimble 0.9.0

This release includes a brand new version of Nimble. The new version contains a breaking change which you should read up on if you own hybrid packages. There are also the usual bug fixes and this release contains a lot of them.

For more information, see the Nimble v0.9.0 changelog.

Contributors to v0.19.0

Our contributors are amazing, and there is far too many to list here. Big thanks to all of you, we couldn’t have pulled off this release without you!

Changelog

Changes affecting backwards compatibility

Breaking changes in the standard library

re.split for empty regular expressions now yields every character in the string which is what other programming languages chose to do.

for empty regular expressions now yields every character in the string which is what other programming languages chose to do. The returned tuple of system.instantiationInfo now has a third field containing the column of the instantiation.

cookies.setCookie no longer assumes UTC for the expiration date.

no longer assumes UTC for the expiration date. strutils.formatEng does not distinguish between nil and "" strings anymore for its unit parameter. Instead the space is controlled by a new parameter useUnitSpace .

The times.parse and times.format procs have been rewritten. The proc signatures are the same so it should generally not break anything. However, the new implementation is a bit stricter, which is a breaking change. For example parse("2017-01-01 foo", "yyyy-MM-dd") will now raise an error.

proc `-`*(a, b: Time): int64 in the times module has changed return type to times.Duration in order to support higher time resolutions. The proc is no longer deprecated.

The times.Timezone is now an immutable ref-type that must be initialized with an explicit constructor ( newTimezone ).

posix.Timeval.tv_sec has changed type to posix.Time .

math.`mod` for floats now behaves the same as mod for integers (previously it used floor division like Python). Use math.floorMod for the old behavior.

For string inputs, unicode.isUpper and unicode.isLower now require a second mandatory parameter skipNonAlpha .

For string inputs, strutils.isUpperAscii and strutils.isLowerAscii now require a second mandatory parameter skipNonAlpha .

osLastError is now marked with sideEffect

is now marked with The procs parseHexInt and parseOctInt now fail on empty strings and strings containing only valid prefixes, e.g. “0x” for hex integers.

terminal.setCursorPos and terminal.setCursorXPos now work correctly with 0-based coordinates on POSIX (previously, you needed to use 1-based coordinates on POSIX for correct behaviour; the Windows behaviour was always correct).

lineInfoObj now returns absolute path instead of project path. It’s used by lineInfo , check , expect , require , etc.

net.sendTo no longer returns an int and now raises an OSError .

no longer returns an int and now raises an . threadpool ’s await and derivatives have been renamed to blockUntil to avoid confusions with await from the async macro.

Library additions

re.split now also supports the maxsplit parameter for consistency with strutils.split .

now also supports the parameter for consistency with . Added system.toOpenArray in order to support zero-copy slicing operations. This is currently not yet available for the JavaScript target.

in order to support zero-copy slicing operations. This is currently not yet available for the JavaScript target. Added getCurrentDir , findExe , cpDir and mvDir procs to nimscript .

, , and procs to . The times module now supports up to nanosecond time resolution when available.

module now supports up to nanosecond time resolution when available. Added the type times.Duration for representing fixed durations of time.

for representing fixed durations of time. Added the proc times.convert for converting between different time units, e.g days to seconds.

for converting between different time units, e.g days to seconds. Added the proc algorithm.binarySearch[T, K] with the cmp parameter.

with the parameter. Added the proc algorithm.upperBound .

. Added inverse hyperbolic functions, math.arcsinh , math.arccosh and math.arctanh procs.

, and procs. Added cotangent, secant and cosecant procs math.cot , math.sec and math.csc ; and their hyperbolic, inverse and inverse hyperbolic functions, math.coth , math.sech , math.csch , math.arccot , math.arcsec , math.arccsc , math.arccoth , math.arcsech and math.arccsch procs.

, and ; and their hyperbolic, inverse and inverse hyperbolic functions, , , , , , , , and procs. Added the procs math.floorMod and math.floorDiv for floor based integer division.

and for floor based integer division. Added the procs rationals.`div , rationals. mod```, rationals.floorDiv and rationals.floorMod for rationals.

mod```, and for rationals. Added the proc math.prod for product of elements in an openArray.

for product of elements in an openArray. Added the proc parseBinInt to parse a binary integer from a string, which returns the value.

to parse a binary integer from a string, which returns the value. parseOct and parseBin in parseutils now also support the maxLen argument similar to parseHexInt .

and in parseutils now also support the argument similar to . Added the proc flush for memory mapped files.

for memory mapped files. Added the MemMapFileStream .

. Added a simple interpreting event parser template eventParser to the pegs module.

to the module. Added macros.copyLineInfo to copy lineInfo from other node.

to copy lineInfo from other node. Added system.ashr an arithmetic right shift for integers.

Library changes

The stdlib module future has been renamed to sugar .

has been renamed to . macros.callsite is now deprecated. Since the introduction of varargs parameters this became unnecessary.

macros.astGenRepr , macros.lispRepr and macros.treeRepr now escapes the content of string literals consistently.

, and now escapes the content of string literals consistently. macros.NimSym and macros.NimIdent is now deprecated in favor of the more general NimNode .

and is now deprecated in favor of the more general . macros.getImpl now includes the pragmas of types, instead of omitting them.

now includes the pragmas of types, instead of omitting them. macros.hasCustomPragma and macros.getCustomPragmaVal now also support ref and ptr types, pragmas on types and variant fields.

and now also support and types, pragmas on types and variant fields. system.SomeReal is now called SomeFloat for consistency and correctness.

is now called for consistency and correctness. algorithm.smartBinarySearch and algorithm.binarySearch is now joined in binarySearch . smartbinarySearch is now deprecated.

and is now joined in . is now deprecated. The terminal module now exports additional procs for generating ANSI color codes as strings.

module now exports additional procs for generating ANSI color codes as strings. Added the parameter val for the CritBitTree[int].inc proc.

for the proc. An exception raised from a test block of unittest now shows its type in error message.

block of now shows its type in error message. The compiler/nimeval API was rewritten to simplify the “compiler as an API”. Using the Nim compiler and its VM as a scripting engine has never been easier. See tests/compilerapi/tcompilerapi.nim for an example of how to use the Nim VM in a native Nim application.

API was rewritten to simplify the “compiler as an API”. Using the Nim compiler and its VM as a scripting engine has never been easier. See for an example of how to use the Nim VM in a native Nim application. Added the parameter val for the CritBitTree[T].incl proc.

for the proc. The proc tgamma was renamed to gamma . tgamma is deprecated.

was renamed to . is deprecated. The pegs module now exports getters for the fields of its Peg and NonTerminal object types. Peg s with child nodes now have the standard items and pairs iterators.

module now exports getters for the fields of its and object types. s with child nodes now have the standard and iterators. The accept socket procedure defined in the net module can now accept a nil socket.

Language additions

Dot calls combined with explicit generic instantiations can now be written as x.y[:z] which is transformed into y[z](x) by the parser.

which is transformed into by the parser. func is now an alias for proc {.noSideEffect.} .

is now an alias for . In order to make for loops and iterators more flexible to use Nim now supports so called “for-loop macros”. See the manual for more details. This feature enables a Python-like generic enumerate implementation.

Case statements can now be rewritten via macros. See the manual for more information. This feature enables custom pattern matchers.

the typedesc special type has been renamed to just type .

special type has been renamed to just . static and type are now also modifiers similar to ref and ptr . They denote the special types static[T] and type[T] .

and are now also modifiers similar to and . They denote the special types and . Forcing compile-time evaluation with static now supports specifying the desired target type (as a concrete type or as a type class)

now supports specifying the desired target type (as a concrete type or as a type class) The type operator now supports checking that the supplied expression matches an expected type constraint.

Language changes

Anonymous tuples with a single element can now be written as (1,) with a trailing comma. The underlying AST is nnkTupleConstr(newLit 1) for this example. nnkTupleConstr is a new node kind your macros need to be able to deal with!

with a trailing comma. The underlying AST is for this example. is a new node kind your macros need to be able to deal with! Indexing into a cstring for the JS target is now mapped to charCodeAt .

for the JS target is now mapped to . Assignments that would “slice” an object into its supertype are now prevented at runtime. Use ref object with inheritance rather than object with inheritance to prevent this issue.

with inheritance rather than with inheritance to prevent this issue. The not nil type annotation now has to be enabled explicitly via { .experimental: "notnil" } as we are still not pleased with how this feature works with Nim’s containers.

type annotation now has to be enabled explicitly via as we are still not pleased with how this feature works with Nim’s containers. The parser now warns about inconsistent spacing around binary operators as these can easily be confused with unary operators. This warning will likely become an error in the future.

The 'c and 'C' suffix for octal literals is now deprecated to bring the language in line with the standard library (e.g. parseOct ).

and suffix for octal literals is now deprecated to bring the language in line with the standard library (e.g. ). The dot style for import paths (e.g import path.to.module instead of import path/to/module ) has been deprecated.

The importcpp pragma now allows importing the listed fields of generic C++ types. Support for numeric parameters have also been added through the use of static[T] types. (#6415)

Native C++ exceptions can now be imported with importcpp pragma. Imported exceptions can be raised and caught just like Nim exceptions. More details in language manual.

nil for strings/seqs is finally gone. Instead the default value for these is "" / @[] . Use --nilseqs:on for a transition period.

Accessing the binary zero terminator in Nim’s native strings is now invalid. Internally a Nim string still has the trailing zero for zero-copy interoperability with cstring . Compile your code with the new switch --laxStrings:on if you need a transition period.

The command syntax now supports keyword arguments after the first comma.

Thread-local variables can now be declared inside procs. This implies all the effects of the global pragma.

Nim now supports the except clause in the export statement.

Range checked floating point types, for example range[0.0 .. Inf] , are now supported.

, are now supported. The { .this. } pragma has been deprecated. It never worked within generics and we found the resulting code harder to read than the more explicit obj.field syntax.

pragma has been deprecated. It never worked within generics and we found the resulting code harder to read than the more explicit syntax. “Memory regions” for pointer types have been deprecated, they were hardly used anywhere. Note that this has nothing to do with the --gc:regions switch of managing memory.

The exception hierarchy was slightly reworked, SystemError was renamed to CatchableError and is the new base class for any exception that is guaranteed to be catchable. This change should have minimal impact on most existing Nim code.

Tool changes

jsondoc2 has been renamed jsondoc , similar to how doc2 was renamed doc . The old jsondoc can still be invoked with jsondoc0 .

Compiler changes

The undocumented #? braces parsing mode was removed.

parsing mode was removed. The undocumented PHP backend was removed.

The VM’s instruction count limit was raised to 3 million instructions in order to support more complex computations at compile-time.

Support for hot code reloading has been implemented for the JavaScript target. To use it, compile your code with --hotCodeReloading:on and use a helper library such as LiveReload or BrowserSync.

A new compiler option --cppCompileToNamespace puts the generated C++ code into the namespace “Nim” in order to avoid naming conflicts with existing C++ code. This is done for all Nim code - internal and exported.

Added macros.getProjectPath and ospaths.putEnv procs to Nim’s virtual machine.

The deadCodeElim option is now always turned on and the switch has no effect anymore, but is recognized for backwards compatibility.

experimental is now a pragma / command line switch that can enable specific language extensions, it is not an all-or-nothing switch anymore.

Nintendo Switch was added as a new platform target. See the compiler user guide for more info.

macros.bindSym now capable to accepts not only literal string or string constant expression. bindSym enhancement make it also can accepts computed string or ident node inside macros / compile time functions / static blocks. Only in templates / regular code it retains it’s old behavior. This new feature can be accessed via {.experimental: “dynamicBindSym”.} pragma/switch.

On Posix systems the global system wide configuration is now put under /etc/nim/nim.cfg , it used to be /etc/nim.cfg . Usually it does not exist, however.

On Posix systems the user configuration is now looked under $XDG_CONFIG_HOME/nim/nim.cfg (if XDG_CONFIG_HOME is not defined, then under ~/.config/nim/nim.cfg ). It used to be $XDG_CONFIG_DIR/nim.cfg (and ~/.config/nim.cfg ). Similarly, on Windows, the user configuration is now looked under %APPDATA%/nim/nim.cfg . This used to be %APPDATA%/nim.cfg .

Bugfixes