diff options
-rw-r--r-- | compiler/jsgen.nim | 20 | ||||
-rw-r--r-- | compiler/lowerings.nim | 7 | ||||
-rw-r--r-- | compiler/semfields.nim | 6 | ||||
-rw-r--r-- | doc/manual/templates.txt | 2 | ||||
-rw-r--r-- | doc/nimc.txt | 2 | ||||
-rw-r--r-- | doc/tut1.txt | 59 | ||||
-rw-r--r-- | doc/tut2.txt | 3 | ||||
-rw-r--r-- | koch.nim | 8 | ||||
-rw-r--r-- | lib/core/typeinfo.nim | 9 | ||||
-rw-r--r-- | lib/pure/events.nim | 20 | ||||
-rw-r--r-- | tests/fields/tfielditerator2.nim | 20 | ||||
-rw-r--r-- | tests/stdlib/tmarshal.nim | 16 | ||||
-rw-r--r-- | tools/nimweb.nim | 9 | ||||
-rw-r--r-- | tools/website.tmpl | 42 | ||||
-rw-r--r-- | web/assets/style.css | 16 | ||||
-rw-r--r-- | web/community.txt | 12 | ||||
-rw-r--r-- | web/learn.txt | 2 |
17 files changed, 170 insertions, 83 deletions
diff --git a/compiler/jsgen.nim b/compiler/jsgen.nim index c9daba4d1..c838aa90b 100644 --- a/compiler/jsgen.nim +++ b/compiler/jsgen.nim @@ -33,7 +33,7 @@ import ast, astalgo, strutils, hashes, trees, platform, magicsys, extccomp, options, nversion, nimsets, msgs, crc, bitsets, idents, lists, types, os, times, ropes, math, passes, ccgutils, wordrecg, renderer, rodread, rodutils, - intsets, cgmeth + intsets, cgmeth, lowerings type TTarget = enum @@ -1211,13 +1211,17 @@ proc genVarInit(p: PProc, v: PSym, n: PNode) = proc genVarStmt(p: PProc, n: PNode) = for i in countup(0, sonsLen(n) - 1): var a = n.sons[i] - if a.kind == nkCommentStmt: continue - assert(a.kind == nkIdentDefs) - assert(a.sons[0].kind == nkSym) - var v = a.sons[0].sym - if lfNoDecl in v.loc.flags: continue - genLineDir(p, a) - genVarInit(p, v, a.sons[2]) + if a.kind != nkCommentStmt: + if a.kind == nkVarTuple: + let unpacked = lowerTupleUnpacking(a, p.prc) + genStmt(p, unpacked) + else: + assert(a.kind == nkIdentDefs) + assert(a.sons[0].kind == nkSym) + var v = a.sons[0].sym + if lfNoDecl notin v.loc.flags: + genLineDir(p, a) + genVarInit(p, v, a.sons[2]) proc genConstant(p: PProc, c: PSym) = if lfNoDecl notin c.loc.flags and not p.g.generatedSyms.containsOrIncl(c.id): diff --git a/compiler/lowerings.nim b/compiler/lowerings.nim index f9f7d6432..ef43c4d09 100644 --- a/compiler/lowerings.nim +++ b/compiler/lowerings.nim @@ -51,13 +51,14 @@ proc lowerTupleUnpacking*(n: PNode; owner: PSym): PNode = incl(temp.flags, sfFromGeneric) var v = newNodeI(nkVarSection, value.info) - v.addVar(newSymNode(temp)) + let tempAsNode = newSymNode(temp) + v.addVar(tempAsNode) result.add(v) - result.add newAsgnStmt(newSymNode(temp), value) + result.add newAsgnStmt(tempAsNode, value) for i in 0 .. n.len-3: if n.sons[i].kind == nkSym: v.addVar(n.sons[i]) - result.add newAsgnStmt(n.sons[i], newTupleAccess(value, i)) + result.add newAsgnStmt(n.sons[i], newTupleAccess(tempAsNode, i)) proc createObj*(owner: PSym, info: TLineInfo): PType = result = newType(tyObject, owner) diff --git a/compiler/semfields.nim b/compiler/semfields.nim index 70dead8ab..a6ade64d5 100644 --- a/compiler/semfields.nim +++ b/compiler/semfields.nim @@ -147,7 +147,11 @@ proc semForFields(c: PContext, n: PNode, m: TMagic): PNode = var fc: TFieldsCtx fc.m = m fc.c = c - semForObjectFields(fc, tupleTypeA.n, n, stmts) + var t = tupleTypeA + while t.kind == tyObject: + semForObjectFields(fc, t.n, n, stmts) + if t.sons[0] == nil: break + t = skipTypes(t.sons[0], abstractPtrs) dec(c.p.nestedLoopCounter) # for TR macros this 'while true: ...; break' loop is pretty bad, so # we avoid it now if we can: diff --git a/doc/manual/templates.txt b/doc/manual/templates.txt index d90c2203e..64bf71a96 100644 --- a/doc/manual/templates.txt +++ b/doc/manual/templates.txt @@ -250,7 +250,7 @@ Another common example is this: yield "Hello" yield "World" - var info = something().toSeq() + var info = toSeq(something()) The problem here is that the compiler already decided that ``something()`` as an iterator is not callable in this context before ``toSeq`` gets its diff --git a/doc/nimc.txt b/doc/nimc.txt index 64ed6ce06..1f2675df8 100644 --- a/doc/nimc.txt +++ b/doc/nimc.txt @@ -42,7 +42,7 @@ List of warnings ---------------- Each warning can be activated individually with ``--warning[NAME]:on|off`` or -in a ``push`` pragma. +in a ``push`` pragma. ========================== ============================================ Name Description diff --git a/doc/tut1.txt b/doc/tut1.txt index 3b2e92c30..9d75b1ea2 100644 --- a/doc/tut1.txt +++ b/doc/tut1.txt @@ -1026,17 +1026,16 @@ at runtime by 0, the second by 1 and so on. Example: .. code-block:: nim type - TDirection = enum + Direction = enum north, east, south, west - var x = south # `x` is of type `TDirection`; its value is `south` + var x = south # `x` is of type `Direction`; its value is `south` echo($x) # writes "south" to `stdout` -(To prefix a new type with the letter ``T`` is a convention in Nim.) All comparison operators can be used with enumeration types. An enumeration's symbol can be qualified to avoid ambiguities: -``TDirection.south``. +``Direction.south``. The ``$`` operator can convert any enumeration value to its name, the ``ord`` proc to its underlying integer value. @@ -1050,7 +1049,7 @@ An explicit ordered enum can have *holes*: .. code-block:: nim type - TMyEnum = enum + MyEnum = enum a = 2, b = 4, c = 89 @@ -1088,11 +1087,11 @@ A subrange type is a range of values from an integer or enumeration type .. code-block:: nim type - TSubrange = range[0..5] + Subrange = range[0..5] -``TSubrange`` is a subrange of ``int`` which can only hold the values 0 -to 5. Assigning any other value to a variable of type ``TSubrange`` is a +``Subrange`` is a subrange of ``int`` which can only hold the values 0 +to 5. Assigning any other value to a variable of type ``Subrange`` is a compile-time or runtime error. Assignments from the base type to one of its subrange types (and vice versa) are allowed. @@ -1119,9 +1118,9 @@ Arrays can be constructed via ``[]``: .. code-block:: nim type - TIntArray = array[0..5, int] # an array that is indexed with 0..5 + IntArray = array[0..5, int] # an array that is indexed with 0..5 var - x: TIntArray + x: IntArray x = [1, 2, 3, 4, 5, 6] for i in low(x)..high(x): echo(x[i]) @@ -1140,13 +1139,13 @@ array `a` and `high(a) <system.html#high>`_ the highest valid index. .. code-block:: nim type - TDirection = enum + Direction = enum north, east, south, west - TBlinkLights = enum + BlinkLights = enum off, on, slowBlink, mediumBlink, fastBlink - TLevelSetting = array[north..west, TBlinkLights] + LevelSetting = array[north..west, BlinkLights] var - level : TLevelSetting + level: LevelSetting level[north] = on level[south] = slowBlink level[east] = fastBlink @@ -1165,9 +1164,9 @@ subdivided in height levels accessed through their integer index: .. code-block:: nim type - TLightTower = array[1..10, TLevelSetting] + LightTower = array[1..10, LevelSetting] var - tower: TLightTower + tower: LightTower tower[1][north] = slowBlink tower[1][east] = mediumBlink echo len(tower) # --> 10 @@ -1178,24 +1177,24 @@ subdivided in height levels accessed through their integer index: #tower[0][1] = on Note how the built-in ``len`` proc returns only the array's first dimension -length. Another way of defining the ``TLightTower`` to show better its -nested nature would be to omit the previous definition of the ``TLevelSetting`` +length. Another way of defining the ``LightTower`` to show better its +nested nature would be to omit the previous definition of the ``LevelSetting`` type and instead write it embedded directly as the type of the first dimension: .. code-block:: nim type - TLightTower = array[1..10, array[north..west, TBlinkLights]] + LightTower = array[1..10, array[north..west, BlinkLights]] It is quite frequent to have arrays start at zero, so there's a shortcut syntax to specify a range from zero to the specified index minus one: .. code-block:: nim type - TIntArray = array[0..5, int] # an array that is indexed with 0..5 - TQuickArray = array[6, int] # an array that is indexed with 0..5 + IntArray = array[0..5, int] # an array that is indexed with 0..5 + QuickArray = array[6, int] # an array that is indexed with 0..5 var - x: TIntArray - y: TQuickArray + x: IntArray + y: QuickArray x = [1, 2, 3, 4, 5, 6] y = x for i in low(x)..high(x): @@ -1449,16 +1448,16 @@ operators perform implicit dereferencing operations for reference types: .. code-block:: nim type - PNode = ref TNode - TNode = tuple[le, ri: PNode, data: int] + Node = ref NodeObj + NodeObj = object + le, ri: PNode + data: int var - n: PNode + n: Node new(n) n.data = 9 # no need to write n[].data; in fact n[].data is highly discouraged! -(As a convention, reference types use a 'P' prefix.) - To allocate a new traced object, the built-in procedure ``new`` has to be used. To deal with untraced memory, the procedures ``alloc``, ``dealloc`` and ``realloc`` can be used. The documentation of the `system <system.html>`_ @@ -1586,11 +1585,11 @@ rules apply: .. code-block:: nim # Module A - proc x*(a: int): string = result = $a + proc x*(a: int): string = $a .. code-block:: nim # Module B - proc x*(a: string): string = result = $a + proc x*(a: string): string = $a .. code-block:: nim # Module C diff --git a/doc/tut2.txt b/doc/tut2.txt index d8f9071a9..6e239d681 100644 --- a/doc/tut2.txt +++ b/doc/tut2.txt @@ -11,8 +11,7 @@ Nim Tutorial (Part II) Introduction ============ - "Object-oriented programming is an exceptionally bad idea which could - only have originated in California." --Edsger Dijkstra + "Repetition renders the ridiculous reasonable." -- Norman Wildberger This document is a tutorial for the advanced constructs of the *Nim* diff --git a/koch.nim b/koch.nim index 2de93bdea..2c7d49cf1 100644 --- a/koch.nim +++ b/koch.nim @@ -42,7 +42,8 @@ Possible Commands: boot [options] bootstraps with given command line options install [bindir] installs to given directory clean cleans Nimrod project; removes generated files - web [options] generates the website + web [options] generates the website and the full documentation + website [options] generates only the website csource [options] builds the C sources for installation zip builds the installation ZIP package nsis [options] builds the NSIS Setup installer (for Windows) @@ -124,6 +125,10 @@ proc web(args: string) = exec("$# cc -r tools/nimweb.nim $# web/nim --putenv:nimversion=$#" % [findNim(), args, VersionAsString]) +proc website(args: string) = + exec("$# cc -r tools/nimweb.nim $# --website web/nim --putenv:nimversion=$#" % + [findNim(), args, VersionAsString]) + # -------------- boot --------------------------------------------------------- const @@ -345,6 +350,7 @@ of cmdArgument: of "boot": boot(op.cmdLineRest) of "clean": clean(op.cmdLineRest) of "web": web(op.cmdLineRest) + of "website": website(op.cmdLineRest) of "csource", "csources": csource(op.cmdLineRest) of "zip": zip(op.cmdLineRest) of "nsis": nsis(op.cmdLineRest) diff --git a/lib/core/typeinfo.nim b/lib/core/typeinfo.nim index 1b9b95c24..0046924a1 100644 --- a/lib/core/typeinfo.nim +++ b/lib/core/typeinfo.nim @@ -269,9 +269,14 @@ iterator fields*(x: TAny): tuple[name: string, any: TAny] = # XXX BUG: does not work yet, however is questionable anyway when false: if x.rawType.kind == tyObject: t = cast[ptr PNimType](x.value)[] - var n = t.node var ret: seq[tuple[name: cstring, any: TAny]] = @[] - fieldsAux(p, n, ret) + if t.kind == tyObject: + while true: + fieldsAux(p, t.node, ret) + t = t.base + if t.isNil: break + else: + fieldsAux(p, t.node, ret) for name, any in items(ret): yield ($name, any) diff --git a/lib/pure/events.nim b/lib/pure/events.nim index 47dc6ba3f..77faa6a66 100644 --- a/lib/pure/events.nim +++ b/lib/pure/events.nim @@ -51,20 +51,20 @@ proc initEventHandler*(name: string): EventHandler = result.handlers = @[] result.name = name -proc addHandler*(handler: var EventHandler, func: proc(e: EventArgs) {.closure.}) = +proc addHandler*(handler: var EventHandler, fn: proc(e: EventArgs) {.closure.}) = ## Adds the callback to the specified event handler. - handler.handlers.add(func) + handler.handlers.add(fn) -proc removeHandler*(handler: var EventHandler, func: proc(e: EventArgs) {.closure.}) = +proc removeHandler*(handler: var EventHandler, fn: proc(e: EventArgs) {.closure.}) = ## Removes the callback from the specified event handler. for i in countup(0, len(handler.handlers) -1): - if func == handler.handlers[i]: + if fn == handler.handlers[i]: handler.handlers.del(i) break -proc containsHandler*(handler: var EventHandler, func: proc(e: EventArgs) {.closure.}): bool = +proc containsHandler*(handler: var EventHandler, fn: proc(e: EventArgs) {.closure.}): bool = ## Checks if a callback is registered to this event handler. - return handler.handlers.contains(func) + return handler.handlers.contains(fn) proc clearHandlers*(handler: var EventHandler) = @@ -76,21 +76,21 @@ proc getEventHandler(emitter: var EventEmitter, event: string): int = if emitter.s[k].name == event: return k return -1 -proc on*(emitter: var EventEmitter, event: string, func: proc(e: EventArgs) {.closure.}) = +proc on*(emitter: var EventEmitter, event: string, fn: proc(e: EventArgs) {.closure.}) = ## Assigns a event handler with the specified callback. If the event ## doesn't exist, it will be created. var i = getEventHandler(emitter, event) if i < 0: var eh = initEventHandler(event) - addHandler(eh, func) + addHandler(eh, fn) emitter.s.add(eh) else: - addHandler(emitter.s[i], func) + addHandler(emitter.s[i], fn) proc emit*(emitter: var EventEmitter, eventhandler: var EventHandler, args: EventArgs) = ## Fires an event handler with specified event arguments. - for func in items(eventhandler.handlers): func(args) + for fn in items(eventhandler.handlers): fn(args) proc emit*(emitter: var EventEmitter, event: string, args: EventArgs) = ## Fires an event handler with specified event arguments. diff --git a/tests/fields/tfielditerator2.nim b/tests/fields/tfielditerator2.nim index 76fa568f2..70ab9e2ab 100644 --- a/tests/fields/tfielditerator2.nim +++ b/tests/fields/tfielditerator2.nim @@ -5,16 +5,19 @@ a char: false an int: 5 an int: 6 a string: abc -false -true -true -false -true +a string: I'm root! +CMP false +CMP true +CMP true +CMP false +CMP true +CMP true a: a b: b x: 5 y: 6 z: abc +thaRootMan: I'm root! myDisc: enC c: Z enC @@ -23,7 +26,9 @@ Z """ type - TMyObj = object + SomeRootObj = object of RootObj + thaRootMan: string + TMyObj = object of SomeRootObj a, b: char x, y: int z: string @@ -41,6 +46,7 @@ proc p(x: string) = echo "a string: ", x proc myobj(a, b: char, x, y: int, z: string): TMyObj = result.a = a; result.b = b; result.x = x; result.y = y; result.z = z + result.thaRootMan = "I'm root!" var x = myobj('a', 'b', 5, 6, "abc") var y = myobj('A', 'b', 5, 9, "abc") @@ -49,7 +55,7 @@ for f in fields(x): p f for a, b in fields(x, y): - echo a == b + echo "CMP ", a == b for key, val in fieldPairs(x): echo key, ": ", val diff --git a/tests/stdlib/tmarshal.nim b/tests/stdlib/tmarshal.nim index 5471d347a..1b83aab53 100644 --- a/tests/stdlib/tmarshal.nim +++ b/tests/stdlib/tmarshal.nim @@ -1,10 +1,10 @@ discard """ - output: "" + output: '''{"age": 12, "name": "Cletus"}''' """ import marshal -template testit(x: expr) = echo($$to[type(x)]($$x)) +template testit(x: expr) = discard $$to[type(x)]($$x) var x: array[0..4, array[0..4, string]] = [ ["test", "1", "2", "3", "4"], ["test", "1", "2", "3", "4"], @@ -63,3 +63,15 @@ testit(test7) var test6: set[char] = {'A'..'Z', '_'} testit(test6) + +# bug #1352 + +type + Entity = object of RootObj + name: string + + Person = object of Entity + age: int + +var instance1 = Person(name: "Cletus", age: 12) +echo($$instance1) diff --git a/tools/nimweb.nim b/tools/nimweb.nim index 23d1ef4d9..c4dc8226d 100644 --- a/tools/nimweb.nim +++ b/tools/nimweb.nim @@ -25,6 +25,8 @@ type TRssItem = object year, month, day, title: string +var onlyWebsite: bool + proc initConfigData(c: var TConfigData) = c.tabs = @[] c.links = @[] @@ -67,6 +69,7 @@ Options: --var:name=value set the value of a variable -h, --help shows this help -v, --version shows the version + --website only build the website, not the full documentation Compile_options: will be passed to the Nim compiler """ @@ -134,6 +137,8 @@ proc parseCmdLine(c: var TConfigData) = var idx = val.find('=') if idx < 0: quit("invalid command line") c.vars[substr(val, 0, idx-1)] = substr(val, idx+1) + of "website": + onlyWebsite = true else: quit(usage) of cmdEnd: break if c.infile.len == 0: quit(usage) @@ -435,8 +440,8 @@ var c: TConfigData initConfigData(c) parseCmdLine(c) parseIniFile(c) -when false: - #buildPdfDoc(c, "doc") +if onlyWebsite: buildWebsite(c) + #buildPdfDoc(c, "doc") else: main(c) diff --git a/tools/website.tmpl b/tools/website.tmpl index b16373c4f..6f7a216a5 100644 --- a/tools/website.tmpl +++ b/tools/website.tmpl @@ -52,7 +52,7 @@ <!-- slides --> <div id="slide0" class=""> <div> - <h2>nim looks like this..</h2> + <h2>Nim looks like this..</h2> <pre><span class="cmt"># compute average line length</span> <span class="kwd">var</span> <span class="tab"> </span>sum = <span class="val">0</span> @@ -81,17 +81,17 @@ echo(<span class="val">"Average line length: "</span>, p.greet() <span class="cmt"># or greet(p)</span> </pre> </div> - </div> <!-- slide0 --> - <div id="slide1" class="active"> + </div> <!-- slide0 --> + <div id="slide1" class="active"> <h2><a name="why-should-i-be-excited">Why should I be excited?</a></h2> <span class="desc"> - Nim the only language that leverages automated proof technology + Nim is the only language that leverages automated proof technology to perform a <i>disjoint check</i> for your parallel code. Working on disjoint data means no locking is required and yet data races are impossible:</span> <pre> <span class="kwd">parallel</span>: -<span class="tab"> </span><span class="kwd">var</span> i = 0 +<span class="tab"> </span><span class="kwd">var</span> i = <span class="val">0</span> <span class="tab"> </span><span class="kwd">while</span> i <= a.high: <span class="tab"> </span>spawn f(a[i]) <span class="tab"> </span>spawn f(a[i+<span class="val">1</span>]) @@ -100,10 +100,40 @@ p.greet() <span class="cmt"># or greet(p)</span> <span class="tab end"> </span>i += <span class="val">1</span> </pre> </div> + <div id="slide2" class=""> + <div> + <h2>interfacing with C..</h2> + <pre> +<span class="kwd">proc</span> <span class="def">unsafeScanf</span>(f: <span class="typ">File</span>; s: <span class="typ">cstring</span>) +<span class="tab"> </span>{.importc: <span class="val">"fscanf"</span>, +<span class="tab end"> </span>header: <span class="val">"<stdio.h>"</span>, varargs.} + +<span class="kwd">var</span> x: cint +unsafeScanf(stdin, <span class="val">"%d"</span>, <span class="kwd">addr</span> x) + </pre></div> + + <div> + <h2>..and DSLs made easy</h2> +<pre> +<span class="kwd">import</span> jester, asyncdispatch, htmlgen + +routes: +<span class="tab"> </span>get <span class="val">"/"</span>: +<span class="tab end"> </span>resp h1(<span class="val">"Hello world"</span>) + +runForever() +</pre><p><span class="desc"> +Compile and run with:<br /> +nim c -r example.nim<br /> +View at: localhost:5000 +</span></p> + </div> + </div> </div> <div id="slideshow-nav"> <div id="slideControl0" onclick="slideshow_click(0)"></div> <div id="slideControl1" onclick="slideshow_click(1)" class="active"></div> + <div id="slideControl2" onclick="slideshow_click(2)"></div> </div> # end <aside id="sidebar"> @@ -174,7 +204,7 @@ var timer; var prevIndex = 0; function setSlideShow(index, short) { - if (index > 1) index = 0; + if (index > 2) index = 0; for (var i = 0; i < 10; ++i) { var x = document.getElementById("slide"+i); if (!x) break; diff --git a/web/assets/style.css b/web/assets/style.css index 448c3a05b..033d7dcdd 100644 --- a/web/assets/style.css +++ b/web/assets/style.css @@ -134,6 +134,22 @@ pre .end { background:url("images/tabEnd.png") no-repeat left bottom; } border-left:8px solid rgba(0,0,0,.3); box-shadow:1px 2px 16px rgba(28,180,236,.4); } + + #slide2 { margin:30px 0 0 10px; } + #slide2 > div { float:left; width:320px; font:10pt monospace; } + #slide2 > div:first-child { margin:0 40px 0 0; } + #slide2 h2 { margin:0 0 5px 0; color:rgba(162,198,223,.78); } + #slide2 > div > pre { + margin:0; + padding:15px 10px; + line-height:14pt; + background:rgba(0,0,0,.4); + border-left:8px solid rgba(0,0,0,.3); + box-shadow:1px 2px 16px rgba(28,180,236,.4); } + + #slide2 .desc { margin:0 0 5px 0; color:rgba(162,198,223,.78); + font:13pt "arial"; } + /* back when slide1 was the quote: #slide1 { margin-top:50px; } #slide1 > p { diff --git a/web/community.txt b/web/community.txt index aad281a44..fc496ca82 100644 --- a/web/community.txt +++ b/web/community.txt @@ -18,7 +18,7 @@ Nim's Community ---- Many Nim developers are a part of the - `#nim IRC channel <http://webchat.freenode.net/?channels=nimrod>`_ on + `#nim IRC channel <http://webchat.freenode.net/?channels=nim>`_ on Freenode. That is the place where the rest of the discussion relating to Nim occurs. Be sure to join us there if you wish to discuss Nim in real-time. IRC is the perfect place for people just starting to learn Nim and we @@ -34,13 +34,13 @@ Nim's Community Github ------ - Nim's `source code <http://github.com/Araq/Nim>`_ is hosted on Github. - Together with the `wiki <http://github.com/Araq/Nim/wiki>`_ and - `issue tracker <http://github.com/Araq/Nim/issues>`_. + Nim's `source code <http://github.com/Araq/Nimrod>`_ is hosted on Github. + Together with the `wiki <http://github.com/Araq/Nimrod/wiki>`_ and + `issue tracker <http://github.com/Araq/Nimrod/issues>`_. Github also hosts other projects relating to Nim. These projects are a part of the `nim-lang organisation <http://github.com/nim-lang>`_. - This includes the `Babel package manager <http://github.com/nim-lang/babel>`_ + This includes the `Nimble package manager <https://github.com/nim-lang/nimble>`_ and its `package repository <http://github.com/nim-lang/packages>`_. @@ -98,7 +98,7 @@ Nim's Community <iframe style="border: 0; margin: 0; padding: 0;" src="https://www.gittip.com/Araq/widget.html" - width="48pt" height="22pt"></iframe> + width="64pt" height="22pt"></iframe> Paypal .. raw:: html diff --git a/web/learn.txt b/web/learn.txt index f0e5e57fa..25db150a4 100644 --- a/web/learn.txt +++ b/web/learn.txt @@ -18,7 +18,7 @@ Learning Nim Examples -------- - - | `Nim by Example <http://nimrod-by-example.github.io/>`_ + - | `Nim by Example <http://nim-by-example.github.io/>`_ | Nim by Example is an excellent starting place for beginners. - | `Nim on Rosetta Code <http://rosettacode.org/wiki/Category:Nimrod>`_ |