Make small text changes in the docs (#16634)

* Fix broken links in docs

* Fix rand HSlice links

* Make small text changes in the docs

* Fix typo in contributing docs
This commit is contained in:
Elliot Waite
2021-01-25 05:59:19 -08:00
committed by GitHub
parent 20993047ce
commit 0436a7cffd
5 changed files with 124 additions and 120 deletions

View File

@@ -587,6 +587,6 @@ use `lib/std/collections/foo.nim`, not `lib/pure/collections/foo.nim`.
2. New module names should prefer plural form whenever possible, e.g.:
`std/sums.nim` instead of `std/sum.nim`. In particular, this reduces chances of conflicts
between module name and the symbols it defines. Furthermore, is should use `snake_case`
and not use capital letters, which cause issues when going from an OS without case
sensitivity to an OS without it.
between module name and the symbols it defines. Furthermore, module names should
use `snake_case` and not use capital letters, which cause issues when going
from an OS without case sensitivity to an OS with it.

View File

@@ -647,7 +647,7 @@ Precedence
Unary operators always bind stronger than any binary
operator: ``$a + b`` is ``($a) + b`` and not ``$(a + b)``.
If an unary operator's first character is ``@`` it is a `sigil-like`:idx:
If a unary operator's first character is ``@`` it is a `sigil-like`:idx:
operator which binds stronger than a ``primarySuffix``: ``@x.abc`` is parsed
as ``(@x).abc`` whereas ``$x.abc`` is parsed as ``$(x.abc)``.
@@ -900,8 +900,8 @@ Ordinal types
-------------
Ordinal types have the following characteristics:
- Ordinal types are countable and ordered. This property allows
the operation of functions as ``inc``, ``ord``, ``dec`` on ordinal types to
- Ordinal types are countable and ordered. This property allows the operation
of functions such as ``inc``, ``ord``, and ``dec`` on ordinal types to
be defined.
- Ordinal values have the smallest possible value. Trying to count further
down than the smallest value produces a panic or a static error.
@@ -977,7 +977,7 @@ operation meaning
kinds of integer types are used: the smaller type is converted to the larger.
A `narrowing type conversion`:idx: converts a larger to a smaller type (for
example ``int32 -> int16``. A `widening type conversion`:idx: converts a
example ``int32 -> int16``). A `widening type conversion`:idx: converts a
smaller type to a larger type (for example ``int16 -> int32``). In Nim only
widening type conversions are *implicit*:
@@ -1422,7 +1422,7 @@ allows this; it can only be used for parameters. Openarrays are always
indexed with an ``int`` starting at position 0. The ``len``, ``low``
and ``high`` operations are available for open arrays too. Any array with
a compatible base type can be passed to an openarray parameter, the index
type does not matter. In addition to arrays sequences can also be passed
type does not matter. In addition to arrays, sequences can also be passed
to an open array parameter.
The openarray type cannot be nested: multidimensional openarrays are not
@@ -1574,11 +1574,11 @@ can also be defined with indentation instead of ``[]``:
name: string # a person consists of a name
age: Natural # and an age
Objects provide many features that tuples do not. Object provide inheritance and
the ability to hide fields from other modules. Objects with inheritance enabled
have information about their type at runtime so that the ``of`` operator can be
used to determine the object's type. The ``of``
operator is similar to the ``instanceof`` operator in Java.
Objects provide many features that tuples do not. Objects provide inheritance
and the ability to hide fields from other modules. Objects with inheritance
enabled have information about their type at runtime so that the ``of`` operator
can be used to determine the object's type. The ``of`` operator is similar to
the ``instanceof`` operator in Java.
.. code-block:: nim
type
@@ -1595,7 +1595,7 @@ operator is similar to the ``instanceof`` operator in Java.
assert(student of Student) # is true
assert(student of Person) # also true
Object fields that should be visible from outside the defining module, have to
Object fields that should be visible from outside the defining module have to
be marked by ``*``. In contrast to tuples, different object types are
never *equivalent*, they are nominal types whereas tuples are structural.
Objects that have no ancestor are implicitly ``final`` and thus have no hidden
@@ -1637,7 +1637,7 @@ An example:
.. code-block:: nim
# This is an example how an abstract syntax tree could be modelled in Nim
# This is an example of how an abstract syntax tree could be modelled in Nim
type
NodeKind = enum # the different node types
nkInt, # a leaf with an integer value
@@ -1682,7 +1682,7 @@ The syntax of ``case`` in an object declaration follows closely the syntax of
the ``case`` statement: The branches in a ``case`` section may be indented too.
In the example, the ``kind`` field is called the `discriminator`:idx:\: For
safety its address cannot be taken and assignments to it are restricted: The
safety, its address cannot be taken and assignments to it are restricted: The
new value must not lead to a change of the active object branch. Also, when the
fields of a particular branch are specified during object construction, the
corresponding discriminator value must be specified as a constant expression.
@@ -1788,7 +1788,7 @@ In order to simplify structural type checking, recursive tuples are not valid:
Likewise ``T = ref T`` is an invalid type.
As a syntactical extension ``object`` types can be anonymous if
As a syntactical extension, ``object`` types can be anonymous if
declared in a type section via the ``ref object`` or ``ptr object`` notations.
This feature is useful if an object should only gain reference semantics:
@@ -1802,8 +1802,8 @@ This feature is useful if an object should only gain reference semantics:
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 module contains
further information.
``realloc`` can be used. The documentation of the `system <system.html>`_ module
contains further information.
Nil
@@ -1959,8 +1959,8 @@ Nim supports these `calling conventions`:idx:\:
the C ``__fastcall`` means.
`thiscall`:idx:
This is thiscall calling convention as specified by Microsoft, used on C++
class member functions on the x86 architecture
This is the thiscall calling convention as specified by Microsoft, used on
C++ class member functions on the x86 architecture.
`syscall`:idx:
The syscall convention is the same as ``__syscall`` in C. It is used for
@@ -2153,7 +2153,7 @@ conversions from ``string`` to ``SQL`` are allowed:
proc `%` (frmt: SQL, values: openarray[string]): SQL =
# quote each argument:
let v = values.mapIt(SQL, properQuote(it))
let v = values.mapIt(properQuote(it))
# we need a temporary type for the type conversion :-(
type StrSeq = seq[string]
# call strutils.`%`:
@@ -2424,7 +2424,7 @@ of the argument.
defined ``converter``.
These matching categories have a priority: An exact match is better than a
literal match and that is better than a generic match etc. In the following
literal match and that is better than a generic match etc. In the following,
``count(p, m)`` counts the number of matches of the matching category ``m``
for the routine ``p``.
@@ -2487,7 +2487,7 @@ into account:
pp(c, c)
Likewise for generic matches the most specialized generic type (that still
Likewise, for generic matches, the most specialized generic type (that still
matches) is preferred:
.. code-block:: nim
@@ -2640,7 +2640,7 @@ An empty ``discard`` statement is often used as a null statement:
Void context
------------
In a list of statements every expression except the last one needs to have the
In a list of statements, every expression except the last one needs to have the
type ``void``. In addition to this rule an assignment to the builtin ``result``
symbol also triggers a mandatory ``void`` context for the subsequent expressions:
@@ -2668,7 +2668,7 @@ variables of the same type:
a: int = 0
x, y, z: int
If an initializer is given the type can be omitted: the variable is then of the
If an initializer is given, the type can be omitted: the variable is then of the
same type as the initializing expression. Variables are always initialized
with a default value if there is no initializing expression. The default
value depends on the type and is always a zero in binary.
@@ -2699,14 +2699,14 @@ The implicit initialization can be avoided for optimization reasons with the
var
a {.noInit.}: array[0..1023, char]
If a proc is annotated with the ``noinit`` pragma this refers to its implicit
If a proc is annotated with the ``noinit`` pragma, this refers to its implicit
``result`` variable:
.. code-block:: nim
proc returnUndefinedValue: int {.noinit.} = discard
The implicit initialization can be also prevented by the `requiresInit`:idx:
The implicit initialization can also be prevented by the `requiresInit`:idx:
type pragma. The compiler requires an explicit initialization for the object
and all of its fields. However, it does a `control flow analysis`:idx: to prove
the variable has been initialized and does not rely on syntactic properties:
@@ -2844,7 +2844,7 @@ the ``:`` are executed. This goes on until the last ``elif``. If all
conditions fail, the ``else`` part is executed. If there is no ``else``
part, execution continues with the next statement.
In ``if`` statements new scopes begin immediately after
In ``if`` statements, new scopes begin immediately after
the ``if``/``elif``/``else`` keywords and ends after the
corresponding *then* block.
For visualization purposes the scopes have been enclosed
@@ -2886,7 +2886,7 @@ evaluated and if its value is in a *slicelist* the corresponding statements
(after the ``of`` keyword) are executed. If the value is not in any
given *slicelist* the ``else`` part is executed. If there is no ``else``
part and not all possible values that ``expr`` can hold occur in a
``slicelist``, a static error occurs. This holds only for expressions of
*slicelist*, a static error occurs. This holds only for expressions of
ordinal types. "All possible values" of ``expr`` are determined by ``expr``'s
type. To suppress the static error an ``else`` part with an
empty ``discard`` statement should be used.
@@ -2982,9 +2982,9 @@ within ``object`` definitions.
When nimvm statement
--------------------
``nimvm`` is a special symbol, that may be used as an expression of ``when nimvm``
statement to differentiate execution path between compile-time and the
executable.
``nimvm`` is a special symbol that may be used as the expression of a
``when nimvm`` statement to differentiate the execution path between
compile-time and the executable.
Example:
@@ -3001,12 +3001,12 @@ Example:
assert(ctValue == true)
assert(rtValue == false)
``when nimvm`` statement must meet the following requirements:
A ``when nimvm`` statement must meet the following requirements:
* Its expression must always be ``nimvm``. More complex expressions are not
allowed.
* It must not contain ``elif`` branches.
* It must contain ``else`` branch.
* It must contain an ``else`` branch.
* Code in branches must not affect semantics of the code that follows the
``when nimvm`` statement. E.g. it must not define symbols that are used in
the following code.
@@ -3072,7 +3072,7 @@ Example:
The block statement is a means to group statements to a (named) ``block``.
Inside the block, the ``break`` statement is allowed to leave the block
immediately. A ``break`` statement can contain a name of a surrounding
block to specify which block is to leave.
block to specify which block is to be left.
Break statement
@@ -3084,7 +3084,7 @@ Example:
break
The ``break`` statement is used to leave a block immediately. If ``symbol``
is given, it is the name of the enclosing block that is to leave. If it is
is given, it is the name of the enclosing block that is to be left. If it is
absent, the innermost block is left.
@@ -3102,7 +3102,7 @@ Example:
The ``while`` statement is executed until the ``expr`` evaluates to false.
Endless loops are no error. ``while`` statements open an `implicit block`,
Endless loops are no error. ``while`` statements open an `implicit block`
so that they can be left with a ``break`` statement.
@@ -3280,7 +3280,7 @@ A table constructor is syntactic sugar for an array constructor:
The empty table can be written ``{:}`` (in contrast to the empty set
which is ``{}``) which is thus another way to write as the empty array
which is ``{}``) which is thus another way to write the empty array
constructor ``[]``. This slightly unusual way of supporting tables
has lots of advantages:
@@ -3291,7 +3291,7 @@ has lots of advantages:
for arrays and the generated data section requires a minimal amount
of memory.
* Every table implementation is treated equally syntactically.
* Apart from the minimal syntactic sugar the language core does not need to
* Apart from the minimal syntactic sugar, the language core does not need to
know about tables.
@@ -3318,7 +3318,7 @@ Type conversion can also be used to disambiguate overloaded routines:
procVar("a")
Since operations on unsigned numbers wrap around and are unchecked so are
type conversion to unsigned integers and between unsigned integers. The
type conversions to unsigned integers and between unsigned integers. The
rationale for this is mostly better interoperability with the C Programming
language when algorithms are ported from C to Nim.
@@ -3383,8 +3383,8 @@ The unsafeAddr operator
-----------------------
For easier interoperability with other compiled languages such as C, retrieving
the address of a ``let`` variable, a parameter or a ``for`` loop variable, the
``unsafeAddr`` operation can be used:
the address of a ``let`` variable, a parameter, or a ``for`` loop variable can
be accomplished by using the ``unsafeAddr`` operation:
.. code-block:: nim
@@ -3937,7 +3937,8 @@ Multi-methods
**Note:** Starting from Nim 0.20, to use multi-methods one must explicitly pass
``--multimethods:on`` when compiling.
In a multi-method all parameters that have an object type are used for the dispatching:
In a multi-method, all parameters that have an object type are used for the
dispatching:
.. code-block:: nim
:test: "nim c --multiMethods:on $1"
@@ -3990,7 +3991,7 @@ Iterators and the for statement
The `for`:idx: statement is an abstract mechanism to iterate over the elements
of a container. It relies on an `iterator`:idx: to do so. Like ``while``
statements, ``for`` statements open an `implicit block`:idx:, so that they
statements, ``for`` statements open an `implicit block`:idx: so that they
can be left with a ``break`` statement.
The ``for`` loop declares iteration variables - their scope reaches until the
@@ -3999,9 +4000,9 @@ return type of the iterator.
An iterator is similar to a procedure, except that it can be called in the
context of a ``for`` loop. Iterators provide a way to specify the iteration over
an abstract type. A key role in the execution of a ``for`` loop plays the
``yield`` statement in the called iterator. Whenever a ``yield`` statement is
reached the data is bound to the ``for`` loop variables and control continues
an abstract type. The ``yield`` statement in the called iterator plays a key
role in the execution of a ``for`` loop. Whenever a ``yield`` statement is
reached, the data is bound to the ``for`` loop variables and control continues
in the body of the ``for`` loop. The iterator's local variables and execution
state are automatically saved between calls. Example:
@@ -4031,7 +4032,7 @@ the type of the i'th component. In other words, implicit tuple unpacking in a
for loop context is supported.
Implicit items/pairs invocations
-------------------------------
--------------------------------
If the for loop expression ``e`` does not denote an iterator and the for loop
has exactly 1 variable, the for loop expression is rewritten to ``items(e)``;
@@ -4090,7 +4091,7 @@ Closure iterators and inline iterators have some restrictions:
(but rarely useful) and ends the iteration.
3. Neither inline nor closure iterators can be (directly)* recursive.
4. Neither inline nor closure iterators have the special ``result`` variable.
5. Closure iterators are not supported by the js backend.
5. Closure iterators are not supported by the JS backend.
(*) Closure iterators can be co-recursive with a factory proc which results
in similar syntax to a recursive iterator. More details follow.
@@ -4301,7 +4302,7 @@ Example:
The statements after the ``try`` are executed in sequential order unless
an exception ``e`` is raised. If the exception type of ``e`` matches any
listed in an ``except`` clause the corresponding statements are executed.
listed in an ``except`` clause, the corresponding statements are executed.
The statements following the ``except`` clauses are called
`exception handlers`:idx:.
@@ -4387,7 +4388,7 @@ error message from ``e``, and for such situations, it is enough to use
Custom exceptions
-----------------
Is it possible to create custom exceptions. A custom exception is a custom type:
It is possible to create custom exceptions. A custom exception is a custom type:
.. code-block:: nim
type
@@ -4395,7 +4396,7 @@ Is it possible to create custom exceptions. A custom exception is a custom type:
Ending the custom exception's name with ``Error`` is recommended.
Custom exceptions can be raised like any others, e.g.:
Custom exceptions can be raised just like any other exception, e.g.:
.. code-block:: nim
raise newException(LoadError, "Failed to load data")
@@ -4588,7 +4589,7 @@ compatibility:
c = p # type error
For a routine ``p`` the compiler uses inference rules to determine the set of
For a routine ``p``, the compiler uses inference rules to determine the set of
possibly raised exceptions; the algorithm operates on ``p``'s call graph:
1. Every indirect call via some proc type ``T`` is assumed to
@@ -4603,7 +4604,7 @@ possibly raised exceptions; the algorithm operates on ``p``'s call graph:
raise ``system.Exception`` unless ``q`` has an explicit ``raises`` list.
4. Every call to a method ``m`` is assumed to
raise ``system.Exception`` unless ``m`` has an explicit ``raises`` list.
5. For every other call the analysis can determine an exact ``raises`` list.
5. For every other call, the analysis can determine an exact ``raises`` list.
6. For determining a ``raises`` list, the ``raise`` and ``try`` statements
of ``p`` are taken into consideration.
@@ -4626,14 +4627,14 @@ conservative in its effect analysis.
Exceptions inheriting from ``system.Defect`` are not tracked with
the ``.raises: []`` exception tracking mechanism. This is more consistent with the
built-in operations. The following code is valid::
built-in operations. The following code is valid:
.. code-block:: nim
proc mydiv(a, b): int {.raises: [].} =
a div b # can raise an DivByZeroDefect
And so is::
And so is:
.. code-block:: nim
@@ -4650,9 +4651,9 @@ with ``--panics:on`` Defects become unrecoverable errors.
Tag tracking
------------
The exception tracking is part of Nim's `effect system`:idx:. Raising an
exception is an *effect*. Other effects can also be defined. A user defined
effect is a means to *tag* a routine and to perform checks against this tag:
Exception tracking is part of Nim's `effect system`:idx:. Raising an exception
is an *effect*. Other effects can also be defined. A user defined effect is a
means to *tag* a routine and to perform checks against this tag:
.. code-block:: nim
:test: "nim c $1"
@@ -4700,7 +4701,7 @@ Generics are Nim's means to parametrize procs, iterators or types with
`type parameters`:idx:. Depending on the context, the brackets are used either to
introduce type parameters or to instantiate a generic proc, iterator, or type.
The following example shows a generic binary tree can be modeled:
The following example shows how a generic binary tree can be modeled:
.. code-block:: nim
:test: "nim c $1"
@@ -4998,7 +4999,7 @@ Open and Closed symbols
The symbol binding rules in generics are slightly subtle: There are "open" and
"closed" symbols. A "closed" symbol cannot be re-bound in the instantiation
context, an "open" symbol can. Per default overloaded symbols are open
context, an "open" symbol can. Per default, overloaded symbols are open
and every other symbol is closed.
Open symbols are looked up in two different contexts: Both the context
@@ -5106,8 +5107,8 @@ Typed vs untyped parameters
---------------------------
An ``untyped`` parameter means that symbol lookups and type resolution is not
performed before the expression is passed to the template. This means that for
example *undeclared* identifiers can be passed to the template:
performed before the expression is passed to the template. This means that
*undeclared* identifiers, for example, can be passed to the template:
.. code-block:: nim
:test: "nim c $1"
@@ -5129,12 +5130,12 @@ example *undeclared* identifiers can be passed to the template:
declareInt(x) # invalid, because x has not been declared and so it has no type
A template where every parameter is ``untyped`` is called an `immediate`:idx:
template. For historical reasons templates can be explicitly annotated with
template. For historical reasons, templates can be explicitly annotated with
an ``immediate`` pragma and then these templates do not take part in
overloading resolution and the parameters' types are *ignored* by the
compiler. Explicit immediate templates are now deprecated.
**Note**: For historical reasons ``stmt`` was an alias for ``typed`` and
**Note**: For historical reasons, ``stmt`` was an alias for ``typed`` and
``expr`` was an alias for ``untyped``, but they are removed.
@@ -5165,7 +5166,7 @@ In the example, the two ``writeLine`` statements are bound to the ``actions``
parameter.
Usually to pass a block of code to a template the parameter that accepts
Usually, to pass a block of code to a template, the parameter that accepts
the block needs to be of type ``untyped``. Because symbol lookups are then
delayed until template instantiation time:
@@ -5202,7 +5203,7 @@ type-checked:
Varargs of untyped
------------------
In addition to the ``untyped`` meta-type that prevents type checking there is
In addition to the ``untyped`` meta-type that prevents type checking, there is
also ``varargs[untyped]`` so that not even the number of parameters is fixed:
.. code-block:: nim
@@ -5237,7 +5238,7 @@ bound from the definition scope of the template:
echo genId() # Works as 'lastId' has been bound in 'genId's defining scope
As in generics symbol binding can be influenced via ``mixin`` or ``bind``
As in generics, symbol binding can be influenced via ``mixin`` or ``bind``
statements.
@@ -5245,7 +5246,7 @@ statements.
Identifier construction
-----------------------
In templates identifiers can be constructed with the backticks notation:
In templates, identifiers can be constructed with the backticks notation:
.. code-block:: nim
:test: "nim c $1"
@@ -5258,7 +5259,7 @@ In templates identifiers can be constructed with the backticks notation:
typedef(myint, int)
var x: PMyInt
In the example ``name`` is instantiated with ``myint``, so \`T name\` becomes
In the example, ``name`` is instantiated with ``myint``, so \`T name\` becomes
``Tmyint``.
@@ -5266,7 +5267,7 @@ Lookup rules for template parameters
------------------------------------
A parameter ``p`` in a template is even substituted in the expression ``x.p``.
Thus template arguments can be used as field names and a global symbol can be
Thus, template arguments can be used as field names and a global symbol can be
shadowed by the same argument name even when fully qualified:
.. code-block:: nim
@@ -5306,7 +5307,7 @@ But the global symbol can properly be captured by a ``bind`` statement:
Hygiene in templates
--------------------
Per default templates are `hygienic`:idx:\: Local identifiers declared in a
Per default, templates are `hygienic`:idx:\: Local identifiers declared in a
template cannot be accessed in the instantiation context:
.. code-block:: nim
@@ -5325,13 +5326,13 @@ template cannot be accessed in the instantiation context:
Whether a symbol that is declared in a template is exposed to the instantiation
scope is controlled by the `inject`:idx: and `gensym`:idx: pragmas: gensym'ed
symbols are not exposed but inject'ed are.
scope is controlled by the `inject`:idx: and `gensym`:idx: pragmas:
``gensym``'ed symbols are not exposed but ``inject``'ed symbols are.
The default for symbols of entity ``type``, ``var``, ``let`` and ``const``
is ``gensym`` and for ``proc``, ``iterator``, ``converter``, ``template``,
``macro`` is ``inject``. However, if the name of the entity is passed as a
template parameter, it is an inject'ed symbol:
template parameter, it is an ``inject``'ed symbol:
.. code-block:: nim
template withFile(f, fn, mode: untyped, actions: untyped): untyped =
@@ -5459,7 +5460,7 @@ Macros
======
A macro is a special function that is executed at compile time.
Normally the input for a macro is an abstract syntax
Normally, the input for a macro is an abstract syntax
tree (AST) of the code that is passed to it. The macro can then do
transformations on it and return the transformed AST. This can be used to
add custom language features and implement `domain-specific languages`:idx:.
@@ -5532,7 +5533,7 @@ The macro call expands to:
Arguments that are passed to a ``varargs`` parameter are wrapped in an array
constructor expression. This is why ``debug`` iterates over all of ``n``'s
constructor expression. This is why ``debug`` iterates over all of ``args``'s
children.
@@ -5540,7 +5541,7 @@ BindSym
-------
The above ``debug`` macro relies on the fact that ``write``, ``writeLine`` and
``stdout`` are declared in the system module and thus visible in the
``stdout`` are declared in the system module and are thus visible in the
instantiating context. There is a way to use bound identifiers
(aka `symbols`:idx:) instead of using unbound identifiers. The ``bindSym``
builtin can be used for that:
@@ -5588,8 +5589,8 @@ overloaded symbols implicitly.
Case-Of Macro
-------------
In Nim it is possible to have a macro with the syntax of a *case-of*
expression just with the difference that all of branches are passed to
In Nim, it is possible to have a macro with the syntax of a *case-of*
expression just with the difference that all *of-branches* are passed to
and processed by the macro implementation. It is then up the macro
implementation to transform the *of-branches* into a valid Nim
statement. The following example should show how this feature could be
@@ -5615,8 +5616,8 @@ used for a lexical analyzer.
return tkUnknown
**Style note**: For code readability, it is the best idea to use the least
powerful programming construct that still suffices. So the "check list" is:
**Style note**: For code readability, it is best to use the least powerful
programming construct that still suffices. So the "check list" is:
(1) Use an ordinary proc/iterator, if possible.
(2) Else: Use a generic proc/iterator, if possible.
@@ -5736,7 +5737,7 @@ generic param is omitted, ``typedesc`` denotes the type class of all types.
As a syntactic convenience, one can also use ``typedesc`` as a modifier.
Procs featuring ``typedesc`` params are considered implicitly generic.
They will be instantiated for each unique combination of supplied types
They will be instantiated for each unique combination of supplied types,
and within the body of the proc, the name of each param will refer to
the bound concrete type:
@@ -5750,7 +5751,7 @@ the bound concrete type:
var tree = new(BinaryTree[int])
When multiple type params are present, they will bind freely to different
types. To force a bind-once behavior one can use an explicit generic param:
types. To force a bind-once behavior, one can use an explicit generic param:
.. code-block:: nim
proc acceptOnlyTypePairs[T, U](A, B: typedesc[T]; C, D: typedesc[U])
@@ -5790,7 +5791,7 @@ concrete type or a type class.
echo "is float a number? ", isNumber(float)
echo "is RootObj a number? ", isNumber(RootObj)
Passing ``typedesc`` almost identical, just with the differences that
Passing ``typedesc`` is almost identical, just with the difference that
the macro is not instantiated generically. The type expression is
simply passed as a ``NimNode`` to the macro, like everything else.
@@ -5846,17 +5847,17 @@ Nim supports splitting a program into pieces by a module concept.
Each module needs to be in its own file and has its own `namespace`:idx:.
Modules enable `information hiding`:idx: and `separate compilation`:idx:.
A module may gain access to symbols of another module by the `import`:idx:
statement. `Recursive module dependencies`:idx: are allowed, but slightly
statement. `Recursive module dependencies`:idx: are allowed, but are slightly
subtle. Only top-level symbols that are marked with an asterisk (``*``) are
exported. A valid module name can only be a valid Nim identifier (and thus its
filename is ``identifier.nim``).
The algorithm for compiling modules is:
- compile the whole module as usual, following import statements recursively
- Compile the whole module as usual, following import statements recursively.
- if there is a cycle only import the already parsed symbols (that are
exported); if an unknown identifier occurs then abort
- If there is a cycle, only import the already parsed symbols (that are
exported); if an unknown identifier occurs then abort.
This is best illustrated by an example:
@@ -5886,8 +5887,8 @@ This is best illustrated by an example:
Import statement
~~~~~~~~~~~~~~~~
After the ``import`` statement a list of module names can follow or a single
module name followed by an ``except`` list to prevent some symbols to be
After the ``import`` statement, a list of module names can follow or a single
module name followed by an ``except`` list to prevent some symbols from being
imported:
.. code-block:: nim
@@ -5985,7 +5986,7 @@ There are two pseudo directories:
library. For example, the syntax ``import std / strutils`` is used to unambiguously
refer to the standard library's ``strutils`` module.
2. ``pkg``: The ``pkg`` pseudo directory is used to unambiguously refer to a Nimble
package. However, for technical details that lie outside of the scope of this document
package. However, for technical details that lie outside the scope of this document,
its semantics are: *Use the search path to look for module name but ignore the standard
library locations*. In other words, it is the opposite of ``std``.
@@ -6150,7 +6151,7 @@ then no locations are modified.
It is a static error to mark a proc/iterator to have no side effect if the compiler cannot verify this.
As a special semantic rule, the built-in `debugEcho
<system.html#debugEcho,varargs[typed,]>`_ pretends to be free of side effects,
<system.html#debugEcho,varargs[typed,]>`_ pretends to be free of side effects
so that it can be used for debugging routines marked as ``noSideEffect``.
``func`` is syntactic sugar for a proc with no side effects:
@@ -6262,8 +6263,8 @@ In the example, a tree structure is declared with the ``Node`` type. Note that
the type definition is recursive and the GC has to assume that objects of
this type may form a cyclic graph. The ``acyclic`` pragma passes the
information that this cannot happen to the GC. If the programmer uses the
``acyclic`` pragma for data types that are in reality cyclic, the memory leaks
can be the result, but memory safety is preserved.
``acyclic`` pragma for data types that are in reality cyclic, this may result
in memory leaks, but memory safety is preserved.
@@ -6438,7 +6439,7 @@ Syntactically it has to be used as a statement inside the loop:
vm()
As the example shows ``computedGoto`` is mostly useful for interpreters. If
As the example shows, ``computedGoto`` is mostly useful for interpreters. If
the underlying backend (C compiler) does not support the computed goto
extension the pragma is simply ignored.
@@ -6530,8 +6531,8 @@ The ``register`` pragma is for variables only. It declares the variable as
in a hardware register for faster access. C compilers usually ignore this
though and for good reasons: Often they do a better job without it anyway.
In highly specific cases (a dispatch loop of a bytecode interpreter for
example) it may provide benefits, though.
However, in highly specific cases (a dispatch loop of a bytecode interpreter
for example) it may provide benefits.
global pragma
@@ -6869,7 +6870,7 @@ For backward compatibility, if the argument to the ``emit`` statement
is a single string literal, Nim symbols can be referred to via backticks.
This usage is however deprecated.
For a toplevel emit statement the section where in the generated C/C++ file
For a top-level emit statement, the section where in the generated C/C++ file
the code should be emitted can be influenced via the
prefixes ``/*TYPESECTION*/`` or ``/*VARSECTION*/`` or ``/*INCLUDESECTION*/``:
@@ -7198,8 +7199,8 @@ will generate this C code:
.. code-block:: c
int progmem a
For procedures $1 is the return type of the procedure, $2 is the name of
the procedure and $3 is the parameter list.
For procedures, $1 is the return type of the procedure, $2 is the name of
the procedure, and $3 is the parameter list.
The following nim code:
@@ -7296,7 +7297,8 @@ Custom pragmas are defined using templates annotated with pragma ``pragma``:
template dbIgnore {.pragma.}
Consider stylized example of possible Object Relation Mapping (ORM) implementation:
Consider this stylized example of a possible Object Relation Mapping (ORM)
implementation:
.. code-block:: nim
const tblspace {.strdefine.} = "dev" # switch for dev, test and prod environments
@@ -7326,10 +7328,11 @@ Custom pragmas can be used in all locations where ordinary pragmas can be
specified. It is possible to annotate procs, templates, type and variable
definitions, statements, etc.
Macros module includes helpers which can be used to simplify custom pragma
access `hasCustomPragma`, `getCustomPragmaVal`. Please consult the macros module
documentation for details. These macros are not magic, everything they do can
also be achieved by walking the AST of the object representation.
The macros module includes helpers which can be used to simplify custom pragma
access `hasCustomPragma`, `getCustomPragmaVal`. Please consult the
`macros <macros.html>`_ module documentation for details. These macros are not
magic, everything they do can also be achieved by walking the AST of the object
representation.
More examples with custom pragmas:
@@ -7425,7 +7428,7 @@ will then be expected to come from C. This can be used to import a C ``const``:
assert cconst == 42
Note that this pragma has been abused in the past to also work in the
js backend for js objects and functions. : Other backends do provide
JS backend for JS objects and functions. Other backends do provide
the same feature under the same name. Also, when the target language
is not set to C, other pragmas are available:
@@ -7459,7 +7462,7 @@ The string literal passed to ``exportc`` can be a format string:
proc p(s: string) {.exportc: "prefix$1".} =
echo s
In the example the external name of ``p`` is set to ``prefixp``. Only ``$1``
In the example, the external name of ``p`` is set to ``prefixp``. Only ``$1``
is available and a literal dollar sign must be written as ``$$``.
If the symbol should also be exported to a dynamic library, the ``dynlib``
@@ -7538,7 +7541,7 @@ a static error. Usage with inheritance should be defined and documented.
Dynlib pragma for import
------------------------
With the ``dynlib`` pragma a procedure or a variable can be imported from
With the ``dynlib`` pragma, a procedure or a variable can be imported from
a dynamic library (``.dll`` files for Windows, ``lib*.so`` files for UNIX).
The non-optional argument has to be the name of the dynamic library:
@@ -7556,7 +7559,7 @@ The ``dynlib`` import mechanism supports a versioning scheme:
proc Tcl_Eval(interp: pTcl_Interp, script: cstring): int {.cdecl,
importc, dynlib: "libtcl(|8.5|8.4|8.3).so.(1|0)".}
At runtime the dynamic library is searched for (in this order)::
At runtime, the dynamic library is searched for (in this order)::
libtcl.so.1
libtcl.so.0
@@ -7589,14 +7592,14 @@ strings, because they are precompiled.
because of order of initialization problems.
**Note**: A ``dynlib`` import can be overridden with
the ``--dynlibOverride:name`` command-line option. The Compiler User Guide
contains further information.
the ``--dynlibOverride:name`` command-line option. The
`Compiler User Guide <nimc.html>`_ contains further information.
Dynlib pragma for export
------------------------
With the ``dynlib`` pragma a procedure can also be exported to
With the ``dynlib`` pragma, a procedure can also be exported to
a dynamic library. The pragma then has no argument and has to be used in
conjunction with the ``exportc`` pragma:
@@ -7673,7 +7676,7 @@ be used:
See also:
- `Shared heap memory management. <gc.html>`_.
- `Shared heap memory management <gc.html>`_.
Threadvar pragma
@@ -7686,7 +7689,7 @@ of the ``global`` pragma.
.. code-block:: nim
var checkpoints* {.threadvar.}: seq[string]
Due to implementation restrictions thread-local variables cannot be
Due to implementation restrictions, thread-local variables cannot be
initialized within the ``var`` section. (Every thread-local variable needs to
be replicated at thread creation.)

View File

@@ -204,7 +204,7 @@ Automatic dereferencing
=======================
Automatic dereferencing is performed for the first argument of a routine call.
This feature has to be only enabled via ``{.experimental: "implicitDeref".}``:
This feature has to be enabled via ``{.experimental: "implicitDeref".}``:
.. code-block:: nim
{.experimental: "implicitDeref".}

View File

@@ -124,7 +124,7 @@
## ``nim c -d:ssl ...``.
##
## Certificate validation is NOT performed by default.
## This will change in future.
## This will change in the future.
##
## A set of directories and files from the `ssl_certs <ssl_certs.html>`_
## module are scanned to locate CA certificates.

View File

@@ -12,8 +12,9 @@ Here is a short overview of the most commonly used functions from the
`system` module. Function names in the tables below are clickable and
will take you to the full documentation of the function.
The amount of available functions is much larger. Use the table of contents
on the left-hand side and/or `Ctrl+F` to navigate through this module.
There are many more functions available than the ones listed in this overview.
Use the table of contents on the left-hand side and/or `Ctrl+F` to navigate
through this module.
Strings and characters