shr
is now sign preserving. Use -d:nimOldShiftRight
to enable
the old behavior globally.
The isLower
, isUpper
family of procs in strutils/unicode
operating on strings have been
deprecated since it was unclear what these do. Note that the much more
useful procs that operate on char
or Rune
are not affected.
strutils.editDistance
has been deprecated,
use editdistance.editDistance
or editdistance.editDistanceAscii
instead.
The OpenMP parallel iterator `||
` now supports any #pragma omp directive
and not just #pragma omp parallel for
. See
OpenMP documentation.
The default annotation is parallel for
, if you used OpenMP without annotation
the change is transparent, if you used annotations you will have to prefix
your previous annotations with parallel for
.
Furthermore, an overload with positive stepping is available.
The unchecked
pragma was removed, instead use system.UncheckedArray
.
The undocumented #? strongSpaces
parsing mode has been removed.
The not
operator is now always a unary operator, this means that code like
assert not isFalse(3)
compiles.
getImpl
on a var
or let
symbol will now return the full IdentDefs
tree from the symbol declaration instead of just the initializer portion.
Methods are now ordinary "single" methods, only the first parameter is
used to select the variant at runtime. For backwards compatibility
use the new --multimethods:on
switch.
Generic methods are now deprecated; they never worked well.
Compile time checks for integer and float conversions are now stricter.
For example, const x = uint32(-1)
now gives a compile time error instead
of being equivalent to const x = 0xFFFFFFFF'u32
.
Using typed
as the result type in templates/macros now means
"expression with a type". The old meaning of typed
is preserved
as void
or no result type at all.
A bug allowed macro foo(): int = 123
to compile even though a
macro has to return a NimNode
. This has been fixed.
With the exception of uint
and uint64
, conversion to unsigned types
are now range checked during runtime.
Macro arguments of type typedesc
are now passed to the macro as
NimNode
like every other type except static
. Use typed
for a
behavior that is identical in new and old
Nim. See the RFC Pass typedesc as NimNode to macros
for more details.
osproc.execProcess
now also takes a workingDir
parameter.
std/sha1.secureHash
now accepts openArray[char]
, not string
. (Former
successful matches should keep working, though former failures will not.)
options.UnpackError
is no longer a ref type and inherits from system.Defect
instead of system.ValueError
.
system.ValueError
now inherits from system.CatchableError
instead of system.Defect
.
The procs parseutils.parseBiggestInt
, parseutils.parseInt
,
parseutils.parseBiggestUInt
and parseutils.parseUInt
now raise a
ValueError
when the parsed integer is outside of the valid range.
Previously they sometimes raised an OverflowError
and sometimes they
returned 0
.
The procs parseutils.parseBin
, parseutils.parseOct
and parseutils.parseHex
were not clearing their var
parameter number
and used to push its value to
the left when storing the parsed string into it. Now they always set the value
of the parameter to 0
before storing the result of the parsing, unless the
string to parse is not valid (then the value of number
is not changed).
streams.StreamObject
now restricts its fields to only raise system.Defect
,
system.IOError
and system.OSError
.
This change only affects custom stream implementations.
nre's RegexMatch.{captureBounds,captures}[]
no longer return Option
or
nil
/""
, respectively. Use the newly added n in p.captures
method to
check if a group is captured, otherwise you'll receive an exception.
nre's RegexMatch.{captureBounds,captures}.toTable
no longer accept a
default parameter. Instead uncaptured entries are left empty. Use
Table.getOrDefault()
if you need defaults.
nre's RegexMatch.captures.{items,toSeq}
now returns an Option[string]
instead of a string
. With the removal of nil
strings, this is the only
way to indicate a missing match. Inside your loops, instead
of capture == ""
or capture == nil
, use capture.isSome
to check if a capture is
present, and capture.get
to get its value.
nre's replace()
no longer throws ValueError
when the replacement string
has missing captures. It instead throws KeyError
for named captures, and
IndexError
for unnamed captures. This is consistent with
RegexMatch.{captureBounds,captures}[]
.
splitFile
now correctly handles edge cases, see #10047.
isNil
is no longer false for undefined in the JavaScript backend:
now it's true for both nil and undefined.
Use isNull
or isUndefined
if you need exact equality:
isNil
is consistent with ===
, isNull
and isUndefined
with ==
.
several deprecated modules were removed: ssl
, matchers
, httpserver
,
unsigned
, actors
, parseurl
two poorly documented and not used modules (subexes
, scgi
) were moved to
graveyard (they are available as Nimble packages)
procs string.add(int)
and string.add(float)
which implicitly convert
ints and floats to string have been deprecated.
Use string.addInt(int)
and string.addFloat(float)
instead.
case object
branch transitions via system.reset
are deprecated.
Compile your code with -d:nimOldCaseObjects
for a transition period.
base64 module: The default parameter newLine
for the encode
procs
was changed from "\13\10"
to the empty string ""
.
when
statements
in generics, see bug #8603. This means that code like this does not compile
anymore:proc enumToString*(enums: openArray[enum]): string =
# typo: 'e' instead 'enums'
when e.low.ord >= 0 and e.high.ord < 256:
result = newString(enums.len)
else:
result = newString(enums.len * 2)
discard x
is now illegal when x
is a function symbol.
Implicit imports via --import: module
in a config file are now restricted
to the main package.
There is a new stdlib module std/editdistance
as a replacement for the
deprecated strutils.editDistance
.
There is a new stdlib module std/wordwrap
as a replacement for the
deprecated strutils.wordwrap
.
Added split
, splitWhitespace
, size
, alignLeft
, align
,
strip
, repeat
procs and iterators to unicode.nim
.
Added or
for NimNode
in macros
.
Added system.typeof
for more control over how type
expressions
can be deduced.
Added macros.isInstantiationOf
for checking if the proc symbol
is instantiation of generic proc symbol.
Added the parameter isSorted
for the sequtils.deduplicate
proc.
There is a new stdlib module std/diff
to compute the famous "diff"
of two texts by line.
Added os.relativePath
.
Added parseopt.remainingArgs
.
Added os.getCurrentCompilerExe
(implemented as getAppFilename
at CT),
can be used to retrieve the currently executing compiler.
Added xmltree.toXmlAttributes
.
Added std/sums
module for fast summation functions.
Added Rusage
, getrusage
, wait4
to the posix interface.
Added the posix_utils
module.
Added system.default
.
Added sequtils.items
for closure iterators, allows closure iterators
to be used by the mapIt
, filterIt
, allIt
, anyIt
, etc.
The string output of macros.lispRepr
proc has been tweaked
slightly. The dumpLisp
macro in this module now outputs an
indented proper Lisp, devoid of commas.
Added macros.signatureHash
that returns a stable identifier
derived from the signature of a symbol.
In strutils
empty strings now no longer matched as substrings
anymore.
The Complex
type is now a generic object and not a tuple anymore.
The ospaths
module is now deprecated, use os
instead. Note that
os
is available in a NimScript environment but unsupported
operations produce a compile-time error.
The parseopt
module now supports a new flag allowWhitespaceAfterColon
(default value: true) that can be set to false
for better Posix
interoperability. (Bug #9619.)
os.joinPath
and os.normalizePath
handle edge cases like "a/b/../../.."
differently.
securehash
was moved to lib/deprecated
.
The switch -d:useWinAnsi
is not supported anymore.
In times
module, procs format
and parse
accept a new optional
DateTimeLocale
argument for formatting/parsing dates in other languages.
noSideEffect
that works like
the gcsafe
pragma block.os.getCurrentProcessId
.var
and let
symbols.The standard extension for SCF (source code filters) files was changed from
.tmpl
to .nimf
,
it's more recognizable and allows tools like Github to recognize it as Nim,
see #9647.
The previous extension will continue to work.
Pragma syntax is now consistent. Previous syntax where type pragmas did not follow the type name is now deprecated. Also pragma before generic parameter list is deprecated to be consistent with how pragmas are used with a proc. See #8514 and #1872 for further details.
Hash sets and tables are initialized by default. The explicit initHashSet
,
initTable
, etc. are not needed anymore.
jsondoc
now includes a moduleDescription
field with the module
description. jsondoc0
shows comments as its own objects as shown in the
documentation.nimpretty
: --backup now defaults to off
instead of on
and the flag was
undocumented; use git
instead of relying on backup files.koch
now defaults to build the latest stable Nimble version unless you
explicitly ask for the latest master version via --latest
.fmod
proc is now unavailable on the VM.--outdir
option was added.nim js
will no longer be placed in the nimcache directory.--hotCodeReloading
has been implemented for the native targets.
The compiler also provides a new more flexible API for handling the
hot code reloading events in the code.--expandMacro:macroNameHere
switch
for easy introspection into what a macro expands into.-d:release
switch now does not disable runtime checks anymore.
For a release build that also disables runtime checks
use -d:release -d:danger
or simply -d:danger
.