Subject: CVS commit: pkgsrc/lang/nim
From: Ryo ONODERA
Date: 2018-04-03 05:24:56
Message id: 20180403032456.399FEFBEC@cvs.NetBSD.org

Log Message:
Update to 0.18.0

Changelog:
0.18.0:
Changes affecting backwards compatibility
Breaking changes in the standard library

    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:
        basic2d deprecated: use glm, arraymancer, neo, or another package instead
        basic3d deprecated: use glm, arraymancer, neo, or another package instead
        gentabs
        libuv
        polynumeric
        pdcurses
        romans
        libsvm
        joyent_http_parser

    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.

Breaking changes in the compiler

    \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.

Library additions

    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:

    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

    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 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:

    import std / [strutils, os, osproc]
    import someNimblePackage / [strutils, os]

Language changes

    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

    To make Nim even more robust the system iterators .. 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()

Tool changes

    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"

0.17.0:
Changes affecting backwards compatibility

    There are now two different HTTP response types, Response and AsyncResponse. \ 
AsyncResponse’s body accessor returns a Future[string]!

    Due to this change you may need to add another await in your code.
    httpclient.request now respects the maxRedirects option. Previously \ 
redirects were handled only by get and post procs.
    The IO routines now raise EOFError for the “end of file” condition. \ 
EOFError is a subtype of IOError and so it’s easier to distinguish between \ 
“error during read” and “error due to EOF”.
    A hash procedure has been added for cstring type in hashes module. \ 
Previously, hash of a cstring would be calculated as a hash of the pointer. Now \ 
the hash is calculated from the contents of the string, assuming cstring is a \ 
null-terminated string. Equal string and cstring values produce an equal hash \ 
value.
    Macros accepting varargs arguments will now receive a node having the \ 
nkArgList node kind. Previous code expecting the node kind to be nkBracket may \ 
have to be updated.
    memfiles.open now closes file handles/fds by default. Passing \ 
allowRemap=true to memfiles.open recovers the old behavior. The old behavior is \ 
only needed to call mapMem on the resulting MemFile.
    posix.nim: For better C++ interop the field sa_sigaction*: proc (x: cint, y: \ 
var SigInfo, z: pointer) {.noconv.} was changed to sa_sigaction*: proc (x: cint, \ 
y: ptr SigInfo, z: pointer) {.noconv.}.
    The compiler doesn’t infer effects for .base methods anymore. This means \ 
you need to annotate them with .gcsafe or similar to clearly declare upfront \ 
every implementation needs to fullfill these contracts.
    system.getAst templateCall(x, y) now typechecks the templateCall properly. \ 
You need to patch your code accordingly.
    macros.getType and macros.getTypeImpl for an enum will now return an AST \ 
that is the same as what is used to define an enum. Previously the AST returned \ 
had a repeated EnumTy node and was missing the initial pragma node (which is \ 
currently empty for an enum).
    macros.getTypeImpl now correctly returns the implementation for a symbol of \ 
type tyGenericBody.
    If the dispatcher parameter’s value used in multi method is nil, a \ 
NilError exception is raised. The old behavior was that the method would be a \ 
nop then.
    posix.nim: the family of ntohs procs now takes unsigned integers instead of \ 
signed integers.
    In Nim identifiers en-dash (Unicode point U+2013) is not an alias for the \ 
underscore anymore. Use underscores instead.
    When the requiresInit pragma is applied to a record type, future versions of \ 
Nim will also require you to initialize all the fields of the type during object \ 
construction. For now, only a warning will be produced.
    The Object construction syntax now performs a number of additional safety \ 
checks. When fields within case objects are initialiazed, the compiler will now \ 
demand that the respective discriminator field has a matching known compile-time \ 
value.
    On posix, the results of waitForExit, peekExitCode, execCmd will return 128 \ 
+ signal number if the application terminates via signal.
    ospaths.getConfigDir now conforms to the XDG Base Directory specification on \ 
non-Windows OSs. It returns the value of the XDG_CONFIG_DIR environment variable \ 
if it is set, and returns the default configuration directory, “~/.config/”, \ 
otherwise.
    Renamed the line info node parameter for newNimNode procedure.

    The parsing rules of do changed.

      foo bar do:
        baz

    Used to be parsed as:

      foo(bar(do:
        baz))

    Now it is parsed as:

      foo(bar, do:
        baz)

Library Additions

    Added system.onThreadDestruction.

    Added dial procedure to networking modules: net, asyncdispatch, asyncnet. It \ 
merges socket creation, address resolution, and connection into single step. \ 
When using dial, you don’t have to worry about the IPv4 vs IPv6 problem. \ 
httpclient now supports IPv6.

    Added to macro which allows JSON to be unmarshalled into a type.

      import json

      type
        Person = object
          name: string
          age: int

      let data = """
        {
          "name": "Amy",
          "age": 4
        }
      """

      let node = parseJson(data)
      let obj = node.to(Person)
      echo(obj)

Tool Additions

    The finish tool can now download MingW for you should it not find a working \ 
MingW installation.

Compiler Additions

    The name mangling rules used by the C code generator changed. Most of the \ 
time local variables and parameters are not mangled at all anymore. This \ 
improves the debugging experience.
    The compiler produces explicit name mangling files when --debugger:native is \ 
enabled. Debuggers can read these .ndi files in order to improve debugging Nim \ 
code.

Language Additions

    The try statement’s except branches now support the binding of a caught \ 
exception to a variable:

        try:
          raise newException(Exception, "Hello World")
        except Exception as exc:
          echo(exc.msg)

    This replaces the getCurrentException and getCurrentExceptionMsg() \ 
procedures, although these procedures will remain in the stdlib for the \ 
foreseeable future. This new language feature is actually implemented using \ 
these procedures.

    In the near future we will be converting all exception types to refs to \ 
remove the need for the newException template.
    A new pragma .used can be used for symbols to prevent the “declared but \ 
not used” warning. More details can be found here.

    The popular “colon block of statements” syntax is now also supported for \ 
let and var statements and assignments:

      template ve(value, effect): untyped =
        effect
        value

      let x = ve(4):
        echo "welcome to Nim!"

    This is particularly useful for DSLs that help in tree construction.

Language changes

    The .procvar annotation is not required anymore. That doesn’t mean you can \ 
pass system.$ to map just yet though.

Files:
RevisionActionfile
1.4modifypkgsrc/lang/nim/Makefile
1.3modifypkgsrc/lang/nim/PLIST
1.3modifypkgsrc/lang/nim/distinfo