summary refs log tree commit diff stats
path: root/doc
diff options
context:
space:
mode:
authorawr <41453959+awr1@users.noreply.github.com>2018-08-29 13:49:45 -0500
committerawr <41453959+awr1@users.noreply.github.com>2018-08-29 13:49:45 -0500
commit8062698e7f6c28debb7e938e472ac64632e6a1ff (patch)
tree8cbfdb83ec9146080cbb939ba6cb6a66c9c49201 /doc
parent1d93991929e7691fdd7218a0d9638d420a0f2492 (diff)
downloadNim-8062698e7f6c28debb7e938e472ac64632e6a1ff.tar.gz
[Docs] Added {.reorder.} to manual
Diffstat (limited to 'doc')
-rw-r--r--doc/manual.rst117
1 files changed, 77 insertions, 40 deletions
diff --git a/doc/manual.rst b/doc/manual.rst
index bb2650799..26ff071d7 100644
--- a/doc/manual.rst
+++ b/doc/manual.rst
@@ -6823,54 +6823,91 @@ the created global variables within a module is not defined, but all of them
 will be initialized after any top-level variables in their originating module
 and before any variable in a module that imports it.
 
+reorder pragma
+--------------
+**Note**: Code reordering is experimental. By default it is turned off.
+
+The ``reorder`` pragma can be used to turn on and off a special compilation mode
+that aims to be able to implicitly rearrange procedure, template, and macro
+definitions along with variable declarations and initializations at the top
+level scope so that, to a large extent, a programmer should not have to worry
+about ordering definitions correctly or be forced to use forward declarations to
+preface definitions inside a module.
 
 ..
-  NoForward pragma
-  ----------------
-  The ``noforward`` pragma can be used to turn on and off a special compilation
-  mode that to large extent eliminates the need for forward declarations. In this
-  mode, the proc definitions may appear out of order and the compiler will postpone
-  their semantic analysis and compilation until it actually needs to generate code
-  using the definitions. In this regard, this mode is similar to the modus operandi
-  of dynamic scripting languages, where the function calls are not resolved until
-  the code is executed. Here is the detailed algorithm taken by the compiler:
-
-  1. When a callable symbol is first encountered, the compiler will only note the
-  symbol callable name and it will add it to the appropriate overload set in the
-  current scope. At this step, it won't try to resolve any of the type expressions
-  used in the signature of the symbol (so they can refer to other not yet defined
-  symbols).
-
-  2. When a top level call is encountered (usually at the very end of the module),
-  the compiler will try to determine the actual types of all of the symbols in the
-  matching overload set. This is a potentially recursive process as the signatures
-  of the symbols may include other call expressions, whose types will be resolved
-  at this point too.
-
-  3. Finally, after the best overload is picked, the compiler will start
-  compiling the body of the respective symbol. This in turn will lead the
-  compiler to discover more call expressions that need to be resolved and steps
-  2 and 3 will be repeated as necessary.
-
-  Please note that if a callable symbol is never used in this scenario, its body
-  will never be compiled. This is the default behavior leading to best compilation
-  times, but if exhaustive compilation of all definitions is required, using
-  ``nim check`` provides this option as well.
-
-  Example:
+   NOTE: The following was documentation for the precursor to {.reorder.},
+   which was {.noForward.}.
+   
+   In this mode, procedure definitions may appear out of order and the compiler
+   will postpone their semantic analysis and compilation until it actually needs
+   to generate code using the definitions. In this regard, this mode is similar
+   to the modus operandi of dynamic scripting languages, where the function
+   calls are not resolved until the code is executed. Here is the detailed
+   algorithm taken by the compiler:
+
+   1. When a callable symbol is first encountered, the compiler will only note
+   the symbol callable name and it will add it to the appropriate overload set
+   in the current scope. At this step, it won't try to resolve any of the type
+   expressions used in the signature of the symbol (so they can refer to other
+   not yet defined symbols).
+
+   2. When a top level call is encountered (usually at the very end of the
+   module), the compiler will try to determine the actual types of all of the
+   symbols in the matching overload set. This is a potentially recursive process
+   as the signatures of the symbols may include other call expressions, whose
+   types will be resolved at this point too.
+
+   3. Finally, after the best overload is picked, the compiler will start
+   compiling the body of the respective symbol. This in turn will lead the
+   compiler to discover more call expressions that need to be resolved and steps
+   2 and 3 will be repeated as necessary.
+
+   Please note that if a callable symbol is never used in this scenario, its
+   body will never be compiled. This is the default behavior leading to best
+   compilation times, but if exhaustive compilation of all definitions is
+   required, using ``nim check`` provides this option as well.
 
-  .. code-block:: nim
+Example:
+
+.. code-block:: nim
+
+  {.reorder: on.}
+
+  proc foo(x: int) =
+    bar(x)
 
-    {.noforward: on.}
+  proc bar(x: int) =
+    echo(x)
 
-    proc foo(x: int) =
-      bar x
+  foo(10)
 
-    proc bar(x: int) =
-      echo x
+Variables can also be reordered as well. Keep in mind, when we initialize (i.e.
+combined declaration and assignment in one statement) variables, that entire
+statement itself may be reordered. Be wary of what code you execute at the top
+level:
+
+.. code-block:: nim
+  {.reorder: on.}
+
+  proc a() =
+    echo(foo)
+
+  var foo = 5
+
+  a() # outputs: "5"
+
+It is important to note that reordering *only* works for symbols at top level
+scope. Therefore, the following will *fail to compile:*
+
+.. code-block:: nim
+  {.reorder: on.}
 
-    foo(10)
+  proc a() =
+    b()
+    proc b() =
+      echo("Hello!")
 
+  a()
 
 pragma pragma
 -------------