From e2d820689e3b7bcbbf7b4517fee36fdf67d772f8 Mon Sep 17 00:00:00 2001 From: Yuriy Glukhov Date: Tue, 15 Sep 2015 11:49:01 +0300 Subject: [PATCH 01/11] Changed arguable statements about JVM/CLR. --- web/question.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/web/question.txt b/web/question.txt index 46ea7161c1..9072806f22 100644 --- a/web/question.txt +++ b/web/question.txt @@ -94,9 +94,9 @@ General FAQ What about JVM/CLR backends? ---------------------------- - A JVM backend is almost impossible. The JVM is not expressive enough. It has - never been designed as a general purpose VM anyway. A CLR backend is possible - but would require much work. + JVM/CLR support is not in the nearest plans. However, since these VMs support FFI to C + it should be possible to create native Nim bridges, that transparenlty generate all the + glue code thanks to powerfull metaprogramming capabilities of Nim. .. container:: standout From 61d9f55faf6fc2e7b609a59bff90bfb837a3ce16 Mon Sep 17 00:00:00 2001 From: Yuriy Glukhov Date: Tue, 15 Sep 2015 13:21:05 +0300 Subject: [PATCH 02/11] typo fixed --- web/question.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/question.txt b/web/question.txt index 9072806f22..da38760f56 100644 --- a/web/question.txt +++ b/web/question.txt @@ -96,7 +96,7 @@ General FAQ JVM/CLR support is not in the nearest plans. However, since these VMs support FFI to C it should be possible to create native Nim bridges, that transparenlty generate all the - glue code thanks to powerfull metaprogramming capabilities of Nim. + glue code thanks to powerful metaprogramming capabilities of Nim. .. container:: standout From bfe84d9c8bfc73ad8f35fd4edacc02d55af1c9fc Mon Sep 17 00:00:00 2001 From: Rostyslav Dzinko Date: Thu, 17 Sep 2015 16:01:11 +0300 Subject: [PATCH 03/11] Added missing 412 - 417 http codes which are standard according to rfc2616 which is HTTP/1.1 standard. --- lib/pure/asynchttpserver.nim | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/pure/asynchttpserver.nim b/lib/pure/asynchttpserver.nim index aa7d458b34..5d74896bf5 100644 --- a/lib/pure/asynchttpserver.nim +++ b/lib/pure/asynchttpserver.nim @@ -67,6 +67,12 @@ type Http409 = "409 Conflict", Http410 = "410 Gone", Http411 = "411 Length Required", + Http412 = "412 Precondition Failed", + Http413 = "413 Request Entity Too Large", + Http414 = "414 Request-URI Too Long", + Http415 = "415 Unsupported Media Type", + Http416 = "416 Requested Range Not Satisfiable", + Http417 = "417 Expectation Failed", Http418 = "418 I'm a teapot", Http500 = "500 Internal Server Error", Http501 = "501 Not Implemented", From 721324380dc753aa59efdcd2372b4c8a0e6a9252 Mon Sep 17 00:00:00 2001 From: Yuriy Glukhov Date: Thu, 17 Sep 2015 17:52:36 +0300 Subject: [PATCH 04/11] Transparently coerce int to float in JsonNode.getFNum --- lib/pure/json.nim | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/pure/json.nim b/lib/pure/json.nim index abf6305f2c..06d5a13e29 100644 --- a/lib/pure/json.nim +++ b/lib/pure/json.nim @@ -622,9 +622,12 @@ proc getNum*(n: JsonNode, default: BiggestInt = 0): BiggestInt = proc getFNum*(n: JsonNode, default: float = 0.0): float = ## Retrieves the float value of a `JFloat JsonNode`. ## - ## Returns ``default`` if ``n`` is not a ``JFloat``, or if ``n`` is nil. - if n.isNil or n.kind != JFloat: return default - else: return n.fnum + ## Returns ``default`` if ``n`` is not a ``JFloat`` or ``JInt``, or if ``n`` is nil. + if n.isNil: return default + case n.kind + of JFloat: return n.fnum + of JInt: return float(n.num) + else: return default proc getBVal*(n: JsonNode, default: bool = false): bool = ## Retrieves the bool value of a `JBool JsonNode`. From 6b002e805ef52bd9b2368447e42226c4f67b4f0a Mon Sep 17 00:00:00 2001 From: Dominik Picheta Date: Thu, 17 Sep 2015 20:44:16 +0100 Subject: [PATCH 05/11] Added examples and more docs to base64 module. --- lib/pure/base64.nim | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/lib/pure/base64.nim b/lib/pure/base64.nim index deab39c7c6..32d37ce02f 100644 --- a/lib/pure/base64.nim +++ b/lib/pure/base64.nim @@ -8,6 +8,38 @@ # ## This module implements a base64 encoder and decoder. +## +## Encoding data +## ------------- +## +## In order to encode some text simply call the ``encode`` procedure: +## +## .. code-block::nim +## import base64 +## let encoded = encode("Hello World") +## echo(encoded) # SGVsbG8gV29ybGQ= +## +## Apart from strings you can also encode lists of integers or characters: +## +## .. code-block::nim +## import base64 +## let encodedInts = encode([1,2,3]) +## echo(encodedInts) # AQID +## let encodedChars = encode(['h','e','y']) +## echo(encodedChars) # aGV5 +## +## The ``encode`` procedure takes an ``openarray`` so both arrays and sequences +## can be passed as parameters. +## +## Decoding data +## ------------- +## +## To decode a base64 encoded data string simply call the ``decode`` +## procedure: +## +## .. code-block::nim +## import base64 +## echo(decode("SGVsbG8gV29ybGQ=")) # Hello World const cb64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" @@ -64,11 +96,16 @@ template encodeInternal(s: expr, lineLen: int, newLine: string): stmt {.immediat proc encode*[T:SomeInteger|char](s: openarray[T], lineLen = 75, newLine="\13\10"): string = ## encodes `s` into base64 representation. After `lineLen` characters, a ## `newline` is added. + ## + ## This procedure encodes an openarray (array or sequence) of either integers + ## or characters. encodeInternal(s, lineLen, newLine) proc encode*(s: string, lineLen = 75, newLine="\13\10"): string = ## encodes `s` into base64 representation. After `lineLen` characters, a ## `newline` is added. + ## + ## This procedure encodes a string. encodeInternal(s, lineLen, newLine) proc decodeByte(b: char): int {.inline.} = From 5998f53280d3d49779dbeb5a61c01837752e3d22 Mon Sep 17 00:00:00 2001 From: Dominik Picheta Date: Thu, 17 Sep 2015 22:45:30 +0100 Subject: [PATCH 06/11] Added examples to asyncftpclient module. --- lib/pure/asyncftpclient.nim | 75 +++++++++++++++++++++++++++++++------ 1 file changed, 63 insertions(+), 12 deletions(-) diff --git a/lib/pure/asyncftpclient.nim b/lib/pure/asyncftpclient.nim index fe4577ed90..b806f42352 100644 --- a/lib/pure/asyncftpclient.nim +++ b/lib/pure/asyncftpclient.nim @@ -6,23 +6,74 @@ # distribution, for details about the copyright. # -## This module implement an asynchronous FTP client. +## This module implements an asynchronous FTP client. It allows you to connect +## to an FTP server and perform operations on it such as for example: ## -## Examples -## -------- +## * The upload of new files. +## * The removal of existing files. +## * Download of files. +## * Changing of files' permissions. +## * Navigation through the FTP server's directories. ## -## .. code-block::nim +## Connecting to an FTP server +## ------------------------ ## -## var ftp = newAsyncFtpClient("example.com", user = "test", pass = "test") -## proc main(ftp: AsyncFtpClient) {.async.} = +## In order to begin any sort of transfer of files you must first +## connect to an FTP server. You can do so with the ``connect`` procedure. +## +## .. code-block::nim +## import asyncdispatch, asyncftpclient +## proc main() {.async.} = +## var ftp = newAsyncFtpClient("example.com", user = "test", pass = "test") ## await ftp.connect() -## echo await ftp.pwd() -## echo await ftp.listDirs() -## await ftp.store("payload.jpg", "payload.jpg") -## await ftp.retrFile("payload.jpg", "payload2.jpg") -## echo("Finished") +## echo("Connected") +## waitFor(main()) ## -## waitFor main(ftp) +## A new ``main`` async procedure must be declared to allow the use of the +## ``await`` keyword. The connection will complete asynchronously and the +## client will be connected after the ``await ftp.connect()`` call. +## +## Uploading a new file +## -------------------- +## +## After a connection is made you can use the ``store`` procedure to upload +## a new file to the FTP server. Make sure to check you are in the correct +## working directory before you do so with the ``pwd`` procedure, you can also +## instead specify an absolute path. +## +## .. code-block::nim +## import asyncdispatch, asyncftpclient +## proc main() {.async.} = +## var ftp = newAsyncFtpClient("example.com", user = "test", pass = "test") +## await ftp.connect() +## let currentDir = await ftp.pwd() +## assert currentDir == "/home/user/" +## await ftp.store("file.txt", "file.txt") +## echo("File finished uploading") +## waitFor(main()) +## +## Checking the progress of a file transfer +## ---------------------------------------- +## +## The progress of either a file upload or a file download can be checked +## by specifying a ``onProgressChanged`` procedure to the ``store`` or +## ``retrFile`` procedures. +## +## .. code-block::nim +## import asyncdispatch, asyncftpclient +## +## proc onProgressChanged(total, progress: BiggestInt, +## speed: float): Future[void] = +## echo("Uploaded ", progress, " of ", total, " bytes") +## echo("Current speed: ", speed, " kb/s") +## +## proc main() {.async.} = +## var ftp = newAsyncFtpClient("example.com", user = "test", pass = "test") +## await ftp.connect() +## await ftp.store("file.txt", "/home/user/file.txt", onProgressChanged) +## echo("File finished uploading") +## waitFor(main()) + import asyncdispatch, asyncnet, strutils, parseutils, os, times From dfa0c2cace8770ead60cf2771ed463e3ca54b089 Mon Sep 17 00:00:00 2001 From: Dominik Picheta Date: Thu, 17 Sep 2015 22:49:53 +0100 Subject: [PATCH 07/11] Change nimdoc body css color to #666. --- config/nimdoc.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/nimdoc.cfg b/config/nimdoc.cfg index 4773258cfc..23151b2755 100644 --- a/config/nimdoc.cfg +++ b/config/nimdoc.cfg @@ -145,7 +145,7 @@ body { font-weight: 400; font-size: 14px; line-height: 20px; - color: #2d2d2d; + color: #666; background-color: rgba(252, 248, 244, 0.75); } /* Skeleton grid */ From 0f933bbf55f590dbeb42ef74b7d294713840a7d6 Mon Sep 17 00:00:00 2001 From: Dominik Picheta Date: Thu, 17 Sep 2015 23:05:16 +0100 Subject: [PATCH 08/11] Deprecated ftpclient module. --- lib/pure/ftpclient.nim | 9 ++++++++- web/news.txt | 2 ++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/lib/pure/ftpclient.nim b/lib/pure/ftpclient.nim index 778ba6857f..229fe4b511 100644 --- a/lib/pure/ftpclient.nim +++ b/lib/pure/ftpclient.nim @@ -13,7 +13,12 @@ import sockets, strutils, parseutils, times, os, asyncio from asyncnet import nil from rawsockets import nil from asyncdispatch import PFuture - +## **Note**: This module is deprecated since version 0.11.3. +## You should use the async version of this module +## `asyncftpclient `_. +## +## ---- +## ## This module **partially** implements an FTP client as specified ## by `RFC 959 `_. ## @@ -36,6 +41,8 @@ from asyncdispatch import PFuture ## **Warning:** The API of this module is unstable, and therefore is subject ## to change. +{.deprecated.} + type FtpBase*[SockType] = ref FtpBaseObj[SockType] FtpBaseObj*[SockType] = object diff --git a/web/news.txt b/web/news.txt index aaa27cfee1..c70824b87e 100644 --- a/web/news.txt +++ b/web/news.txt @@ -82,6 +82,8 @@ News result = $x & y echo f(0, "abc") + - The ``ftpclient`` module is now deprecated in favour of the + ``asyncdispatch`` module. Library Additions From 36f68e1650f5d9ebfe563b7411879dd46055ac69 Mon Sep 17 00:00:00 2001 From: Araq Date: Fri, 18 Sep 2015 01:37:34 +0200 Subject: [PATCH 09/11] fixes #3329 --- compiler/ccgutils.nim | 5 ++++- compiler/semgnrc.nim | 2 +- compiler/seminst.nim | 2 +- compiler/semstmts.nim | 26 +++++++++++++++++--------- compiler/semtypinst.nim | 23 +++++++++++++++++++---- compiler/sigmatch.nim | 2 +- tests/typerel/t2plus.nim | 22 ++++++++++++++++++++++ 7 files changed, 65 insertions(+), 17 deletions(-) create mode 100644 tests/typerel/t2plus.nim diff --git a/compiler/ccgutils.nim b/compiler/ccgutils.nim index 4ba6643ecf..6dfd7b52c3 100644 --- a/compiler/ccgutils.nim +++ b/compiler/ccgutils.nim @@ -99,7 +99,10 @@ proc getUniqueType*(key: PType): PType = gCanonicalTypes[k] = key result = key of tyTypeDesc, tyTypeClasses, tyGenericParam, tyFromExpr, tyFieldAccessor: - internalError("getUniqueType") + if key.sym != nil: + internalError(key.sym.info, "metatype not eliminated") + else: + internalError("metatype not eliminated") of tyDistinct: if key.deepCopy != nil: result = key else: result = getUniqueType(lastSon(key)) diff --git a/compiler/semgnrc.nim b/compiler/semgnrc.nim index 9c9281da01..48d725ea88 100644 --- a/compiler/semgnrc.nim +++ b/compiler/semgnrc.nim @@ -234,7 +234,7 @@ proc semGenericStmt(c: PContext, n: PNode, discard of skProc, skMethod, skIterators, skConverter, skModule: result.sons[0] = symChoice(c, fn, s, scOption) - # do check of 's.magic==mRoof' here because it might be some + # do not check of 's.magic==mRoof' here because it might be some # other '^' but after overload resolution the proper one: if ctx.bracketExpr != nil and n.len == 2 and s.name.s == "^": result.add ctx.bracketExpr diff --git a/compiler/seminst.nim b/compiler/seminst.nim index 64e3e8cb85..1c1d71a2f6 100644 --- a/compiler/seminst.nim +++ b/compiler/seminst.nim @@ -164,7 +164,7 @@ proc instantiateProcType(c: PContext, pt: TIdTable, addDecl(c, prc) pushInfoContext(info) - var cl = initTypeVars(c, pt, info) + var cl = initTypeVars(c, pt, info, nil) var result = instCopyType(cl, prc.typ) let originalParams = result.n result.n = originalParams.shallowCopy diff --git a/compiler/semstmts.nim b/compiler/semstmts.nim index f67ee2822a..adb1c81c11 100644 --- a/compiler/semstmts.nim +++ b/compiler/semstmts.nim @@ -957,27 +957,35 @@ proc semDo(c: PContext, n: PNode, flags: TExprFlags): PNode = proc semInferredLambda(c: PContext, pt: TIdTable, n: PNode): PNode = var n = n - n = replaceTypesInBody(c, pt, n) + let original = n.sons[namePos].sym + let s = copySym(original, false) + incl(s.flags, sfFromGeneric) + + n = replaceTypesInBody(c, pt, n, original) result = n - + s.ast = result + n.sons[namePos].sym = s n.sons[genericParamsPos] = emptyNode - n.sons[paramsPos] = n.typ.n - + let params = n.typ.n + n.sons[paramsPos] = params + s.typ = n.typ + for i in 1.. U): U = + result = v + for x in lst: + result = f(x, result) + +proc mean[T: SomeNumber](xs: seq[T]): T = + xs.foldRight(0.T, (xBAZ: auto, yBAZ: auto) => xBAZ + yBAZ) / T(xs.len) + +when isMainModule: + let x = mean(@[1.float, 2, 3]) + echo x + From 1c0b81528224703f433ddc56e40aba59aec76081 Mon Sep 17 00:00:00 2001 From: Araq Date: Fri, 18 Sep 2015 01:50:28 +0200 Subject: [PATCH 10/11] fixes #3305; error message will improve with later improvements for concepts --- compiler/sigmatch.nim | 3 +++ 1 file changed, 3 insertions(+) diff --git a/compiler/sigmatch.nim b/compiler/sigmatch.nim index d28800d9af..642f50330e 100644 --- a/compiler/sigmatch.nim +++ b/compiler/sigmatch.nim @@ -511,6 +511,9 @@ proc typeRangeRel(f, a: PType): TTypeRelation {.noinline.} = proc matchUserTypeClass*(c: PContext, m: var TCandidate, ff, a: PType): TTypeRelation = var body = ff.skipTypes({tyUserTypeClassInst}) + if c.inTypeClass > 20: + localError(body.n[3].info, $body.n[3] & " too nested for type matching") + return isNone openScope(c) inc c.inTypeClass From a4a5003b7d1284fd751f686b54a55c98fe9c9651 Mon Sep 17 00:00:00 2001 From: Araq Date: Fri, 18 Sep 2015 02:22:39 +0200 Subject: [PATCH 11/11] fixes #3312 --- lib/pure/math.nim | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/lib/pure/math.nim b/lib/pure/math.nim index c1d5c94398..06a018d9f5 100644 --- a/lib/pure/math.nim +++ b/lib/pure/math.nim @@ -21,6 +21,20 @@ include "system/inclrtl" {.push debugger:off .} # the user does not want to trace a part # of the standard library! +proc binom*(n, k: int): int {.noSideEffect.} = + ## Computes the binomial coefficient + if k <= 0: return 1 + if 2*k > n: return binom(n, n-k) + result = n + for i in countup(2, k): + result = (result * (n + 1 - i)) div i + +proc fac*(n: int): int {.noSideEffect.} = + ## Computes the faculty/factorial function. + result = 1 + for i in countup(2, n): + result = result * i + {.push checks:off, line_dir:off, stack_trace:off.} when defined(Posix) and not defined(haiku): @@ -72,21 +86,6 @@ proc classify*(x: float): FloatClass = return fcNormal # XXX: fcSubnormal is not detected! - -proc binom*(n, k: int): int {.noSideEffect.} = - ## Computes the binomial coefficient - if k <= 0: return 1 - if 2*k > n: return binom(n, n-k) - result = n - for i in countup(2, k): - result = (result * (n + 1 - i)) div i - -proc fac*(n: int): int {.noSideEffect.} = - ## Computes the faculty/factorial function. - result = 1 - for i in countup(2, n): - result = result * i - proc isPowerOfTwo*(x: int): bool {.noSideEffect.} = ## Returns true, if `x` is a power of two, false otherwise. ## Zero and negative numbers are not a power of two.