Version 0.15.0 released ======================= .. container:: metadata Posted by Dominik Picheta and Andreas Rumpf on 30/09/2016 We're happy to announce that the latest release of Nim, version 0.15.0, is now available! As always, you can grab the latest version from the `downloads page `_. This release includes almost 180 bug fixes and improvements. To see a full list of changes, take a look at the detailed changelog `below <#changelog>`_. Some of the most significant changes in this release include: improvements to the documentation, addition of a new ``multisync`` macro, and a new ``HttpClient`` implementation. Documentation ~~~~~~~~~~~~~ All pages in the documentation now contain a search box and a drop down to select how procedures should be sorted. This allows you to search for procedures, types, macros and more from any documentation page. .. raw::html Doc search Sorting the procedures by type shows a more natural table of contents. This should also help you to find procedures and other identifiers. .. raw::html Doc sort Multisync macro ~~~~~~~~~~~~~~~ The ``multisync`` macro was implemented to enable you to define both synchronous and asynchronous IO procedures without having to duplicate a lot of code. As an example, consider the ``recvTwice`` procedure below: .. code-block:: nim proc recvTwice(socket: Socket | AsyncSocket): Future[string] {.multisync.} = result = "" result.add(await socket.recv(25)) result.add(await socket.recv(20)) The ``multisync`` macro will transform this procedure into the following: .. code-block:: nim proc recvTwice(socket: Socket): string = result = "" result.add(socket.recv(25)) result.add(socket.recv(20)) proc recvTwice(socket: AsyncSocket): Future[string] {.async.} = result = "" result.add(await socket.recv(25)) result.add(await socket.recv(20)) Allowing you to use ``recvTwice`` with both synchronous and asynchronous sockets. HttpClient ~~~~~~~~~~ Many of the ``httpclient`` module's procedures have been deprecated in favour of a new implementation using the ``multisync`` macro. There are now two types: ``HttpClient`` and ``AsyncHttpClient``. Both of these implement the same procedures and functionality, the only difference is timeout support and whether they are blocking or not. See the `httpclient `_ module documentation for more information. Changelog ~~~~~~~~~ Changes affecting backwards compatibility ----------------------------------------- - The ``json`` module now uses an ``OrderedTable`` rather than a ``Table`` for JSON objects. - The ``split`` `(doc) `_ procedure in the ``strutils`` module (with a delimiter of type ``set[char]``) no longer strips and splits characters out of the target string by the entire set of characters. Instead, it now behaves in a similar fashion to ``split`` with ``string`` and ``char`` delimiters. Use ``splitWhitespace`` to get the old behaviour. - The command invocation syntax will soon apply to open brackets and curlies too. This means that code like ``a [i]`` will be interpreted as ``a([i])`` and not as ``a[i]`` anymore. Likewise ``f (a, b)`` means that the tuple ``(a, b)`` is passed to ``f``. The compiler produces a warning for ``a [i]``:: Warning: a [b] will be parsed as command syntax; spacing is deprecated See `Issue #3898 `_ for the relevant discussion. - Overloading the special operators ``.``, ``.()``, ``.=``, ``()`` now needs to be enabled via the ``{.experimental.}`` pragma. - ``immediate`` templates and macros are now deprecated. Use ``untyped`` `(doc) `_ parameters instead. - The metatype ``expr`` is deprecated. Use ``untyped`` `(doc) `_ instead. - The metatype ``stmt`` is deprecated. Use ``typed`` `(doc) `_ instead. - The compiler is now more picky when it comes to ``tuple`` types. The following code used to compile, now it's rejected: .. code-block:: nim import tables var rocketaims = initOrderedTable[string, Table[tuple[k: int8, v: int8], int64]]() rocketaims["hi"] = {(-1.int8, 0.int8): 0.int64}.toTable() Instead be consistent in your tuple usage and use tuple names for named tuples: .. code-block:: nim import tables var rocketaims = initOrderedTable[string, Table[tuple[k: int8, v: int8], int64]]() rocketaims["hi"] = {(k: -1.int8, v: 0.int8): 0.int64}.toTable() - Now when you compile console applications for Windows, console output encoding is automatically set to UTF-8. - Unhandled exceptions in JavaScript are now thrown regardless of whether ``noUnhandledHandler`` is defined. But the stack traces should be much more readable now. - In JavaScript, the ``system.alert`` procedure has been deprecated. Use ``dom.alert`` instead. - De-deprecated ``re.nim`` because there is too much code using it and it got the basic API right. - The type of ``headers`` field in the ``AsyncHttpClient`` type `(doc) `_ has been changed from a string table to the specialised ``HttpHeaders`` type. - The ``httpclient.request`` `(doc) `_ procedure which takes the ``httpMethod`` as a string value no longer requires it to be prefixed with ``"http"`` (or similar). - Converting a ``HttpMethod`` `(doc) `_ value to a string using the ``$`` operator will give string values without the ``"Http"`` prefix now. - The ``Request`` `(doc) `_ object defined in the ``asynchttpserver`` module now uses the ``HttpMethod`` type for the request method. Library Additions ----------------- - Added ``readHeaderRow`` and ``rowEntry`` to the ``parsecsv`` `(doc) `_ module to provide a lightweight alternative to python's ``csv.DictReader``. - Added ``setStdIoUnbuffered`` proc to the ``system`` module to enable unbuffered I/O. - Added ``center`` and ``rsplit`` to the ``strutils`` `(doc) `_ module to provide similar Python functionality for Nim's strings. - Added ``isTitle``, ``title``, ``swapCase``, ``isUpper``, ``toUpper``, ``isLower``, ``toLower``, ``isAlpha``, ``isSpace``, and ``capitalize`` to the ``unicode.nim`` `(doc) `_ module to provide unicode aware case manipulation and case testing. - Added a new module ``strmisc`` `(doc) `_ to hold uncommon string operations. Currently contains ``partition``, ``rpartition`` and ``expandTabs``. - Split out ``walkFiles`` in the ``os`` `(doc) `_ module to three separate procs in order to make a clear distinction of functionality. ``walkPattern`` iterates over both files and directories, while ``walkFiles`` now only iterates over files and ``walkDirs`` only iterates over directories. - Added a synchronous ``HttpClient`` in the ``httpclient`` `(doc) `_ module. The old ``get``, ``post`` and similar procedures are now deprecated in favour of it. - Added a new macro called ``multisync`` allowing you to write procedures for synchronous and asynchronous sockets with no duplication. - The ``async`` macro will now complete ``FutureVar[T]`` parameters automatically unless they have been completed already. Tool Additions -------------- - The documentation is now searchable and sortable by type. - Pragmas are now hidden by default in the documentation to reduce noise. - Edit links are now present in the documentation. Compiler Additions ------------------ - The ``-d/--define`` flag can now optionally take a value to be used by code at compile time. `(doc) `_ Nimscript Additions ------------------- - It's possible to enable and disable specific hints and warnings in Nimscript via the ``warning`` and ``hint`` procedures. - Nimscript exports a proc named ``patchFile`` which can be used to patch modules or include files for different Nimble packages, including the ``stdlib`` package. Language Additions ------------------ - Added ``{.intdefine.}`` and ``{.strdefine.}`` macros to make use of (optional) compile time defines. `(doc) `_ - If the first statement is an ``import system`` statement then ``system`` is not imported implicitly anymore. This allows for code like ``import system except echo`` or ``from system import nil``. Bugfixes -------- The list below has been generated based on the commits in Nim's git repository. As such it lists only the issues which have been closed via a commit, for a full list see `this link on Github `_. - Fixed "RFC: should startsWith and endsWith work with characters?" (`#4252 `_) - Fixed "Feature request: unbuffered I/O" (`#2146 `_) - Fixed "clear() not implemented for CountTableRef" (`#4325 `_) - Fixed "Cannot close file opened async" (`#4334 `_) - Fixed "Feature Request: IDNA support" (`#3045 `_) - Fixed "Async: wrong behavior of boolean operations on futures" (`#4333 `_) - Fixed "os.walkFiles yields directories" (`#4280 `_) - Fixed "Fix #4392 and progress on #4170" (`#4393 `_) - Fixed "Await unable to wait futures from objects fields" (`#4390 `_) - Fixed "TMP variable name generation should be more stable" (`#4364 `_) - Fixed "nativesockets doesn't compile for Android 4.x (API v19 or older) because of gethostbyaddr" (`#4376 `_) - Fixed "no generic parameters allowed for ref" (`#4395 `_) - Fixed "split proc in strutils inconsistent for set[char]" (`#4305 `_) - Fixed "Problem with sets in devel" (`#4412 `_) - Fixed "Compiler crash when using seq[PNimrodNode] in macros" (`#537 `_) - Fixed "ospaths should be marked for nimscript use only" (`#4249 `_) - Fixed "Repeated deepCopy() on a recursive data structure eventually crashes" (`#4340 `_) - Fixed "Analyzing destructor" (`#4371 `_) - Fixed "getType does not work anymore on a typedesc" (`#4462 `_) - Fixed "Error in rendering empty JSON array" (`#4399 `_) - Fixed "Segmentation fault when using async pragma on generic procs" (`#2377 `_) - Fixed "Forwarding does not work for generics, | produces an implicit generic" (`#3055 `_) - Fixed "Inside a macro, the length of the `seq` data inside a `queue` does not increase and crashes" (`#4422 `_) - Fixed "compiler sigsegv while processing varargs" (`#4475 `_) - Fixed "JS codegen - strings are assigned by reference" (`#4471 `_) - Fixed "when statement doesn't verify syntax" (`#4301 `_) - Fixed ".this pragma doesn't work with .async procs" (`#4358 `_) - Fixed "type foo = range(...) crashes compiler" (`#4429 `_) - Fixed "Compiler crash" (`#2730 `_) - Fixed "Crash in compiler with static[int]" (`#3706 `_) - Fixed "Bad error message "could not resolve"" (`#3548 `_) - Fixed "Roof operator on string in template crashes compiler (Error: unhandled exception: sons is not accessible [FieldError])" (`#3545 `_) - Fixed "SIGSEGV during compilation with parallel block" (`#2758 `_) - Fixed "Codegen error with template and implicit dereference" (`#4478 `_) - Fixed "@ in importcpp should work with no-argument functions" (`#4496 `_) - Fixed "Regression: findExe raises" (`#4497 `_) - Fixed "Linking error - repeated symbols when splitting into modules" (`#4485 `_) - Fixed "Error: method is not a base" (`#4428 `_) - Fixed "Casting from function returning a tuple fails" (`#4345 `_) - Fixed "clang error with default nil parameter" (`#4328 `_) - Fixed "internal compiler error: openArrayLoc" (`#888 `_) - Fixed "Can't forward declare async procs" (`#1970 `_) - Fixed "unittest.check and sequtils.allIt do not work together" (`#4494 `_) - Fixed "httpclient package can't make SSL requests over an HTTP proxy" (`#4520 `_) - Fixed "False positive warning "declared but not used" for enums." (`#4510 `_) - Fixed "Explicit conversions not using converters" (`#4432 `_) - Fixed "Unclear error message when importing" (`#4541 `_) - Fixed "Change console encoding to UTF-8 by default" (`#4417 `_) - Fixed "Typedesc ~= Generic notation does not work anymore!" (`#4534 `_) - Fixed "unittest broken?" (`#4555 `_) - Fixed "Operator "or" in converter types seems to crash the compiler." (`#4537 `_) - Fixed "nimscript failed to compile/run -- Error: cannot 'importc' variable at compile time" (`#4561 `_) - Fixed "Regression: identifier expected, but found ..." (`#4564 `_) - Fixed "varargs with transformation that takes var argument creates invalid c code" (`#4545 `_) - Fixed "Type mismatch when using empty tuple as generic parameter" (`#4550 `_) - Fixed "strscans" (`#4562 `_) - Fixed "getTypeImpl crashes (SIGSEGV) on variant types" (`#4526 `_) - Fixed "Wrong result of sort in VM" (`#4065 `_) - Fixed "I can't call the random[T](x: Slice[T]): T" (`#4353 `_) - Fixed "invalid C code generated (function + block + empty tuple)" (`#4505 `_) - Fixed "performance issue: const Table make a copy at runtime lookup." (`#4354 `_) - Fixed "Compiler issue: libraries without absolute paths cannot be found correctly" (`#4568 `_) - Fixed "Cannot use math.`^` with non-int types." (`#4574 `_) - Fixed "C codegen fails when constructing an array using an object constructor." (`#4582 `_) - Fixed "Visual Studio 10 unresolved external symbol _trunc(should we support VS2010?)" (`#4532 `_) - Fixed "Cannot pass generic subtypes to proc for generic supertype" (`#4528 `_) - Fixed "Lamda-lifting bug leading to crash." (`#4551 `_) - Fixed "First-class iterators declared as inline are compiled at Nim side (no error message) and fail at C" (`#2094 `_) - Fixed "VS2010-warning C4090 : 'function' : different 'const' qualifiers" (`#4590 `_) - Fixed "Regression: type mismatch with generics" (`#4589 `_) - Fixed "„can raise an unlisted exception“ when assigning nil as default value" (`#4593 `_) - Fixed "upcoming asyncdispatch.closeSocket is not GC-safe" (`#4606 `_) - Fixed "Visual Studio 10.0 compiler errors, 12.0 warning" (`#4459 `_) - Fixed "Exception of net.newContext: result.extraInternalIndex == 0 [AssertionError]" (`#4406 `_) - Fixed "error: redeclaration of 'result_115076' with no linkage" (`#3221 `_) - Fixed "Compiler crashes on conversion from int to float at compile time" (`#4619 `_) - Fixed "wrong number of arguments regression in devel" (`#4600 `_) - Fixed "importc $ has broken error message (and is not documented)" (`#4579 `_) - Fixed "Compiler segfaults on simple importcpp in js mode [regression]" (`#4632 `_) - Fixed "Critical reference counting codegen problem" (`#4653 `_) - Fixed "tables.nim needs lots of {.noSideEffect.}" (`#4254 `_) - Fixed "Capture variable error when using ``=>`` macro" (`#4658 `_) - Fixed "Enum from char: internal error getInt" (`#3606 `_) - Fixed "Compiler crashes in debug mode (no error in release mode) with Natural discriminant in object variants" (`#2865 `_) - Fixed "SIGSEGV when access field in const object variants" (`#4253 `_) - Fixed "varargs cannot be used with template converter." (`#4292 `_) - Fixed "Compiler crashes when borrowing $" (`#3928 `_) - Fixed "internal error: genMagicExpr: mArrPut" (`#4491 `_) - Fixed "Unhelpful error message on importc namespace collision" (`#4580 `_) - Fixed "Problem with openarrays and slices" (`#4179 `_) - Fixed "Removing lines from end of file then rebuilding does not rebuild [js only?]" (`#4656 `_) - Fixed "getCurrentException and getCurrentExceptionMsg do not work with JS" (`#4635 `_) - Fixed "generic proc parameter is not inferred if type parameter has specifier" (`#4672 `_) - Fixed "Cannot instantiate generic parameter when it is parent type parameter" (`#4673 `_) - Fixed "deepCopy doesn't work with inheritance after last commit" (`#4693 `_) - Fixed "Multi-methods don't work when passing ref to a different thread" (`#4689 `_) - Fixed "Infinite loop in effect analysis on generics" (`#4677 `_) - Fixed "SIGSEGV when compiling NimYAML tests" (`#4699 `_) - Fixed "Closing AsyncEvent now also unregisters it on non-Windows platforms" (`#4694 `_) - Fixed "Don't update handle in upcoming/asyncdispatch poll() if it was closed" (`#4697 `_) - Fixed "generated local variables declared outside block" (`#4721 `_) - Fixed "Footer Documentation links, & Community link point to the wrong place under news entries" (`#4529 `_) - Fixed "Jester's macro magic leads to incorrect C generation" (`#4088 `_) - Fixed "cas bug in atomics.nim" (`#3279 `_) - Fixed "nimgrep PEG not capturing the pattern 'A'" (`#4751 `_) - Fixed "GC assert triggers when assigning TableRef threadvar" (`#4640 `_) - Fixed ".this pragma conflicts with experimental ptr dereferencing when names conflict" (`#4671 `_) - Fixed "Generic procs accepting var .importcpp type do not work [regression]" (`#4625 `_) - Fixed "C Error on tuple assignment with array" (`#4626 `_) - Fixed "module securehash not gcsafe" (`#4760 `_) - Fixed "Nimble installation failed on Windows x86." (`#4764 `_) - Fixed "Recent changes to marshal module break old marshalled data" (`#4779 `_) - Fixed "tnewasyncudp.nim test loops forever" (`#4777 `_) - Fixed "Wrong poll timeout behavior in asyncdispatch" (`#4262 `_) - Fixed "Standalone await shouldn't read future" (`#4170 `_) - Fixed "Regression: httpclient fails to compile without -d:ssl" (`#4797 `_) - Fixed "C Error on declaring array of heritable objects with bitfields" (`#3567 `_) - Fixed "Corruption when using Channels and Threads" (`#4776 `_) - Fixed "Sometimes Channel tryRecv() erroneously reports no messages available on the first call on Windows" (`#4746 `_) - Fixed "Improve error message of functions called without parenthesis" (`#4813 `_) - Fixed "Docgen doesn't find doc comments in macro generated procs" (`#4803 `_) - Fixed "asynchttpserver may consume unbounded memory reading headers" (`#3847 `_) - Fixed "TLS connection to api.clashofclans.com hangs forever." (`#4587 `_)