The []
proc for strings now raises an IndexError
exception when
the specified slice is out of bounds. See issue
#6223 for more details.
You can use substr(str, start, finish)
to get the old behaviour back,
see this commit for an example.
strutils.split
and strutils.rsplit
with an empty string and a
separator now returns that empty string.
See issue #4377.
Arrays of char cannot be converted to cstring
anymore, pointers to
arrays of char can! This means $
for arrays can finally exist
in system.nim
and do the right thing. This means $myArrayOfChar
changed
its behaviour! Compile with -d:nimNoArrayToString
to see where to fix your
code.
reExtended
is no longer default for the re
constructor in the re
module.
The behavior of $
has been changed for all standard library collections. The
collection-to-string implementations now perform proper quoting and escaping of
strings and chars.
newAsyncSocket
taking an AsyncFD
now runs setBlocking(false)
on the
fd.
mod
and bitwise and
do not produce range
subtypes anymore. This
turned out to be more harmful than helpful and the language is simpler
without this special typing rule.
formatFloat
/formatBiggestFloat
now support formatting floats with zero
precision digits. The previous precision = 0
behavior (default formatting)
is now available via precision = -1
.
Moved from stdlib into Nimble packages:
Proc toCountTable
now produces a CountTable
with values correspoding to the number of occurrences
of the key in the input. It used to produce a table with all values set to 1
.
Counting occurrences in a sequence used to be:
let mySeq = @[1, 2, 1, 3, 1, 4]
var myCounter = initCountTable[int]()
for item in mySeq:
myCounter.inc item
Now, you can simply do:
let
mySeq = @[1, 2, 1, 3, 1, 4]
myCounter = mySeq.toCountTable()
If you use --dynlibOverride:ssl
with OpenSSL 1.0.x, you now have to
define openssl10
symbol (-d:openssl10
). By default OpenSSL 1.1.x is
assumed.
newNativeSocket
is now named createNativeSocket
.
newAsyncNativeSocket
is now named createAsyncNativeSocket
and it no longer raises an OS error but returns an osInvalidSocket
when
creation fails.
The securehash
module is now deprecated. Instead import std / sha1
.
The readPasswordFromStdin
proc has been moved from the rdstdin
to the terminal
module, thus it does not depend on linenoise anymore.
\n
is now only the single line feed character like in most
other programming languages. The new platform specific newline escape sequence is
written as \p
. This change only affects the Windows platform.
The overloading rules changed slightly so that constrained generics are preferred over unconstrained generics. (Bug #6526)
We changed how array accesses "from backwards" like a[^1]
or a[0..^1]
are
implemented. These are now implemented purely in system.nim
without compiler
support. There is a new "heterogenous" slice type system.HSlice
that takes 2
generic parameters which can be BackwardsIndex
indices. BackwardsIndex
is
produced by system.^
.
This means if you overload []
or []=
you need to ensure they also work
with system.BackwardsIndex
(if applicable for the accessors).
The parsing rules of if
expressions were changed so that multiple
statements are allowed in the branches. We found few code examples that
now fail because of this change, but here is one:
t[ti] = if exp_negative: '-' else: '+'; inc(ti)
This now needs to be written as:
t[ti] = (if exp_negative: '-' else: '+'); inc(ti)
The experimental overloading of the dot .
operators now take
an untyped
parameter as the field name, it used to be
a
static[string]
. You can use
when defined(nimNewDot)
` to make
your code work with both old and new Nim versions.
See special-operators
for more information.
yield
(or await
which is mapped to yield
) never worked reliably
in an array, seq or object constructor and is now prevented at compile-time.
Added sequtils.mapLiterals
for easier construction of array and tuple literals.
Added system.runnableExamples
to make examples in Nim's documentation easier
to write and test. The examples are tested as the last step of
nim doc
.
Implemented getIoHandler
proc in the asyncdispatch
module that allows
you to retrieve the underlying IO Completion Port or Selector[AsyncData]
object in the specified dispatcher.
For string formatting / interpolation a new module called strformat has been added to the stdlib.
The ReadyKey
type in the selectors module now contains an errorCode
field to help distinguish between Event.Error
events.
Implemented an accept
proc that works on a SocketHandle
in
nativesockets
.
Added algorithm.rotateLeft
.
Added typetraits.$
as an alias for typetraits.name
.
Added system.getStackTraceEntries
that allows you to access the stack
trace in a structured manner without string parsing.
Added parseutils.parseSaturatedNatural
.
Added macros.unpackVarargs
.
Added support for asynchronous programming for the JavaScript backend using
the asyncjs
module.
Added true color support for some terminals. Example: ```nim import colors, terminal
const Nim = "Efficient and expressive programming."
var fg = colYellow bg = colBlue int = 1.0
enableTrueColors()
for i in 1..15: styledEcho bgColor, bg, fgColor, fg, Nim, resetStyle int -= 0.01 fg = intensity(fg, int)
setForegroundColor colRed setBackgroundColor colGreen styledEcho "Red on Green.", resetStyle
### Library changes
- ``echo`` now works with strings that contain ``\0`` (the binary zero is not
shown) and ``nil`` strings are equal to empty strings.
- JSON: Deprecated `getBVal`, `getFNum`, and `getNum` in favour of
`getBool`, `getFloat`, `getBiggestInt`. A new `getInt` procedure was also
added.
- ``rationals.toRational`` now uses an algorithm based on continued fractions.
This means its results are more precise and it can't run into an infinite loop
anymore.
- ``os.getEnv`` now takes an optional ``default`` parameter that tells ``getEnv``
what to return if the environment variable does not exist.
- The ``random`` procs in ``random.nim`` have all been deprecated. Instead use
the new ``rand`` procs. The module now exports the state of the random
number generator as type ``Rand`` so multiple threads can easily use their
own random number generators that do not require locking. For more information
about this rename see issue [#6934](https://github.com/nim-lang/Nim/issues/6934)
- ``writeStackTrace`` is now proclaimed to have no IO effect (even though it does)
so that it is more useful for debugging purposes.
- ``db_mysql`` module: ``DbConn`` is now a ``distinct`` type that doesn't expose the
details of the underlying ``PMySQL`` type.
- ``parseopt2`` is now deprecated, use ``parseopt`` instead.
### Language additions
- It is now possible to forward declare object types so that mutually
recursive types can be created across module boundaries. See
[package level objects](https://nim-lang.org/docs/manual.html#package-level-objects)
for more information.
- Added support for casting between integers of same bitsize in VM (compile time and nimscript).
This allows to, among other things, reinterpret signed integers as unsigned.
- Custom pragmas are now supported using pragma ``pragma``, please see language
manual for details.
- Standard library modules can now also be imported via the ``std`` pseudo-directory.
This is useful in order to distinguish between standard library and nimble package
imports:
```nim
import std / [strutils, os, osproc]
import someNimblePackage / [strutils, os]
The unary <
is now deprecated, for .. <
use ..<
for other usages
use the pred
proc.
Bodies of for
loops now get their own scope:
# now compiles:
for i in 0..4:
let i = i + 1
echo i
..
and countup
now only accept a single generic type T
. This means the following code
doesn't die with an "out of range" error anymore:var b = 5.Natural
var a = -5
for i in a..b:
echo i
atomic
and generic
are no longer keywords in Nim. generic
used to be
an alias for concept
, atomic
was not used for anything.
The memory manager now uses a variant of the TLSF algorithm that has much
better memory fragmentation behaviour. According
to http://www.gii.upv.es/tlsf/ the maximum
fragmentation measured is lower than 25%. As a nice bonus alloc
and
dealloc
became O(1) operations.
The compiler is now more consistent in its treatment of ambiguous symbols: Types that shadow procs and vice versa are marked as ambiguous (bug #6693).
codegenDecl pragma now works for the JavaScript backend. It returns an empty string for function return type placeholders.
Extra semantic checks for procs with noreturn pragma: return type is not allowed, statements after call to noreturn procs are no longer allowed.
Noreturn proc calls and raising exceptions branches are now skipped during common type
deduction in if
and case
expressions. The following code snippets now compile:
import strutils
let str = "Y"
let a = case str:
of "Y": true
of "N": false
else: raise newException(ValueError, "Invalid boolean")
let b = case str:
of nil, "": raise newException(ValueError, "Invalid boolean")
elif str.startsWith("Y"): true
elif str.startsWith("N"): false
else: false
let c = if str == "Y": true
elif str == "N": false
else:
echo "invalid bool"
quit("this is the end")
Pragmas now support call syntax, for example: {.exportc"myname".}
and
{.exportc("myname").}
The deprecated
pragma now supports a user-definable warning message for procs.
proc bar {.deprecated: "use foo instead".} =
return
bar()
The nim doc
command is now an alias for nim doc2
, the second version of
the documentation generator. The old version 1 can still be accessed
via the new nim doc0
command.
Nim's rst2html
command now supports the testing of code snippets via an RST
extension that we called :test:
::
.. code-block:: nim
:test:
# shows how the 'if' statement works
if true: echo "yes"
mitems
generates invalid code."
(#4910)-d:useNimRtl
and --threads:on
"
(#5143)echo
discards everything after a null character"
(#1137)[]
+ unrelated type[^1]: lib/system.nim(3536, 3) Error"
(#6692)[]
+ unrelated type[^1]: lib/system.nim(3536, 3) Error"
(#6692)Fixed "[Regression] value out of range" (#6710)
Fixed "Error when using multisync
macro"
(#6708)
Fixed "formatFloat inconsistent scientific notation" (#6589)
Fixed "Using : (constructor arguments) for passing values to functions with default arguments causes a compiler crash." (#6765)
Fixed "In-place object initialization leads to vcc incompatible code" (#6757)
Fixed "Improve parseCookies doc" (#5721)
Fixed "Parser regression with nested do notation inside conditional" (#6166)
Fixed "Request for better error message" (#6776)
Fixed "Testament tester does not execute test with exitcode
only"
(#6775)
Fixed "JS integer division off by one" (#6753)
Fixed "Regression: cannot prove not nil" (#5781)
Fixed "SIGSEGV: Illegal storage access. (Attempt to read from nil?) in generic proc" (#6073)
Fixed "Request for better error message" (#6776)
Fixed "Nim #head: sorting via reference hangs compiler" (#6724)
Fixed "Cannot cast pointer to char in cpp" (#5979)
Fixed "asynchttpserver replies with several errors on single request" (#6386)
Fixed "object variants superclass trigger bad codegen" (#5521)
Fixed "JS integer division off by one" (#6753)
Fixed "js backend compiler crash with tables indexed by certain types" (#6568)
Fixed "Jsgen bug with is" (#6445)
Fixed "Subrange definition with ..<" (#6788)
Fixed "fields not initialized: array with enum index type as object field." (#6682)
Fixed "Can not delete data in table when table's data type is kind of "not nil"" (#6555)
Fixed "tables.nim: Cannot prove that 'n' is initialized" (#6121)
Fixed "issues with 'not nil' applied to a closure proc" (#6489)
Fixed "not nil
not working in some cases"
(#4686)
Fixed "Cannot prove '@[v]' is not nil" (#3993)
Fixed "Feature: support TCP_NODELAY in net.sockets" (#6795)
Fixed "Code that makes the compiler throw an error message and then hangs" (#6820)
Fixed "Code that makes the compiler throw an error message and then hangs" (#6820)
Fixed "Inconsistent behavior with sequence and string slicing" (#6223)
Fixed "Wrong behavior of "split" (proc and iterator)" (#4377)
Fixed "[Documentation] Invalid module name: [foo, bar]" (#6831)
Fixed "The destructor is not called for temporary objects" (#4214)
Fixed "Destructors does not work with implicit items iterator in for loop" (#985)
Fixed "Error in template when using the type of the parameter inside it" (#6756)
Fixed "should json.to() respect parent attributes?" (#5856)
Fixed "json 'to' macro can not marshalize into tuples" (#6095)
Fixed "json.to fails with seq[T]" (#6604)
Fixed "json.to() is not worth using compared to marshal.to[T]" (#5848)
Fixed "Memory not being released in time, running out of memory" (#6031)
Fixed "[Regression] Bad C codegen for generic code" (#6889)
Fixed "rollingFileLogger deletes file on every start." (#6264)
Fixed "Remove/deprecate securehash module." (#6033)
Fixed "[bug or not] object construction for seq[T] failed without space after colon" (#5999)
Fixed "issues with the random module" (#4726)
Fixed "Reassigning local var to seq of objects results in nil element in Object's seq field" (#668)
Fixed "Compilation error with "newseq[string]"" (#6726)
Fixed "await inside array/dict literal produces invalid code - Part 2" (#6626)
Fixed "terminal.eraseline() gives OverflowError on Windows" (#6931)
Fixed "[Regression] sequtils.any
conflicts with system.any
"
(#6932)
Fixed "C++ codegen: mitems
generates invalid code."
(#4910)
Fixed "seq.mitems produces invalid cpp codegen" (#6892)
Fixed "Concepts regression" (#6108)
Fixed "Generic iterable concept with array crashes compiler" (#6277)
Fixed "C code generation "‘a’ is a pointer; did you mean to use ‘->’?"" (#6462)
Fixed "--NimblePath
fails if a -
in path which is not followed by a number"
(#6949)
Fixed ""not registered in the selector" in asyncfile.close() for something that clearly was registered" (#6906)
Fixed "strange frexp behavior" (#6353)
Fixed "noreturn branches of case statements shouldn't contribute to type" (#6885)
Fixed "Type inference for 'if' statements changed" (#6980)
Fixed "newest asyncdispatch recursion" (#6100)
Fixed "Ambiguous identifier between set type and proc" (#6965)
Fixed "Inconsistent behavior with sequence and string slicing" (#6223)
Fixed "Unsupported OpenSSL library imported dynamically" (#5000)
Fixed "nim check
segfaults"
(#6972)
Fixed "GC deadlock" (#6988)
Fixed "Create a seq without memory initialization" (#6401)
Fixed "Fix bug for getch on Windows while using the arrow keys" (#6966)
Fixed "runnableExamples doesn't work in templates" (#7018)
Fixed "runnableExamples doesn't work with untyped statement blocks" (#7019)
Fixed "Critical bug in parseBiggestFloat" (#7060)
Fixed "[RFC] strformat.% should be gone" (#7078)
Fixed "compiler crash on simple macro" (#7093)
Fixed "Make newlines sane again" (#7089)
Fixed "JS - Unicode enum string representation issue" (#6741)
Fixed "Strange behaviour of 0.17.3 (working ok in 0.17.2)" (#6989)
Fixed "Strange behaviour of 0.17.3 (working ok in 0.17.2)" (#6989)
Fixed "Compiler crash: try expression with infix as" (#7116)
Fixed "nimsuggest crash" (#7140)
Fixed "[RFC] Reintroduce readChar" (#7072)
Fixed "Copyright line needs updating" (#7129)
Fixed "-0.0 doesn't result in negative zero in VM" (#7079)
Fixed "Windows large filesize" (#7121)
Fixed "Securehash is not parsimonious with MD5 and other hash modules" (#6961)
Fixed "os.findExe() shouldn't look in current directory on posix, unless exe has a /" (#6939)
Fixed "compiles(...)
with fatal
pragma causes compiler to exit early"
(#7080)
Fixed "NPE when compile macro that returns concrete value" (#5450)
Fixed "Using a variable of type int | float
causes internal compiler error"
(#6946)
Fixed "Unsigned integers could not be used as array indexes." (#7153)
Fixed "countdown with uint causes underflow" (#4220)
Fixed "Inconsistent method call syntax" (#7200)
Fixed "Impossible to create an empty const array" (#6853)
Fixed "Strange UINT handling" (#3985)
Fixed "Bad codegen when passing arg that is part of return value destination" (#6960)
Fixed "No info about gcsafety in error message when global var is accessed in async proc" (#6186)
Fixed "Resolving package vs. local import ambiguities" (#2819)
Fixed "Internal error with type() operator" (#3711)
Fixed "newAsyncSocket should raise an OS error plus other inconsistencies" (#4995)
Fixed "mapLiterals fails with negative values" (#7215)
Fixed "fmWrite doesn't truncate file with openAsync, unlike open()" (#5531)
Fixed "Move libsvm to an external nimble module" (#5786)
Fixed "Prevent acceptAddr gotcha with newSocket" (#7227)
Fixed "strtabs.getOrDefault is inconsistent with tables.getOrDefault" (#4265)
Fixed "Code falling through into exception handler when no exception thrown." (#7232)
Fixed "the new generic inference rules are broken" (#7247)
Fixed "Odd ..<
regression"
(#6992)
Fixed "Different proc type inferred from default parameter" (#4659)
Fixed "Different proc type inferred from default parameter" (#4659)
Fixed "Testament sometimes ignores test failures" (#7236)
Fixed "New Allocator Fails On >=4GB Requests" (#7120)
Fixed "User pragmas hide effect specifications from sempass2" (#7216)
Fixed "C++: SIGABRT instead of IndexError for out-of-bounds" (#6512)
Fixed "An uncaught exception in cpp mode doesn't show the exception name/msg" (#6431)