diff options
-rwxr-xr-x | compiler/rst.nim | 8 | ||||
-rwxr-xr-x | compiler/semexprs.nim | 30 | ||||
-rwxr-xr-x | doc/lib.txt | 2 | ||||
-rw-r--r-- | tests/compile/tbindoverload.nim | 12 | ||||
-rwxr-xr-x | web/community.txt | 2 | ||||
-rwxr-xr-x | web/index.txt | 23 |
6 files changed, 51 insertions, 26 deletions
diff --git a/compiler/rst.nim b/compiler/rst.nim index d9e4e7ec9..5cb9c3b6a 100755 --- a/compiler/rst.nim +++ b/compiler/rst.nim @@ -118,6 +118,8 @@ const ":shock:": "icon_eek", ":?": "icon_e_confused", ":-?": "icon_e_confused", + ":-/": "icon_e_confused", + "8-)": "icon_cool", ":lol:": "icon_lol", @@ -429,9 +431,11 @@ proc setSub(p: var TRstParser, key: string, value: PRstNode) = proc setRef(p: var TRstParser, key: string, value: PRstNode) = var length = len(p.s.refs) for i in countup(0, length - 1): - if key == p.s.refs[i].key: + if key == p.s.refs[i].key: + if p.s.refs[i].value.addNodes != value.addNodes: + rstMessage(p, warnRedefinitionOfLabel, key) + p.s.refs[i].value = value - rstMessage(p, warnRedefinitionOfLabel, key) return setlen(p.s.refs, length + 1) p.s.refs[length].key = key diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim index d2a19cb86..4e9afd585 100755 --- a/compiler/semexprs.nim +++ b/compiler/semexprs.nim @@ -749,11 +749,14 @@ proc makeDeref(n: PNode): PNode = proc builtinFieldAccess(c: PContext, n: PNode, flags: TExprFlags): PNode = ## returns nil if it's not a built-in field access + checkSonsLen(n, 2) + # early exit for this; see tests/compile/tbindoverload.nim: + if n.sons[1].kind == nkSymChoice: return + var s = qualifiedLookup(c, n, {checkAmbiguity, checkUndeclared}) if s != nil: return semSym(c, n, s, flags) - checkSonsLen(n, 2) n.sons[0] = semExprWithType(c, n.sons[0], flags) restoreOldStyleType(n.sons[0]) var i = considerAcc(n.sons[1]) @@ -830,18 +833,23 @@ proc semFieldAccess(c: PContext, n: PNode, flags: TExprFlags): PNode = # in Nimrod. We first allow types in the semantic checking. result = builtinFieldAccess(c, n, flags) if result == nil: - var i = considerAcc(n.sons[1]) - var f = SymTabGet(c.tab, i) - # if f != nil and f.kind == skStub: loadStub(f) - # ``loadStub`` is not correct here as we don't care for ``f`` really - if f != nil: - # BUGFIX: do not check for (f.kind in [skProc, skMethod, skIterator]) here - # This special node kind is to merge with the call handler in `semExpr`. + if n.sons[1].kind == nkSymChoice: result = newNodeI(nkDotCall, n.info) - addSon(result, newIdentNode(i, n.info)) + addSon(result, n.sons[1]) addSon(result, copyTree(n[0])) - else: - GlobalError(n.Info, errUndeclaredFieldX, i.s) + else: + var i = considerAcc(n.sons[1]) + var f = SymTabGet(c.tab, i) + # if f != nil and f.kind == skStub: loadStub(f) + # ``loadStub`` is not correct here as we don't care for ``f`` really + if f != nil: + # BUGFIX: do not check for (f.kind in [skProc, skMethod, skIterator]) here + # This special node kind is to merge with the call handler in `semExpr`. + result = newNodeI(nkDotCall, n.info) + addSon(result, newIdentNode(i, n.info)) + addSon(result, copyTree(n[0])) + else: + GlobalError(n.Info, errUndeclaredFieldX, i.s) proc buildOverloadedSubscripts(n: PNode, ident: PIdent): PNode = result = newNodeI(nkCall, n.info) diff --git a/doc/lib.txt b/doc/lib.txt index 3f2e3e0c3..37c66a3b7 100755 --- a/doc/lib.txt +++ b/doc/lib.txt @@ -608,4 +608,4 @@ Scientific computing -------------------- * `libsvm <libsvm.html>`_ - Low level wrapper for `libsvm <http://www.csie.ntu.edu.tw/~cjlin/libsvm/>`_. + Low level wrapper for `lib svm <http://www.csie.ntu.edu.tw/~cjlin/libsvm/>`_. diff --git a/tests/compile/tbindoverload.nim b/tests/compile/tbindoverload.nim new file mode 100644 index 000000000..6f5bb339e --- /dev/null +++ b/tests/compile/tbindoverload.nim @@ -0,0 +1,12 @@ +import strtabs + +template t*() = + block: + bind newStringTable + discard {"Content-Type": "text/html"}.newStringTable() + + discard {:}.newStringTable + +#discard {"Content-Type": "text/html"}.newStringTable() + +t() diff --git a/web/community.txt b/web/community.txt index 7881cd5dc..99338d084 100755 --- a/web/community.txt +++ b/web/community.txt @@ -1,4 +1,4 @@ -Discuss Nimrod in our `forum <http://force7.de/heimdall>`_. +Discuss Nimrod in our `forum <http://forum.nimrod-code.org/>`_. Visit our project page at GitHub: http://github.com/Araq/Nimrod. diff --git a/web/index.txt b/web/index.txt index e9172c155..def04048e 100755 --- a/web/index.txt +++ b/web/index.txt @@ -14,16 +14,6 @@ power with Python's readability and C's performance.** Welcome to Nimrod ----------------- -.. container:: snippet - *Nimrod looks like this:* - - .. code-block:: nimrod - import strutils - - echo "List of ints (separate by whitespace): " - echo stdin.readLine.split.each(parseInt).max, - " is the maximum" - **Nimrod** is a new statically typed, imperative programming language, that supports procedural, object oriented, functional and generic programming styles while remaining simple and efficient. @@ -37,6 +27,17 @@ focuses on the 3E: efficiency, expressiveness, elegance (in the order of priority). +.. container:: snippet + *Nimrod looks like this:* + + .. code-block:: nimrod + import strutils + + echo "Type in a list of ints of ints (separate by whitespace): " + let tokens = stdin.readLine.split + echo tokens.each(parseInt).max, " is the maximum." + + Nimrod is efficient =================== @@ -67,7 +68,7 @@ Nimrod is expressive * Modern type system with local type inference, tuples, variants, generics, etc. * User-defineable operators; code with new operators is often easier to read - than code which overloads built-in operators. In the code snippet, the + than code which overloads built-in operators. For example, a ``=~`` operator is defined in the ``re`` module. * Macros can modify the abstract syntax tree at compile time. |