diff options
author | awr <41453959+awr1@users.noreply.github.com> | 2018-08-29 13:49:45 -0500 |
---|---|---|
committer | awr <41453959+awr1@users.noreply.github.com> | 2018-08-29 13:49:45 -0500 |
commit | 8062698e7f6c28debb7e938e472ac64632e6a1ff (patch) | |
tree | 8cbfdb83ec9146080cbb939ba6cb6a66c9c49201 /doc | |
parent | 1d93991929e7691fdd7218a0d9638d420a0f2492 (diff) | |
download | Nim-8062698e7f6c28debb7e938e472ac64632e6a1ff.tar.gz |
[Docs] Added {.reorder.} to manual
Diffstat (limited to 'doc')
-rw-r--r-- | doc/manual.rst | 117 |
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 ------------- |