changelogs/changelog_0_19_0.md
future has been renamed to sugar.macros.callsite is now deprecated. Since the introduction of varargs
parameters this became unnecessary.(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!cstring for the JS target is now mapped
to charCodeAt.ref object with inheritance rather than object with
inheritance to prevent this issue.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.'c and 'C' suffix for octal literals is now deprecated to
bring the language in line with the standard library (e.g. parseOct).import path.to.module instead of
import path/to/module) has been deprecated.re.split 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.
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
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.
threadpool's await and derivatives have been renamed to blockUntil
to avoid confusions with await from the async macro.
#? braces parsing mode was removed.nimcache for the native code targets was
changed. Read the compiler user guide
for more information.re.split now also supports the maxsplit parameter for consistency
with strutils.split.system.toOpenArray in order to support zero-copy slicing
operations. This is currently not yet available for the JavaScript target.getCurrentDir, findExe, cpDir and mvDir procs to
nimscript.times module now supports up to nanosecond time resolution when available.times.Duration for representing fixed durations of time.times.convert for converting between different time units,
e.g days to seconds.algorithm.binarySearch[T, K] with the cmp parameter.algorithm.upperBound.math.arcsinh, math.arccosh and math.arctanh 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.math.floorMod and math.floorDiv for floor based integer division.rationals.`div```, rationals.`mod```, rationals.floorDiv and rationals.floorMod for rationals.math.prod for product of elements in openArray.parseBinInt 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.flush for memory mapped files.MemMapFileStream.eventParser to the pegs module.macros.copyLineInfo to copy lineInfo from other node.system.ashr an arithmetic right shift for integers.macros.astGenRepr, macros.lispRepr and macros.treeRepr
now escapes the content of string literals consistently.macros.NimSym and macros.NimIdent is now deprecated in favor
of the more general NimNode.macros.getImpl 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.system.SomeReal is now called SomeFloat for consistency and
correctness.algorithm.smartBinarySearch and algorithm.binarySearch is
now joined in binarySearch. smartbinarySearch is now
deprecated.terminal module now exports additional procs for generating ANSI color
codes as strings.val for the CritBitTree[int].inc proc.test block of unittest now shows its type in
error message.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.val for the CritBitTree[T].incl proc.tgamma was renamed to gamma. tgamma is deprecated.pegs module now exports getters for the fields of its Peg and NonTerminal
object types. Pegs with child nodes now have the standard items and pairs
iterators.accept socket procedure defined in the net module can now accept
a nil socket.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.
func is now an alias for proc {.noSideEffect.}.
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.
static and type are now also modifiers similar to ref and ptr.
They denote the special types static[T] and type[T].
Forcing compile-time evaluation with static 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.
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 float types, example range[0.0 .. Inf]. More details in language manual.
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.
"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.
jsondoc2 has been renamed jsondoc, similar to how doc2 was renamed
doc. The old jsondoc can still be invoked with jsondoc0.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 os.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.