summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--compiler/jsgen.nim20
-rw-r--r--compiler/lowerings.nim7
-rw-r--r--compiler/semfields.nim6
-rw-r--r--doc/manual/templates.txt2
-rw-r--r--doc/nimc.txt2
-rw-r--r--doc/tut1.txt59
-rw-r--r--doc/tut2.txt3
-rw-r--r--koch.nim8
-rw-r--r--lib/core/typeinfo.nim9
-rw-r--r--lib/pure/events.nim20
-rw-r--r--tests/fields/tfielditerator2.nim20
-rw-r--r--tests/stdlib/tmarshal.nim16
-rw-r--r--tools/nimweb.nim9
-rw-r--r--tools/website.tmpl42
-rw-r--r--web/assets/style.css16
-rw-r--r--web/community.txt12
-rw-r--r--web/learn.txt2
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">"&lt;stdio.h&gt;"</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>`_