changelogs/changelog_1_2_0.md
strformat.fmt macro that use specified characters as
delimiter instead of '{' and '}'.tables.nim: OrderedTable.pop, CountTable.del,
CountTable.pop, Table.pop.strtabs.clear overload that reuses the existing mode.browsers.osOpen const alias for the operating system specific "open" command.sugar.dup for turning in-place algorithms like sort and shuffle
into operations that work on a copy of the data and return the mutated copy,
like the existing sorted does.sugar.collect that does comprehension for seq/set/table collections.sugar.capture for capturing some local loop variables when creating a
closure. This is an enhanced version of closureScope.typetraits.tupleLen to get number of elements of a tuple/type tuple,
and typetraits.get to get the ith element of a type tuple.typetraits.genericParams to return a tuple of generic params from a
generic instantiation.options now treats proc like other pointer types, meaning nil proc variables
are converted to None.os.normalizePathEnd for additional path sanitization.times.fromUnixFloat,toUnixFloat, sub-second resolution versions of
fromUnix,toUnixFloat.wrapnils module for chains of field-access and indexing where the LHS
can be nil. This simplifies code by reducing need for if-else branches around
intermediate maybe nil values. E.g. echo ?.n.typ.kind.minIndex, maxIndex and unzip to the sequtils module.os.isRelativeTo to tell whether a path is relative to another.resetOutputFormatters to unittest.expectIdent to the macros module.os.isValidFilename that returns true if filename argument is valid
for cross-platform use.times.isLeapDay.base64 adds URL-Safe Base64, implements RFC-4648 Section-7.std / compilesettings for querying the compiler about
diverse configuration settings.net.getPeerCertificates and asyncnet.getPeerCertificates for
retrieving the verified certificate chain of the peer we are connected to
through an SSL-wrapped Socket/AsyncSocket.browsers.openDefaultBrowser without URL, implements IETF RFC-6694 Section-3.jsconsole.trace, jsconsole.table, jsconsole.exception for JavaScript target.distinctBase overload for values: assert 12.MyInt.distinctBase == 12std/stackframes, in particular setFrameMsg, which enables
custom runtime annotation of stackframes, see #13351 for examples.
Turn on/off via --stackTraceMsgs:on/off.sequtils.countIt, allowing for counting items using a predicate.with macro for easy function chaining that's available everywhere,
there is no need to concern your APIs with returning the first argument
to enable "chaining", instead use the dedicated macro with that
was designed for it. For example:import std/with
type
Foo = object
col, pos: string
proc setColor(f: var Foo; r, g, b: int) = f.col = $(r, g, b)
proc setPosition(f: var Foo; x, y: float) = f.pos = $(x, y)
var f: Foo
with(f, setColor(2, 3, 4), setPosition(0.0, 1.0))
echo f
macros.newLit now works for ref object types.macro pragmas can now be used in type sections.requires, ensures, assume, assert, invariant.system.writeFile has been overloaded to also support openarray[byte].asyncdispatch.drain now properly takes into account selector.hasPendingOperations
and only returns once all pending async operations are guaranteed to have completed.sequtils.zip now returns a sequence of anonymous tuples i.e. those tuples
now do not have fields named "a" and "b".distinctBase has been moved from sugar to typetraits and now it is
implemented as compiler type trait instead of macro. distinctBase in sugar
module is now deprecated.CountTable.mget has been removed from tables.nim. It didn't work, and it
was an oversight to be included in v1.0.tables.merge(CountTable, CountTable): CountTable has been removed.
It didn't work well together with the existing inplace version of the same proc
(tables.merge(var CountTable, CountTable)).
It was an oversight to be included in v1.0.asyncdispatch.drain now consistently uses the passed timeout value for all
iterations of the event loop, and not just the first iteration.
This is more consistent with the other asyncdispatch APIs, and allows
asyncdispatch.drain to be more efficient.base64.encode and base64.decode were made faster by about 50%.htmlgen adds MathML support
(ISO 40314).macros.eqIdent is now invariant to export markers and backtick quotes.htmlgen.html allows lang in the <html> tag and common valid attributes.macros.basename and basename= got support for PragmaExpr,
so that an expression like MyEnum {.pure.} is handled correctly.httpclient.maxredirects changed from int to Natural, because negative values
serve no purpose whatsoever.httpclient.newHttpClient and httpclient.newAsyncHttpClient added headers
argument to set initial HTTP Headers, instead of a hardcoded empty newHttpHeader().parseutils.parseUntil has now a different behaviour if the until parameter is
empty. This was required for intuitive behaviour of the strscans module
(see bug #13605).strutils.formatFloat with precision = 0 has the same behavior in all
backends, and it is compatible with Python's behavior,
e.g. formatFloat(3.14159, precision = 0) is now 3, not 3..times.parse now only uses input to compute its result, and not now:
parse("2020", "YYYY", utc()) is now 2020-01-01T00:00:00Z instead of
2020-03-02T00:00:00Z if run on 03-02; it also doesn't crash anymore when
used on 29th, 30th, 31st of each month.httpcore.==(string, HttpCode) is now deprecated due to lack of practical
usage. The $ operator can be used to obtain the string form of HttpCode
for comparison if desired.std/oswalkdir was buggy, it's now deprecated and reuses std/os procs.os.walkDir and os.walkDirRec now have new flag, checkDir (default: false).
If it is set to true, it will throw if input dir is invalid instead of a noop
(which is the default behaviour, as it was before this change),
os.walkDirRec only throws if top-level dir is invalid, but ignores errors for
subdirs, otherwise it would be impossible to resume iteration.FD variant of selector.unregister for ioselector_epoll and
ioselector_select now properly handle the Event.User select event type.joinPath path normalization when / is the first argument works correctly:
assert "/" / "/a" == "/a". Fixed the edge case: assert "" / "" == "".xmltree now adds indentation consistently to child nodes for any number
of children nodes.os.splitPath() behavior synchronized with os.splitFile() to return "/"
as the dir component of /root_sub_dir instead of the empty string.lc macro has been removed from sugar. It is now replaced
with the more powerful collect macro.os.relativePath("foo", "foo") is now ".", not "", as "" means invalid
path and shouldn't be conflated with "."; use -d:nimOldRelativePathBehavior
to restore the old behavior.os.joinPath(a, b) now honors trailing slashes in b (or a if b = "").base64.encode no longer supports lineLen and newLine.
Use base64.encodeMime instead.net.newContext now performs SSL Certificate checking on Linux and OSX.
Define nimDisableCertificateValidation to disable it globally.align pragma can now be used for variables and object fields, similar
to the alignas declaration modifier in C/C++.=sink type bound operator is now optional. The compiler can now use a
combination of =destroy and copyMem to move objects efficiently.var b {.byaddr.} = expr enabled by
import std/decls.var a {.foo.}: MyType = expr now lowers to foo(a, MyType, expr) for
non-builtin pragmas, enabling things like lvalue references (see decls.byaddr).--asm command option for easier
inspection of the produced assembler code..localPassc to
pass specific compiler options to the C(++) backend for the C(++) file
that was produced from the current Nim module..nosinks. To disable it for a section of code, use
{.push sinkInference: off.}...{.pop.}.--panics:on that turns runtime
errors like IndexError or OverflowError into fatal errors that cannot
be caught via Nim's try statement. --panics:on can improve the
runtime efficiency and code size of your program significantly.system.Exception as
this is very bad style. You should inherit from ValueError, IOError,
OSError or from a different specific exception type that inherits from
CatchableError and cannot be confused with a Defect.const behave correctly now, meaning that code like
const SOMECONST = 0.int; procThatTakesInt32(SOMECONST) will be illegal now.
Simply write const SOMECONST = 0 instead.{.dynlib.} pragma is now required for exporting symbols when making
shared objects on POSIX and macOS, which make it consistent with the behavior
on Windows..raise effects or side
effects, instead a cast must be used. With the flag --useVersion:1.0 the
old behaviour is emulated.__builtin_sadd_overflow family of functions. (Clang also
supports these). Some versions of GCC lack this feature and unfortunately
we cannot detect this case reliably. So if you get compilation errors like
"undefined reference to __builtin_saddll_overflow" compile your programs
with -d:nimEmulateOverflowChecks.nimgrep --nocolor is ignored on posix; should be instead: --nimgrep --color=[auto]|true|false"
(#7591)csize definition in system.nim"
(#12187)=destroy for elements of closure environments other than for latest devel --gc:destructors"
(#12577)csize_t definition isn't consistently used, nor tested thoroughly..."
(#12597)Table and missed for other table containers"
(#12519)pthread_key_t errors on OpenBSD"
(#12135)type.name[0]"
(#12804)use command does not return all instances of symbol"
(#12832){.push exportc.} wrongly affects generic instantiations, causing codegen errors"
(#12985)invalid pragma: since with nim js"
(#12996)catch doesn't work with exception subclassing"
(#13072)nim cpp --gc:arc is ok"
(#13070)nim doc treats export localSymbol incorrectly"
(#13100)/ can return invalid AbsoluteFile"
(#13121)nim doc main.nim generates broken html (no css)"
(#12998)--genscript messes up nimcache and future nim invocations"
(#13144)_i1 codegen bug"
(#13195)nim doc --project broken with imports below main project file or duplicate names"
(#13150)check in unittest generated by template doesn't show actual value"
(#6736)echo 'discard' | nim c -r - generates a file '-' ; - should be treated specially"
(#13374)execCmdEx"
(#9634)data-* attributes"
(#13444)--hints:off doesn't work (doesn't override ~/.config/nim.cfg)"
(#8312)nimgrep --word doesn't work with operators (eg misses 1 +% 2)"
(#13528)as is usable as infix operator but its existence and precedence are not documented"
(#13409)seq[T]"
(#13596)raise CatchableError is broken with --gc:arc when throwing inside a proc"
(#13599)echo 'echo 1' | nim c -r - silently gives wrong results (nimBetterRun not updated for stdin)"
(#13412)Foo[0.0] is Foo[-0.0] is now false"
(#13730)nim doc - only whitespace on first line causes segfault"
(#13631)os.getApplFreebsd could return incorrect paths in the case of a long path"
(#13806)