diff options
42 files changed, 528 insertions, 133 deletions
diff --git a/compiler.nimble b/compiler.nimble index cb0a08a3f..a98981a97 100644 --- a/compiler.nimble +++ b/compiler.nimble @@ -1,6 +1,6 @@ [Package] name = "compiler" -version = "0.12.0" +version = "0.13.0" author = "Andreas Rumpf" description = "Compiler package providing the compiler sources as a library." license = "MIT" diff --git a/compiler/ccgexprs.nim b/compiler/ccgexprs.nim index 6f513c165..3607f347e 100644 --- a/compiler/ccgexprs.nim +++ b/compiler/ccgexprs.nim @@ -1847,6 +1847,8 @@ proc genClosure(p: BProc, n: PNode, d: var TLoc) = var tmp, a, b: TLoc initLocExpr(p, n.sons[0], a) initLocExpr(p, n.sons[1], b) + if n.sons[0].skipConv.kind == nkClosure: + internalError(n.info, "closure to closure created") getTemp(p, n.typ, tmp) linefmt(p, cpsStmts, "$1.ClPrc = $2; $1.ClEnv = $3;$n", tmp.rdLoc, a.rdLoc, b.rdLoc) diff --git a/compiler/commands.nim b/compiler/commands.nim index b38e52bc5..02c0b8486 100644 --- a/compiler/commands.nim +++ b/compiler/commands.nim @@ -53,7 +53,7 @@ proc processSwitch*(switch, arg: string, pass: TCmdLinePass, info: TLineInfo) const HelpMessage = "Nim Compiler Version $1 (" & CompileDate & ") [$2: $3]\n" & - "Copyright (c) 2006-2015 by Andreas Rumpf\n" + "Copyright (c) 2006-" & CompileDate.substr(0, 3) & " by Andreas Rumpf\n" const Usage = slurp"doc/basicopt.txt".replace("//", "") diff --git a/compiler/installer.ini b/compiler/installer.ini index 778cf75bf..95c07e003 100644 --- a/compiler/installer.ini +++ b/compiler/installer.ini @@ -62,7 +62,7 @@ Files: "icons/koch_icon.o" Files: "compiler/readme.txt" Files: "compiler/installer.ini" -Files: "compiler/nim.nim.cfg" +Files: "compiler/*.cfg" Files: "compiler/*.nim" Files: "doc/*.txt" Files: "doc/manual/*.txt" @@ -73,7 +73,7 @@ Files: "compiler/nimfix/*.cfg" Files: "compiler/nimsuggest/*.nim" Files: "compiler/nimsuggest/*.cfg" Files: "compiler/plugins/locals/*.nim" -Files: "compiler/plugins/active.nim" +Files: "compiler/plugins/*.nim" Files: "tools/*.nim" Files: "tools/*.cfg" Files: "tools/*.tmpl" @@ -84,6 +84,8 @@ Files: "tools/niminst/*.nsh" Files: "web/website.ini" Files: "web/*.nim" Files: "web/*.txt" +Files: "bin/nimblepkg/*.nim" +Files: "bin/nimblepkg/*.cfg" [Lib] Files: "lib/nimbase.h" @@ -107,9 +109,6 @@ Files: "lib/wrappers/readline/*.nim" Files: "lib/wrappers/linenoise/*.nim" Files: "lib/wrappers/linenoise/*.c" Files: "lib/wrappers/linenoise/*.h" -Files: "lib/wrappers/sdl/*.nim" -Files: "lib/wrappers/zip/*.nim" -Files: "lib/wrappers/zip/libzip_all.c" Files: "lib/windows/*.nim" Files: "lib/posix/*.nim" diff --git a/compiler/lambdalifting.nim b/compiler/lambdalifting.nim index 9265d09e3..1c0c2494a 100644 --- a/compiler/lambdalifting.nim +++ b/compiler/lambdalifting.nim @@ -213,7 +213,7 @@ proc makeClosure*(prc: PSym; env: PNode; info: TLineInfo): PNode = if env == nil: result.add(newNodeIT(nkNilLit, info, getSysType(tyNil))) else: - if env.kind == nkClosure: + if env.skipConv.kind == nkClosure: localError(info, "internal error: taking closure of closure") result.add(env) @@ -711,7 +711,11 @@ proc liftCapturedVars(n: PNode; owner: PSym; d: DetectionPass; of nkClosure: if n[1].kind == nkNilLit: n.sons[0] = liftCapturedVars(n[0], owner, d, c) - #if n.sons[0].kind == nkClosure: result = n.sons[0] + let x = n.sons[0].skipConv + if x.kind == nkClosure: + #localError(n.info, "internal error: closure to closure created") + # now we know better, so patch it: + n.sons[0] = x.sons[0] of nkLambdaKinds, nkIteratorDef: if n.typ != nil and n[namePos].kind == nkSym: let m = newSymNode(n[namePos].sym) diff --git a/compiler/msgs.nim b/compiler/msgs.nim index 649e28cba..a556ad0c5 100644 --- a/compiler/msgs.nim +++ b/compiler/msgs.nim @@ -828,7 +828,7 @@ proc quit(msg: TMsgKind) = proc log*(s: string) {.procvar.} = var f: File if open(f, "nimsuggest.log", fmAppend): - f.writeln(s) + f.writeLine(s) close(f) proc handleError(msg: TMsgKind, eh: TErrorHandling, s: string) = diff --git a/compiler/sigmatch.nim b/compiler/sigmatch.nim index 354cf965e..96df0c5c6 100644 --- a/compiler/sigmatch.nim +++ b/compiler/sigmatch.nim @@ -1635,6 +1635,7 @@ proc matchesAux(c: PContext, n, nOrig: PNode, if arg != nil and m.baseTypeMatch and container != nil: addSon(container, arg) incrIndexType(container.typ) + checkConstraint(n.sons[a]) else: m.state = csNoMatch return @@ -1675,7 +1676,7 @@ proc matchesAux(c: PContext, n, nOrig: PNode, setSon(m.call, formal.position + 1, arg) inc(f) container = nil - checkConstraint(n.sons[a]) + checkConstraint(n.sons[a]) inc(a) proc semFinishOperands*(c: PContext, n: PNode) = diff --git a/compiler/transf.nim b/compiler/transf.nim index 3e074841e..b2bbdcec3 100644 --- a/compiler/transf.nim +++ b/compiler/transf.nim @@ -383,9 +383,11 @@ proc generateThunk(prc: PNode, dest: PType): PNode = # (see internal documentation): if gCmd == cmdCompileToJS: return prc result = newNodeIT(nkClosure, prc.info, dest) - var conv = newNodeIT(nkHiddenStdConv, prc.info, dest) + var conv = newNodeIT(nkHiddenSubConv, prc.info, dest) conv.add(emptyNode) conv.add(prc) + if prc.kind == nkClosure: + internalError(prc.info, "closure to closure created") result.add(conv) result.add(newNodeIT(nkNilLit, prc.info, getSysType(tyNil))) diff --git a/compiler/vm.nim b/compiler/vm.nim index 80c2c0fbf..b537700fa 100644 --- a/compiler/vm.nim +++ b/compiler/vm.nim @@ -15,7 +15,7 @@ const debugEchoCode = false import ast except getstr import - strutils, astalgo, msgs, vmdef, vmgen, nimsets, types, passes, unsigned, + strutils, astalgo, msgs, vmdef, vmgen, nimsets, types, passes, parser, vmdeps, idents, trees, renderer, options, transf, parseutils, vmmarshal diff --git a/compiler/vmgen.nim b/compiler/vmgen.nim index 75c1378e5..e4435294f 100644 --- a/compiler/vmgen.nim +++ b/compiler/vmgen.nim @@ -28,7 +28,7 @@ # this copy depends on the involved types. import - unsigned, strutils, ast, astalgo, types, msgs, renderer, vmdef, + strutils, ast, astalgo, types, msgs, renderer, vmdef, trees, intsets, rodread, magicsys, options, lowerings from os import splitFile diff --git a/doc/lib.txt b/doc/lib.txt index 4fa49095c..90cf36240 100644 --- a/doc/lib.txt +++ b/doc/lib.txt @@ -84,7 +84,7 @@ Collections and algorithms * `sequtils <sequtils.html>`_ This module implements operations for the built-in seq type which were inspired by functional programming languages. - + String handling --------------- @@ -165,6 +165,8 @@ Generic Operating System Services This module implements the ability to monitor a directory/file for changes using Posix's inotify API. + **Warning:** This module will likely be moved out to a Nimble package soon. + * `asyncfile <asyncfile.html>`_ This module implements asynchronous file reading and writing using ``asyncdispatch``. @@ -191,6 +193,11 @@ Math libraries * `basic3d <basic3d.html>`_ Basic 3d support with vectors, points, matrices and some basic utilities. +* `mersenne <mersenne.html>`_ + Mersenne twister random number generator. + +* `stats <stats.html>`_ + Statistical analysis Internet Protocols and Support ------------------------------ @@ -209,7 +216,8 @@ Internet Protocols and Support This module implements a simple HTTP server. * `httpclient <httpclient.html>`_ - This module implements a simple HTTP client. + This module implements a simple HTTP client which supports both synchronous + and asynchronous retrieval of web pages. * `smtp <smtp.html>`_ This module implement a simple SMTP client. @@ -226,19 +234,17 @@ Internet Protocols and Support * `asyncdispatch <asyncdispatch.html>`_ This module implements an asynchronous dispatcher for IO operations. - **Note:** This module is still largely experimental. - * `asyncnet <asyncnet.html>`_ This module implements asynchronous sockets based on the ``asyncdispatch`` module. - **Note:** This module is still largely experimental. - * `asynchttpserver <asynchttpserver.html>`_ This module implements an asynchronous HTTP server using the ``asyncnet`` module. - **Note:** This module is still largely experimental. +* `asyncftpclient <asyncftpclient.html>`_ + This module implements an asynchronous FTP client using the ``asyncnet`` + module. * `net <net.html>`_ This module implements a high-level sockets API. It will replace the @@ -346,6 +352,8 @@ Cryptography and Hashing * `base64 <base64.html>`_ This module implements a base64 encoder and decoder. +* `securehash <securehash.html>`_ + This module implements a sha1 encoder and decoder. Multimedia support ------------------ @@ -381,6 +389,11 @@ Miscellaneous This module implements new experimental features. Currently the syntax sugar for anonymous procedures. +* `coro <coro.html>`_ + This module implements experimental coroutines in Nim. + +* `unittest <unittest.html>`_ + Implements a Unit testing DSL. Modules for JS backend --------------------------- diff --git a/doc/manual/lexing.txt b/doc/manual/lexing.txt index 5990dff07..4187a60a4 100644 --- a/doc/manual/lexing.txt +++ b/doc/manual/lexing.txt @@ -88,7 +88,7 @@ Multiline comments support nesting: proc p[T](x: T) = discard ]# -Multiline documentation comments look like and support nesting too: +Multiline documentation comments also exist and support nesting too: .. code-block:: nim proc foo = diff --git a/doc/tut2.txt b/doc/tut2.txt index 7479d8479..563344570 100644 --- a/doc/tut2.txt +++ b/doc/tut2.txt @@ -112,7 +112,7 @@ Example: Sym = object # a symbol name: string # the symbol's name line: int # the line the symbol was declared in - code: PNode # the symbol's abstract syntax tree + code: Node # the symbol's abstract syntax tree Type conversions @@ -162,11 +162,11 @@ An example: of nkFloat: floatVal: float of nkString: strVal: string of nkAdd, nkSub: - leftOp, rightOp: PNode + leftOp, rightOp: Node of nkIf: - condition, thenPart, elsePart: PNode + condition, thenPart, elsePart: Node - var n = PNode(kind: nkFloat, floatVal: 1.0) + var n = Node(kind: nkFloat, floatVal: 1.0) # the following statement raises an `FieldError` exception, because # n.kind's value does not fit: n.strVal = "" diff --git a/install.txt b/install.txt index 55e8d8ce5..67be2221b 100644 --- a/install.txt +++ b/install.txt @@ -9,7 +9,7 @@ should be in your ``$PATH`` (most likely the case). Note that some few Linux distributions do not ship with a GCC compiler preinstalled - then you have to install it. -Install Nim by downloading the appropriate ``.zip`` file and extracting it +Install Nim by downloading the appropriate ``.tar.xz`` file and extracting it to a directory of your choice. The Nim Compiler will stay in this directory (unless you copy it somewhere else). The compiler does not need write access to its directory, so copying the nim folder to ``/opt`` diff --git a/lib/impure/db_mysql.nim b/lib/impure/db_mysql.nim index 170fee8b8..1b7f1de61 100644 --- a/lib/impure/db_mysql.nim +++ b/lib/impure/db_mysql.nim @@ -10,7 +10,49 @@ ## A higher level `mySQL`:idx: database wrapper. The same interface is ## implemented for other databases too. ## -## Example: +## See also: `db_odbc <db_odbc.html>`_, `db_sqlite <db_sqlite.html>`_, +## `db_postgres <db_postgres.html>`_. +## +## Parameter substitution +## ---------------------- +## +## All ``db_*`` modules support the same form of parameter substitution. +## That is, using the ``?`` (question mark) to signify the place where a +## value should be placed. For example: +## +## .. code-block:: Nim +## sql"INSERT INTO myTable (colA, colB, colC) VALUES (?, ?, ?)" +## +## +## Examples +## -------- +## +## Opening a connection to a database +## ================================== +## +## .. code-block:: Nim +## import db_mysql +## let db = open("localhost", "user", "password", "dbname") +## db.close() +## +## Creating a table +## ================ +## +## .. code-block:: Nim +## db.exec(sql"DROP TABLE IF EXISTS myTable") +## db.exec(sql("""CREATE TABLE myTable ( +## id integer, +## name varchar(50) not null)""")) +## +## Inserting data +## ============== +## +## .. code-block:: Nim +## db.exec(sql"INSERT INTO myTable (id, name) VALUES (0, ?)", +## "Dominik") +## +## Larger example +## ============== ## ## .. code-block:: Nim ## diff --git a/lib/impure/db_odbc.nim b/lib/impure/db_odbc.nim index 6af69d842..4f0b0469d 100644 --- a/lib/impure/db_odbc.nim +++ b/lib/impure/db_odbc.nim @@ -11,12 +11,54 @@ ## ## This is the same interface that is implemented for other databases. ## -## This has NOT yet been (extensively) tested agains ODBC drivers for -## Teradata, Oracle, Sybase, MSSqlvSvr, et. al. databases +## This has NOT yet been (extensively) tested against ODBC drivers for +## Teradata, Oracle, Sybase, MSSqlvSvr, et. al. databases. ## ## Currently all queries are ANSI calls, not Unicode. ## -## Example: +## See also: `db_postgres <db_postgres.html>`_, `db_sqlite <db_sqlite.html>`_, +## `db_mysql <db_mysql.html>`_. +## +## Parameter substitution +## ---------------------- +## +## All ``db_*`` modules support the same form of parameter substitution. +## That is, using the ``?`` (question mark) to signify the place where a +## value should be placed. For example: +## +## .. code-block:: Nim +## sql"INSERT INTO myTable (colA, colB, colC) VALUES (?, ?, ?)" +## +## +## Examples +## -------- +## +## Opening a connection to a database +## ================================== +## +## .. code-block:: Nim +## import db_odbc +## let db = open("localhost", "user", "password", "dbname") +## db.close() +## +## Creating a table +## ================ +## +## .. code-block:: Nim +## db.exec(sql"DROP TABLE IF EXISTS myTable") +## db.exec(sql("""CREATE TABLE myTable ( +## id integer, +## name varchar(50) not null)""")) +## +## Inserting data +## ============== +## +## .. code-block:: Nim +## db.exec(sql"INSERT INTO myTable (id, name) VALUES (0, ?)", +## "Andreas") +## +## Large example +## ============= ## ## .. code-block:: Nim ## diff --git a/lib/impure/db_postgres.nim b/lib/impure/db_postgres.nim index 9bdbae4c2..60bd1f081 100644 --- a/lib/impure/db_postgres.nim +++ b/lib/impure/db_postgres.nim @@ -10,6 +10,9 @@ ## A higher level `PostgreSQL`:idx: database wrapper. This interface ## is implemented for other databases also. ## +## See also: `db_odbc <db_odbc.html>`_, `db_sqlite <db_sqlite.html>`_, +## `db_mysql <db_mysql.html>`_. +## ## Parameter substitution ## ---------------------- ## @@ -27,7 +30,7 @@ ## ## 2. ``SqlPrepared`` using ``$1, $2, $3, ...`` ## -## .. code-block:: Nim +## .. code-block:: Nim ## prepare(db, "myExampleInsert", ## sql"""INSERT INTO myTable ## (colA, colB, colC) @@ -162,8 +165,10 @@ proc setupQuery(db: DbConn, stmtName: SqlPrepared, proc prepare*(db: DbConn; stmtName: string, query: SqlQuery; nParams: int): SqlPrepared = + ## Creates a new ``SqlPrepared`` statement. Parameter substitution is done + ## via ``$1``, ``$2``, ``$3``, etc. if nParams > 0 and not string(query).contains("$1"): - dbError("""parameter substitution expects "$1" """) + dbError("parameter substitution expects \"$1\"") var res = pqprepare(db, stmtName, query.string, int32(nParams), nil) if pqResultStatus(res) != PGRES_COMMAND_OK: dbError(db) return SqlPrepared(stmtName) @@ -282,6 +287,15 @@ proc getValue*(db: DbConn, query: SqlQuery, var x = pqgetvalue(setupQuery(db, query, args), 0, 0) result = if isNil(x): "" else: $x +proc getValue*(db: DbConn, stmtName: SqlPrepared, + args: varargs[string, `$`]): string {. + tags: [ReadDbEffect].} = + ## executes the query and returns the first column of the first row of the + ## result dataset. Returns "" if the dataset contains no rows or the database + ## value is NULL. + var x = pqgetvalue(setupQuery(db, stmtName, args), 0, 0) + result = if isNil(x): "" else: $x + proc tryInsertID*(db: DbConn, query: SqlQuery, args: varargs[string, `$`]): int64 {. tags: [WriteDbEffect].}= diff --git a/lib/impure/db_sqlite.nim b/lib/impure/db_sqlite.nim index c0d221a0d..1633d48f7 100644 --- a/lib/impure/db_sqlite.nim +++ b/lib/impure/db_sqlite.nim @@ -10,7 +10,48 @@ ## A higher level `SQLite`:idx: database wrapper. This interface ## is implemented for other databases too. ## -## Example: +## See also: `db_odbc <db_odbc.html>`_, `db_postgres <db_postgres.html>`_, +## `db_mysql <db_mysql.html>`_. +## +## Parameter substitution +## ---------------------- +## +## All ``db_*`` modules support the same form of parameter substitution. +## That is, using the ``?`` (question mark) to signify the place where a +## value should be placed. For example: +## +## .. code-block:: Nim +## sql"INSERT INTO myTable (colA, colB, colC) VALUES (?, ?, ?)" +## +## Examples +## -------- +## +## Opening a connection to a database +## ================================== +## +## .. code-block:: Nim +## import db_sqlite +## let db = open("localhost", "user", "password", "dbname") +## db.close() +## +## Creating a table +## ================ +## +## .. code-block:: Nim +## db.exec(sql"DROP TABLE IF EXISTS myTable") +## db.exec(sql("""CREATE TABLE myTable ( +## id integer, +## name varchar(50) not null)""")) +## +## Inserting data +## ============== +## +## .. code-block:: Nim +## db.exec(sql"INSERT INTO myTable (id, name) VALUES (0, ?)", +## "Jack") +## +## Larger example +## ============== ## ## .. code-block:: nim ## diff --git a/lib/impure/rdstdin.nim b/lib/impure/rdstdin.nim index b373859f4..15137b436 100644 --- a/lib/impure/rdstdin.nim +++ b/lib/impure/rdstdin.nim @@ -100,7 +100,7 @@ when defined(Windows): stdout.write "\n" else: - import linenoise, termios, unsigned + import linenoise, termios proc readLineFromStdin*(prompt: string): TaintedString {. tags: [ReadIOEffect, WriteIOEffect].} = diff --git a/lib/pure/collections/tables.nim b/lib/pure/collections/tables.nim index 329b2a1cb..2ed0d2034 100644 --- a/lib/pure/collections/tables.nim +++ b/lib/pure/collections/tables.nim @@ -887,7 +887,7 @@ proc mget*[A](t: CountTableRef[A], key: A): var int {.deprecated.} = result = t[][key] proc getOrDefault*[A](t: CountTableRef[A], key: A): int = - getOrDefaultImpl(t, key) + result = t[].getOrDefault(key) proc hasKey*[A](t: CountTableRef[A], key: A): bool = ## returns true iff `key` is in the table `t`. @@ -1028,3 +1028,15 @@ when isMainModule: assert(merged["foo"] == 5) assert(merged["bar"] == 3) assert(merged["baz"] == 14) + + block: + const testKey = "TESTKEY" + let t: CountTableRef[string] = newCountTable[string]() + + # Before, does not compile with error message: + #test_counttable.nim(7, 43) template/generic instantiation from here + #lib/pure/collections/tables.nim(117, 21) template/generic instantiation from here + #lib/pure/collections/tableimpl.nim(32, 27) Error: undeclared field: 'hcode + doAssert 0 == t.getOrDefault(testKey) + t.inc(testKey,3) + doAssert 3 == t.getOrDefault(testKey) diff --git a/lib/pure/fsmonitor.nim b/lib/pure/fsmonitor.nim index 115c4739e..b22e84f44 100644 --- a/lib/pure/fsmonitor.nim +++ b/lib/pure/fsmonitor.nim @@ -10,6 +10,9 @@ ## This module allows you to monitor files or directories for changes using ## asyncio. ## +## **Warning**: This module will likely disappear soon and be moved into a +## new Nimble package. +## ## Windows support is not yet implemented. ## ## **Note:** This module uses ``inotify`` on Linux (Other Unixes are not yet diff --git a/lib/pure/gentabs.nim b/lib/pure/gentabs.nim index e6a05ec63..928ff8fe0 100644 --- a/lib/pure/gentabs.nim +++ b/lib/pure/gentabs.nim @@ -11,6 +11,8 @@ ## key-value mapping. The keys are required to be strings, but the values ## may be any Nim or user defined type. This module supports matching ## of keys in case-sensitive, case-insensitive and style-insensitive modes. +## +## **Warning:** This module is deprecated, new code shouldn't use it! {.deprecated.} diff --git a/lib/pure/httpserver.nim b/lib/pure/httpserver.nim index 71ba04991..632eb198a 100644 --- a/lib/pure/httpserver.nim +++ b/lib/pure/httpserver.nim @@ -9,6 +9,9 @@ ## This module implements a simple HTTP-Server. ## +## **Warning**: This module will soon be deprecated in favour of +## the ``asyncdispatch`` module, you should use it instead. +## ## Example: ## ## .. code-block:: nim diff --git a/lib/pure/nativesockets.nim b/lib/pure/nativesockets.nim index b5a8d5777..3951b46a3 100644 --- a/lib/pure/nativesockets.nim +++ b/lib/pure/nativesockets.nim @@ -12,7 +12,7 @@ # TODO: Clean up the exports a bit and everything else in general. -import unsigned, os +import os when hostOS == "solaris": {.passl: "-lsocket -lnsl".} diff --git a/lib/pure/net.nim b/lib/pure/net.nim index d1016011e..1cfaf029f 100644 --- a/lib/pure/net.nim +++ b/lib/pure/net.nim @@ -10,7 +10,7 @@ ## This module implements a high-level cross-platform sockets interface. {.deadCodeElim: on.} -import nativesockets, os, strutils, unsigned, parseutils, times +import nativesockets, os, strutils, parseutils, times export Port, `$`, `==` const useWinVersion = defined(Windows) or defined(nimdoc) diff --git a/lib/pure/numeric.nim b/lib/pure/numeric.nim index 71adf19b3..ccda3a146 100644 --- a/lib/pure/numeric.nim +++ b/lib/pure/numeric.nim @@ -7,6 +7,9 @@ # distribution, for details about the copyright. # +## **Warning:** This module will be moved out of the stdlib and into a +## Nimble package, don't use it. + type OneVarFunction* = proc (x: float): float {.deprecated: [TOneVarFunction: OneVarFunction].} diff --git a/lib/pure/poly.nim b/lib/pure/poly.nim index c52300400..b20e9f9d0 100644 --- a/lib/pure/poly.nim +++ b/lib/pure/poly.nim @@ -7,6 +7,9 @@ # distribution, for details about the copyright. # +## **Warning:** This module will be moved out of the stdlib and into a +## Nimble package, don't use it. + import math import strutils import numeric diff --git a/lib/pure/romans.nim b/lib/pure/romans.nim index 18c04ef58..aa047d1cc 100644 --- a/lib/pure/romans.nim +++ b/lib/pure/romans.nim @@ -9,6 +9,9 @@ ## Module for converting an integer to a Roman numeral. ## See http://en.wikipedia.org/wiki/Roman_numerals for reference. +## +## **Warning:** This module will be moved out of the stdlib and into a +## Nimble package, don't use it. const RomanNumeralDigits* = {'I', 'i', 'V', 'v', 'X', 'x', 'L', 'l', 'C', 'c', diff --git a/lib/pure/securehash.nim b/lib/pure/securehash.nim index 8ac6acb0e..657782889 100644 --- a/lib/pure/securehash.nim +++ b/lib/pure/securehash.nim @@ -7,8 +7,7 @@ # distribution, for details about the copyright. # -import - strutils, unsigned +import strutils const Sha1DigestSize = 20 diff --git a/lib/stdlib.nimble b/lib/stdlib.nimble index 0805ead54..e8bb364f1 100644 --- a/lib/stdlib.nimble +++ b/lib/stdlib.nimble @@ -1,6 +1,6 @@ [Package] name = "stdlib" -version = "0.9.0" +version = "0.13.0" author = "Dominik Picheta" description = "Nim's standard library." license = "MIT" diff --git a/lib/system.nim b/lib/system.nim index bb8254364..e884e784c 100644 --- a/lib/system.nim +++ b/lib/system.nim @@ -1808,10 +1808,10 @@ const NimMajor*: int = 0 ## is the major number of Nim's version. - NimMinor*: int = 12 + NimMinor*: int = 13 ## is the minor number of Nim's version. - NimPatch*: int = 1 + NimPatch*: int = 0 ## is the patch number of Nim's version. NimVersion*: string = $NimMajor & "." & $NimMinor & "." & $NimPatch diff --git a/readme.md b/readme.md index 2fee6855d..32dbad9f1 100644 --- a/readme.md +++ b/readme.md @@ -81,7 +81,7 @@ allowing you to create commercial applications. Read copying.txt for more details. -Copyright (c) 2006-2015 Andreas Rumpf. +Copyright (c) 2006-2016 Andreas Rumpf. All rights reserved. # Build Status diff --git a/readme.txt b/readme.txt index 595c70bf2..7f9f50da3 100644 --- a/readme.txt +++ b/readme.txt @@ -14,5 +14,5 @@ allowing you to create commercial applications. Read copying.txt for more details. -Copyright (c) 2006-2015 Andreas Rumpf. +Copyright (c) 2006-2016 Andreas Rumpf. All rights reserved. diff --git a/tests/js/tvarargs.nim b/tests/js/tvarargs.nim new file mode 100644 index 000000000..e2366d7a9 --- /dev/null +++ b/tests/js/tvarargs.nim @@ -0,0 +1,12 @@ + +# bug #3584 + +type + ConsoleObj {.importc.} = object of RootObj + log*: proc() {.nimcall varargs.} + Console = ref ConsoleObj + +var console* {.importc nodecl.}: Console + +when isMainModule: + console.log "Hello, world" diff --git a/tests/untestable/tpostgres.nim b/tests/untestable/tpostgres.nim index 81fe8bf51..dcbdaad39 100644 --- a/tests/untestable/tpostgres.nim +++ b/tests/untestable/tpostgres.nim @@ -1,4 +1,5 @@ -import db_postgres +import db_postgres, strutils + let db = open("localhost", "dom", "", "test") db.exec(sql"DROP TABLE IF EXISTS myTable") @@ -12,4 +13,70 @@ doAssert db.getValue(sql"SELECT name FROM myTable") == name # Check issue #3513 doAssert db.getValue(sql"SELECT name FROM myTable") == name + +# issue #3560 +proc addToDb(conn: DbConn, fileId: int, fileName: string): int64 = + result = conn.insertId(sql("INSERT into files (id, filename) VALUES (?, ?)"), fileId, fileName) + +db.exec(sql"DROP TABLE IF EXISTS files") +db.exec(sql"DROP TABLE IF EXISTS fileobjects") +db.exec(sql("""CREATE TABLE FILEOBJECTS( + ID SERIAL PRIMARY KEY, + FILE_SIZE INT, + MD5 CHAR(32) NOT NULL UNIQUE + );""")) + +db.exec(sql("""CREATE TABLE FILES( + ID SERIAL PRIMARY KEY, + OBJECT_ID INT, + FILENAME TEXT NOT NULL, + URI TEXT, + SCHEME CHAR(10), + PUBLIC BOOLEAN DEFAULT FALSE, + CONSTRAINT fk1_fileobjs FOREIGN KEY (object_id) + REFERENCES fileobjects (id) MATCH SIMPLE + ON DELETE CASCADE + );""")) + +let f1 = db.addToDb(1, "hello.tmp") +doAssert f1 == 1 +let f2 = db.addToDb(2, "hello2.tmp") +doAssert f2 == 2 + +# PreparedStmt vs. normal query +try: + echo db.getValue(sql("select * from files where id = $1"), 1) + doAssert false, "Exception expected" +except DbError: + let msg = getCurrentExceptionMsg().normalize + doAssert "expects" in msg + doAssert "?" in msg + doAssert "parameter substitution" in msg + +doAssert db.getValue(sql("select filename from files where id = ?"), 1) == "hello.tmp" + +var first = prepare(db, "one", sql"select filename from files where id = $1", 1) +doAssert db.getValue(first, 1) == "hello.tmp" + +try: + var second = prepare(db, "two", sql"select filename from files where id = ?", 1) + doAssert false, "Exception expected" +except: + let msg = getCurrentExceptionMsg().normalize + doAssert "expects" in msg + doAssert "$1" in msg + doAssert "parameter substitution" in msg + +# issue #3569 +db.exec(SqlQuery("DROP TABLE IF EXISTS tags")) +db.exec(SqlQuery("CREATE TABLE tags(id serial UNIQUE, name varchar(255))")) + +for i in 1..10: + var name = "t" & $i + echo(name) + discard db.getRow( + SqlQuery("INSERT INTO tags(name) VALUES(\'$1\') RETURNING id" % [name])) + +echo("All tests succeeded!") + db.close() diff --git a/tools/nimgrep.nim b/tools/nimgrep.nim index 221181f66..e93168847 100644 --- a/tools/nimgrep.nim +++ b/tools/nimgrep.nim @@ -11,7 +11,7 @@ import os, strutils, parseopt, pegs, re, terminal const - Version = "0.9" + Version = "1.0" Usage = "nimgrep - Nim Grep Utility Version " & Version & """ (c) 2012 Andreas Rumpf @@ -56,6 +56,7 @@ var proc ask(msg: string): string = stdout.write(msg) + stdout.flushFile() result = stdin.readLine() proc confirm: TConfirmEnum = @@ -108,18 +109,21 @@ proc highlight(s, match, repl: string, t: tuple[first, last: int], writeColored(match) for i in t.last+1 .. y: stdout.write(s[i]) stdout.write("\n") + stdout.flushFile() if showRepl: stdout.write(spaces(alignment-1), "-> ") for i in x .. t.first-1: stdout.write(s[i]) writeColored(repl) for i in t.last+1 .. y: stdout.write(s[i]) stdout.write("\n") + stdout.flushFile() proc processFile(filename: string) = var filenameShown = false template beforeHighlight = if not filenameShown and optVerbose notin options: stdout.writeLine(filename) + stdout.flushFile() filenameShown = true var buffer: string @@ -128,7 +132,9 @@ proc processFile(filename: string) = except IOError: echo "cannot open file: ", filename return - if optVerbose in options: stdout.writeLine(filename) + if optVerbose in options: + stdout.writeLine(filename) + stdout.flushFile() var pegp: TPeg var rep: Regex var result: string @@ -254,10 +260,12 @@ proc walker(dir: string) = proc writeHelp() = stdout.write(Usage) + stdout.flushFile() quit(0) proc writeVersion() = stdout.write(Version & "\n") + stdout.flushFile() quit(0) proc checkOptions(subset: TOptions, a, b: string) = @@ -291,7 +299,7 @@ for kind, key, val in getopt(): of "word", "w": incl(options, optWord) of "ignorecase", "i": incl(options, optIgnoreCase) of "ignorestyle", "y": incl(options, optIgnoreStyle) - of "ext": extensions = val.split('|') + of "ext": extensions.add val.split('|') of "nocolor": useWriteStyled = false of "verbose": incl(options, optVerbose) of "help", "h": writeHelp() diff --git a/web/community.txt b/web/community.txt index b8a6c7372..f63ad5c25 100644 --- a/web/community.txt +++ b/web/community.txt @@ -88,6 +88,20 @@ Nim's Community .. container:: standout + Gitter + ------ + + The `Gitter Chatroom for Nim <https://gitter.im/nim-lang/Nim>`_ is the persistent logged "natural" chatroom for GitHub repositories and very easy to access for GitHub users. This does not need additional software and can send notifications about messages by email. + +.. container:: standout + + Meetup + ------ + + The `Nim BR Meetup <http://www.meetup.com/pt-BR/nim-br>`_ is a brazilian user group about Nim where they are having discussions, talks or workshops about Nim programming language. + +.. container:: standout + How to help ----------- diff --git a/web/download.txt b/web/download.txt index 6ffb0775f..cffad4ac9 100644 --- a/web/download.txt +++ b/web/download.txt @@ -13,8 +13,8 @@ Binaries -------- Unfortunately for now we only provide builds for Windows. -* 32 bit: `nim-0.12.0_x32.exe <download/nim-0.12.0_x32.exe>`_ -* 64 bit: `nim-0.12.0_x64.exe <download/nim-0.12.0_x64.exe>`_ +* 32 bit: `nim-0.13.0_x32.exe <download/nim-0.13.0_x32.exe>`_ +* 64 bit: `nim-0.13.0_x64.exe <download/nim-0.13.0_x64.exe>`_ Installation based on generated C code @@ -24,10 +24,9 @@ This installation method is the preferred way for Linux, Mac OS X, and other Uni like systems. Binary packages may be provided later. -Download one of these: +Download this: -* `nim-0.12.0.zip (28 MB) <download/nim-0.12.0.zip>`_ -* `nim-0.12.0.tar.xz (2.6MB) <download/nim-0.12.0.tar.xz>`_ +* `nim-0.13.0.tar.xz (3.1MB) <download/nim-0.13.0.tar.xz>`_ Extract the file and follow these instructions: diff --git a/web/news.txt b/web/news.txt index bd74ae1a3..62c3cef24 100644 --- a/web/news.txt +++ b/web/news.txt @@ -2,96 +2,198 @@ News ==== -.. - 2016-01-XX Version 0.13.0 released - ================================== - Changes affecting backwards compatibility - ----------------------------------------- +2016-01-18 Version 0.13.0 released +================================== - - ``macros.newLit`` for ``bool`` now produces false/true symbols which - actually work with the bool datatype. - - When compiling to JS, ``Node``, ``NodeType`` and ``Document`` are no longer - defined. Use the types defined in ``dom.nim`` instead. - - The check ``x is iterator`` (used for instance in concepts) was always a - weird special case (you could not use ``x is proc``) and was removed from - the language. - - Top level routines cannot have the calling convention ``closure`` - anymore. - - The ``redis`` module has been moved out of the standard library. It can - now be installed via Nimble and is located here: - https://github.com/nim-lang/redis - - ``math.RunningStat`` and its associated procs have been moved from - the ``math`` module to a new ``stats`` module. +Once again we are proud to announce the latest release of the Nim compiler +and related tools. This release comes just 3 months after the last +release! +A new version of Nimble which depends on this release, has also been +released. See `this <http://forum.nim-lang.org/t/1912>`_ forum thread for +more information about the Nimble release. - Syntax changes - ~~~~~~~~~~~~~~ +This release of Nim includes over 116 bug fixes, many of which are related +to closures. The lambda lifting algorithm in the compiler has been completely +rewritten, and some changes have been made to the semantics of closures in +Nim as a result. These changes may affect backwards compatibility and are all +described in the section below. - The parser now considers leading whitespace in front of operators - to determine if an operator is used in prefix or infix position. - This means that finally ``echo $foo`` is parsed as people expect - which is as ``echo($foo)``. It used to be parsed as ``(echo) $ (foo)``. +With this release, we are one step closer to Nim version 1.0. +The 1.0 release will be a big milestone for Nim, because after that version +is released there will be no more breaking changes made to the language +or the standard library. - ``echo $ foo`` continues to be parsed as ``(echo) $ (foo)``. +That being said, the next release will likely be Nim 0.14. It will focus on +improvements to the GC and concurrency. We will in particular be looking at +ways to add multi-core support to async await. Standard library improvements +are also on our roadmap but may not make it for Nim 0.14. - This also means that ``-1`` is always parsed as prefix operator so - code like ``0..kArraySize div 2 -1`` needs to be changed to - ``0..kArraySize div 2 - 1``. +As always you can download the latest version of Nim from the +`download <download.html>`_ page. - This release also adds multi-line comments to Nim. They look - like ``#[ comment here ]#``. For more details read the section of - the `manual <manual#multiline-comments>`_. +Happy coding! +Changes affecting backwards compatibility +----------------------------------------- - Iterator changes - ~~~~~~~~~~~~~~~~ +- ``macros.newLit`` for ``bool`` now produces false/true symbols which + actually work with the bool datatype. +- When compiling to JS: ``Node``, ``NodeType`` and ``Document`` are no longer + defined. Use the types defined in ``dom.nim`` instead. +- The check ``x is iterator`` (used for instance in concepts) was always a + weird special case (you could not use ``x is proc``) and was removed from + the language. +- Top level routines cannot have the calling convention ``closure`` + anymore. +- The ``redis`` module has been moved out of the standard library. It can + now be installed via Nimble and is located here: + https://github.com/nim-lang/redis +- ``math.RunningStat`` and its associated procs have been moved from + the ``math`` module to a new ``stats`` module. - Implicit return type inference for iterators has been removed from the language. The following used to work: - .. code-block:: nim - iterator it = - yield 7 +Syntax changes +~~~~~~~~~~~~~~ - This was a strange special case and has been removed. Now you need to write it like so which is consistent with procs: +The parser now considers leading whitespace in front of operators +to determine if an operator is used in prefix or infix position. +This means that finally ``echo $foo`` is parsed as people expect, +which is as ``echo($foo)``. It used to be parsed as ``(echo) $ (foo)``. - .. code-block:: nim - iterator it: auto = - yield 7 +``echo $ foo`` continues to be parsed as ``(echo) $ (foo)``. +This also means that ``-1`` is always parsed as prefix operator so +code like ``0..kArraySize div 2 -1`` needs to be changed to +``0..kArraySize div 2 - 1``. - Closure changes - ~~~~~~~~~~~~~~~ +This release also adds multi-line comments to Nim. The syntax for them is: +``#[ comment here ]#``. For more details read the section of +the `manual <docs/manual.html#lexical-analysis-multiline-comments>`_. - The semantics of closures changed: Capturing variables that are in loops do not produce a new environment. Nim closures behave like JavaScript closures now. +Iterator changes +~~~~~~~~~~~~~~~~ - The following used to work as the environment creation used to be attached to the loop body: +Implicit return type inference for iterators has been removed from the language. The following used to work: - .. code-block:: nim +.. code-block:: nim + iterator it = + yield 7 - proc outer = - var s: seq[proc(): int {.closure.}] = @[] - for i in 0 ..< 30: - let ii = i - s.add(proc(): string = return ii*ii)) +This was a strange special case and has been removed. Now you need to write it like so which is consistent with procs: - This behaviour has changed in 0.13.0 and now needs to be written as: - .. code-block:: nim +.. code-block:: nim + iterator it: auto = + yield 7 - proc outer = - var s: seq[proc(): int {.closure.}] = @[] - for i in 0 ..< 30: - (proc () = - let ii = i - s.add(proc(): int = return ii*ii))() - The reason is that environment creations are now only performed once - per proc call. This change is subtle and unfortunate, but: +Closure changes +~~~~~~~~~~~~~~~ - 1. Affects almost no code out there. - 2. Is easier to implement and we are at a point in Nim's development process where simple+stable wins over perfect-in-theory+unstable-in-practice. - 3. Implies programmers are more in control of where memory is allocated which is benefitical for a systems programming language. +The semantics of closures changed: Capturing variables that are in loops do not produce a new environment. Nim closures behave like JavaScript closures now. +The following used to work as the environment creation used to be attached to the loop body: + +.. code-block:: nim + + proc outer = + var s: seq[proc(): int {.closure.}] = @[] + for i in 0 ..< 30: + let ii = i + s.add(proc(): int = return ii*ii)) + +This behaviour has changed in 0.13.0 and now needs to be written as: + +.. code-block:: nim + + proc outer = + var s: seq[proc(): int {.closure.}] = @[] + for i in 0 ..< 30: + (proc () = + let ii = i + s.add(proc(): int = return ii*ii))() + +The reason is that environment creations are now only performed once +per proc call. This change is subtle and unfortunate, but: + +1. Affects almost no code out there. +2. Is easier to implement and we are at a point in Nim's development process where simple+stable wins over perfect-in-theory+unstable-in-practice. +3. Implies programmers are more in control of where memory is allocated which is beneficial for a systems programming language. + +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 <https://github.com/nim-lang/Nim/issues?utf8=%E2%9C%93&q=is%3Aissue+closed%3A%222015-10-27+..+2016-01-19%22+>`_. + +- Fixed "Generic arguments cannot be used in templates (raising undeclared identifier)" + (`#3498 <https://github.com/nim-lang/Nim/issues/3498>`_) +- Fixed "multimethods: Error: internal error: cgmeth.genConv" + (`#3550 <https://github.com/nim-lang/Nim/issues/3550>`_) +- Fixed "multimethods: Error: internal error: cgmeth.genConv" + (`#3550 <https://github.com/nim-lang/Nim/issues/3550>`_) +- Fixed "nimscript - SIGSEGV in except block" + (`#3546 <https://github.com/nim-lang/Nim/issues/3546>`_) +- Fixed "Bool literals in macros do not work." + (`#3541 <https://github.com/nim-lang/Nim/issues/3541>`_) +- Fixed "Docs: nativesocket.html - 404" + (`#3582 <https://github.com/nim-lang/Nim/issues/3582>`_) +- Fixed ""not nil" return types never trigger an error or warning" + (`#2285 <https://github.com/nim-lang/Nim/issues/2285>`_) +- Fixed "No warning or error is raised even if not nil is specified " + (`#3222 <https://github.com/nim-lang/Nim/issues/3222>`_) +- Fixed "Incorrect fsmonitor add() filter logic" + (`#3611 <https://github.com/nim-lang/Nim/issues/3611>`_) +- Fixed ""nimble install nimsuggest" failed" + (`#3622 <https://github.com/nim-lang/Nim/issues/3622>`_) +- Fixed "compile time `excl ` cause SIGSEGV" + (`#3639 <https://github.com/nim-lang/Nim/issues/3639>`_) +- Fixed "Unable to echo unsigned ints at compile-time" + (`#2514 <https://github.com/nim-lang/Nim/issues/2514>`_) +- Fixed "Nested closure iterator produces internal error" + (`#1725 <https://github.com/nim-lang/Nim/issues/1725>`_) +- Fixed "C Error on walkDirRec closure" + (`#3636 <https://github.com/nim-lang/Nim/issues/3636>`_) +- Fixed "Error in generated c code" + (`#3201 <https://github.com/nim-lang/Nim/issues/3201>`_) +- Fixed "C Compile-time error with generic proc type." + (`#2659 <https://github.com/nim-lang/Nim/issues/2659>`_) +- Fixed "ICE dereferencing array pointer" + (`#2240 <https://github.com/nim-lang/Nim/issues/2240>`_) +- Fixed "Lambda lifting crash" + (`#2007 <https://github.com/nim-lang/Nim/issues/2007>`_) +- Fixed "Can't reference outer variables from a closure in an iterator" + (`#2604 <https://github.com/nim-lang/Nim/issues/2604>`_) +- Fixed "M&S collector breaks with nested for loops." + (`#603 <https://github.com/nim-lang/Nim/issues/603>`_) +- Fixed "Regression: bad C codegen" + (`#3723 <https://github.com/nim-lang/Nim/issues/3723>`_) +- Fixed "JS backend - handle bool type in case statement" + (`#3722 <https://github.com/nim-lang/Nim/issues/3722>`_) +- Fixed "linenoise compilation with cpp" + (`#3720 <https://github.com/nim-lang/Nim/issues/3720>`_) +- Fixed "(???,???) duplicate case label" + (`#3665 <https://github.com/nim-lang/Nim/issues/3665>`_) +- Fixed "linenoise compilation with cpp" + (`#3720 <https://github.com/nim-lang/Nim/issues/3720>`_) +- Fixed "Update list of backward incompatibilities for Nim 0.12.0 in the main site" + (`#3689 <https://github.com/nim-lang/Nim/issues/3689>`_) +- Fixed "Can't compile nimble with latest devel - codegen bug" + (`#3730 <https://github.com/nim-lang/Nim/issues/3730>`_) + + +2016-01-18 Andreas Rumpf's talk at OSCON Amsterdam +================================================== + +In case you have missed it, here is Andreas' Nim: An Overview talk at +OSCON Amsterdam. + +.. raw:: html + + <iframe width="560" height="315" src="https://www.youtube.com/embed/4rJEBs_Nnaw" frameborder="0" allowfullscreen></iframe> 2015-10-27 Version 0.12.0 released ================================== @@ -121,6 +223,11 @@ changes are also documented in this forum Changes affecting backwards compatibility ----------------------------------------- +- The regular expression modules, ``re`` and ``nre`` now depend on version + 8.36 of PCRE. If you have an older version you may see a message similar + to ``could not import: pcre_free_study`` output when you start your + program. See `this issue <https://github.com/docopt/docopt.nim/issues/13>`_ + for more information. - ``tables.[]``, ``strtabs.[]``, ``critbits.[]`` **now raise** the ``KeyError`` **exception when the key does not exist**! Use the new ``getOrDefault`` instead to get the old behaviour. Compile all your diff --git a/web/support.txt b/web/support.txt index 17faef7bf..9a526605e 100644 --- a/web/support.txt +++ b/web/support.txt @@ -34,7 +34,7 @@ The bid for contracting work is a commercial offer provided by: | **METATEXX GmbH** | Spicher Str. 30 -| 53859 Niederkassel +| 53859 Niederkassel | GERMANY | EU VAT-IN: DE287088604 | http://metatexx.de/index.php?index=12 diff --git a/web/ticker.txt b/web/ticker.txt index 106f8f008..1f9bd3e97 100644 --- a/web/ticker.txt +++ b/web/ticker.txt @@ -1,3 +1,13 @@ +<a class="news" href="news.html#Z2016-01-18-version-0-13-0-released"> + <h4>January 18, 2016</h4> + <p>Nim version 0.13.0 has been released!</p> +</a> + +<a class="news" href="news.html#Z2016-01-18-andreas-rumpf-s-talk-at-oscon-amsterdam"> + <h4>January 18, 2016</h4> + <p>Andreas Rumpf's talk at OSCON Amsterdam</p> +</a> + <a class="news" href="news.html#Z2015-10-27-version-0-12-0-released"> <h4>October 27, 2015</h4> <p>Nim version 0.12.0 has been released!</p> @@ -8,14 +18,4 @@ <p>First official Nim conference will be in Kyiv!</p> </a> -<a class="news" href="news.html#Z2015-05-04-version-0-11-2-released"> - <h4>May 4, 2015</h4> - <p>Nim version 0.11.2 has been released!</p> -</a> - -<a class="news" href="news.html#Z2014-12-29-version-0-10-2-released"> - <h4>Dec 29, 2014</h4> - <p>Nim version 0.10.2 has been released!</p> -</a> - <a href="news.html" class="blue">See All News...</a> diff --git a/web/website.ini b/web/website.ini index 6343193d5..46564d19f 100644 --- a/web/website.ini +++ b/web/website.ini @@ -39,7 +39,7 @@ srcdoc2: "impure/re;pure/typetraits" srcdoc2: "pure/concurrency/threadpool.nim;pure/concurrency/cpuinfo.nim" srcdoc: "system/threads.nim;system/channels.nim;js/dom" srcdoc2: "pure/os;pure/strutils;pure/math;pure/matchers;pure/algorithm" -srcdoc2: "pure/stats;impure/nre" +srcdoc2: "pure/stats;impure/nre;windows/winlean" srcdoc2: "pure/complex;pure/times;pure/osproc;pure/pegs;pure/dynlib" srcdoc2: "pure/parseopt;pure/parseopt2;pure/hashes;pure/strtabs;pure/lexbase" srcdoc2: "pure/parsecfg;pure/parsexml;pure/parsecsv;pure/parsesql" @@ -63,8 +63,8 @@ srcdoc2: "deprecated/pure/ftpclient" srcdoc2: "pure/asyncfile;pure/asyncftpclient" srcdoc2: "pure/md5;pure/rationals" srcdoc2: "posix/posix" -srcdoc2: "pure/fenv" -srcdoc2: "pure/basic2d;pure/basic3d" +srcdoc2: "pure/fenv;pure/securehash" +srcdoc2: "pure/basic2d;pure/basic3d;pure/mersenne;pure/coro" ; Note: everything under 'webdoc' doesn't get listed in the index, so wrappers ; should live here |