diff options
author | Elliot Waite <elliot@elliotwaite.com> | 2021-01-25 05:59:19 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-01-25 14:59:19 +0100 |
commit | 0436a7cffd729187d63f3310c19dbf4b88f72c13 (patch) | |
tree | 6c46f3af81cb6ced058d1be7abaa62675c4ed247 | |
parent | 20993047ce05aaa1e7015d0db17995fed829da4a (diff) | |
download | Nim-0436a7cffd729187d63f3310c19dbf4b88f72c13.tar.gz |
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
-rw-r--r-- | doc/contributing.rst | 6 | ||||
-rw-r--r-- | doc/manual.rst | 229 | ||||
-rw-r--r-- | doc/manual_experimental.rst | 2 | ||||
-rw-r--r-- | lib/pure/httpclient.nim | 2 | ||||
-rw-r--r-- | lib/system_overview.rst | 5 |
5 files changed, 124 insertions, 120 deletions
diff --git a/doc/contributing.rst b/doc/contributing.rst index d1837ac14..07ab42081 100644 --- a/doc/contributing.rst +++ b/doc/contributing.rst @@ -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. diff --git a/doc/manual.rst b/doc/manual.rst index db72e199f..929aaec6a 100644 --- a/doc/manual.rst +++ b/doc/manual.rst @@ -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.) diff --git a/doc/manual_experimental.rst b/doc/manual_experimental.rst index a0cd9f636..02602d98d 100644 --- a/doc/manual_experimental.rst +++ b/doc/manual_experimental.rst @@ -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".} diff --git a/lib/pure/httpclient.nim b/lib/pure/httpclient.nim index 0ca3ca97b..b6e6ec0fe 100644 --- a/lib/pure/httpclient.nim +++ b/lib/pure/httpclient.nim @@ -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. diff --git a/lib/system_overview.rst b/lib/system_overview.rst index 2e437e596..5e4b171fe 100644 --- a/lib/system_overview.rst +++ b/lib/system_overview.rst @@ -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 |